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
関連記事
-
-
IAMアイデンティティセンター(IIC)のList Assignment APIを確認しました
やりたいことは、IAMアイデンティティセンター(IIC)のユーザー名をキーにして …
-
-
AWS Toolkit for EclipseからLambda関数を直接作成できずにMavenでパッケージ化して作成
AWS Toolkit for EclipseからLambda関数を直接作成 チ …
-
-
AWS BatchでPandocコンテナイメージを実行する
「ECR(Amazon Elastic Container Registry)に …
-
-
テキストをAmazon PollyでMP3に変換してS3に格納(AWS Lambda Python)
Google Calendar Twilio ReminderのテキストをAma …
-
-
Lambdaバージョンとエイリアスとトリガー
Lambdaのバージョン、エイリアスにはそれぞれ別のトリガーが設定できます。 上 …
-
-
Cloud9でSAMローカルテスト
せっかくテストするので、Amazon CloudSearchからAmazon E …
-
-
S3をトリガーにしたときのLambdaのリソースベースポリシー
LambdaのトリガーでS3を設定したとき、自動的にLambdaのリソースベース …
-
-
EC2スケジュールリザーブドインスタンスって終わりましたん?
ユーザーガイドのScheduled Reserved Instancesを見ると …
-
-
Lambda関数で自分自身の環境変数を更新する
Twitterでツイート検索するAPIを試してみるでツイートの取得を重複させない …
-
-
AWSアカウントの解約
アカウント作成メニュー確認のために作成したAWSアカウントを解約しました。 使っ …
- PREV
- GitHub SSH接続 覚書
- NEXT
- 思っていることを口にしたらこうなった