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
関連記事
-
-
Backlogの実績工数をAmazon QuickSightで可視化してわかったこと
今年に入ってから、Backlogで個人タスクを登録しだして、予定工数、実績工数を …
-
-
百聞は一見にしかず!AWSセルフペースラボの無料ラボ!
※2019年5月12日現在に試してみた記録です。 AWSセルフペースラボとは A …
-
-
AWS CodeStarのプロジェクトテンプレートLambda+Pythonによって生成されるもの
勉強会のデモで、AWS CodeStarのプロジェクトテンプレートLambda+ …
-
-
Lambdaでちょっとしたコードを試すときに便利なエディタのフルスクリーン機能
Lambda歴6年で、はじめて使いました。 この存在に気がついてなかったです。 …
-
-
Route 53サブドメインホストゾーンを作成したら、元のホストゾーンにNSレコードを作成する自動化
ハンズオン環境でRoute 53のホストゾーンを触ってほしい際に、サブドメインを …
-
-
JAWS FESTA 2019 Sapporo 参加&当日スタッフ&企業サポーターで!
2019年のJAWS FESTA は札幌です! 今回もありがたいことに、所属して …
-
-
Amazon Route 53 Resolverを設定確認
Route 53 Resolverを設定しました。 東京リージョンのVPCをオン …
-
-
API Gatewayで顧客レベルの使用量プランを設定する
API GatewayのAPIキーを使って使用量プランでのスロットリングも設定し …
-
-
AWSルートユーザーのパスワード復旧
AWSルートユーザーのパスワード最設定は、メールアドレスだけでいいのですね。 M …
-
-
AWS Storage Gatewayボリュームゲートウェイを作成してWindowsから使用
ボリュームゲートウェイの作成 Storage Gateway作成メニューからボリ …
- PREV
- GitHub SSH接続 覚書
- NEXT
- 思っていることを口にしたらこうなった