AWS LambdaでS3 Select
2020/06/06
RDSスナップショットをS3にエクスポートした、ParquetフォーマットのデータにAWS LambdaでS3 Selectを実行してみました。
ParquetフォーマットのデータにS3 Select SQLを実行するでマネジメントコンソールで試したことをAWS Lambda(Python)から実行しました。
目次
実行したコードと結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import json import boto3 bucket_name = 'xxxxxxxxxxxxxx' object_key = 'xxxxxxxxxxxxxxxxxx.gz.parquet' def lambda_handler(event, context): s3 = boto3.client('s3') for year in range(2014, 2021): response = s3.select_object_content( Bucket=bucket_name, Key=object_key, InputSerialization={ 'Parquet': {} }, OutputSerialization={ 'JSON': {} }, Expression='select count(*) from s3object where "post_type" = \'post\' and substring(to_string("post_date", \'y-MM-dd\'\'T\'\'H:m:ssX\'), 1, 4) = \'{year}\' '.format( year=str(year) ), ExpressionType='SQL' ) for event_stream in response['Payload']: if 'Records' in event_stream: print(str(year)) print(event_stream['Records']['Payload']) |
結果出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
2014 b'{"_1":41}\n' 2015 b'{"_1":91}\n' 2016 b'{"_1":80}\n' 2017 b'{"_1":118}\n' 2018 b'{"_1":120}\n' 2019 b'{"_1":56}\n' 2020 b'{"_1":112}\n' |
元データはこのブログのRDSスナップショットですので、年間記事件数を出してみました。
過去最高は2018年の120本で、今年はすでに110本を超えてますので、過去最高になりそうです。
去年がサボりすぎでしたので反省。
IAMロールの権限
S3は対象オブジェクトに対してのGetObjectがselectリクエストには必要です。
他は、RDSスナップショットのエクスポート時にKMSで暗号化してましたので、KMSへの権限も必要です。
ですので、AWS管理ポリシーのAWSLambdaBasicExecutionRoleと、以下の2つのインラインポリシーを設定しました。
s3:GetObject
selectの実行にListBucketは必要ありませんが、指定したオブジェクトが見つからない場合に「An error occurred (NoSuchKey) when calling the SelectObjectContent operation: The specified key does not exist.」を出力するためです。
ListBucketがないと、「An error occurred (AccessDenied) when calling the SelectObjectContent operation: Access Denied」となってしまい切り分けが難しくなります。
bucketname/*としてますが、もちろん特定のプレフィックスやオブエジェクトでもOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucketname/*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::bucketname" } ] } |
kms:Decrypt
暗号化に使ったキーを指定しています。
1 2 3 4 5 6 7 8 9 10 11 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxxxxxxxxx" } ] } |
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
Cloud9 Python3でpipも3にする
このブログは、2019/10/20に書いた、 Cloud9のAMIがCloud9 …
-
-
S3 Intelligent-Tieringのオブジェクトの階層移動をCloudWatchメトリクスで確認
CloudWatchメトリクスの保存期間は現時点で15ヶ月(455日)なのでそろ …
-
-
AWSアカウント内のすべてのS3バケットを削除するLambda(Python)
やりたいこと 特定アカウント内のS3バケットを全部削除したいです。 バケット内の …
-
-
AWS DeepLensセットアップの儀
AWS DeepLensのセットアップを開始します。 AWS DeepLensを …
-
-
Amazon FSx for Lustreのユーザーガイド入門演習
ファイルシステムの作成 FSx for Lustreを選択しました。 容量やスル …
-
-
AWS認定試験の自宅受験で壁のポスターを注意されちゃいました
AWS認定オンライン受験をしてみましたに書きましたとおり、自宅受験デビューしまし …
-
-
EC2 Instance Connect エンドポイントの作成
このブログのSystems Managerは機能としてセッションマネージャーしか …
-
-
AWS Organizations SCPがリソースベースのポリシーには影響しないことを確認
AWS Organizations SCPで許可ポリシーの設定をし継承の関係を確 …
-
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
-
cfn-initでEC2インスタンスにPHPをインストールしWebサーバーを起動する
AWS CloudFormation による Amazon EC2 へのアプリケ …
- PREV
- GitHub SSH接続 覚書
- NEXT
- 思っていることを口にしたらこうなった