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
関連記事
-
-
AWS BatchでPandocコンテナイメージを実行する
「ECR(Amazon Elastic Container Registry)に …
-
-
Amazon API Gatewayでモックを作る
超シンプルなAPI Gatewayのサンプルがほしかったので、ユーザーガイドの手 …
-
-
EFSをEC2(Amazon Linux 2)からマウントする
Amazon Elastic File Systemが東京リージョンに来たことも …
-
-
S3バケットポリシーで特定のVPCエンドポイント以外からのリクエストを拒否しつつメンテナンスはしたい
特定のVPCで実行されているEC2のアプリケーションからのリクエストだけを許可し …
-
-
CloudTrailイベントのコストしか発生していないリージョンのコスト発生源を調査しました
調査のきっかけ ふと検証用AWSアカウントのCostExplorerを見てました …
-
-
AWS CloudShellでboto3(SDK for Python)使うならpython3
本の執筆をしていて、ちょっとAWS CLIやSDKのふるまいを確認したいことがあ …
-
-
Cloud9のデフォルト設定での権限確認(AWS managed temporary credentials)
Cloud9の環境を作成した際のデフォルトアクセス権限は、環境を作成したIAMユ …
-
-
Amazon Aurora Serverless のログをCloudWatch Logsに出力する
WordPress W3 Total Cache のDatabaseCacheを …
-
-
Amazon BedrockがGAしたので触りました(boto3からも)
Amazon Bedrock Is Now Generally Availabl …
-
-
NGINXで500と502のエラーが実は頻発していたらしい
先日Mackerelで当ブログの外形監視を始めたのですが、500と502のエラー …
- PREV
- GitHub SSH接続 覚書
- NEXT
- 思っていることを口にしたらこうなった

