ヤサイブログ

徒然と

(AWS)S3 SelectがGAされたようなので早速Lambdaから呼んでみた

本エントリーは下記環境で検証しています。

Lambda ランタイム Python 3.6
boto3 バージョン 1.7.4


S3 SelectがGAになりましたね!
aws.amazon.com


しかしながら、やってみた系サイトの情報はプレビュー版が多く、
GAだと仕様が変わっているので注意が必要です。詳しくはboto3公式を参照。
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.select_object_content

コード例

        s3test = boto3.client('s3')
        s3SelectResponse = s3test.select_object_content(
            Bucket=env_s3_bucketName,
            Key=key,
            ExpressionType='SQL',
            Expression="select * from s3object s",
            InputSerialization={
                'CSV': {
                    "FileHeaderInfo": "NONE",
                    'RecordDelimiter': '\n',
                    'FieldDelimiter': ',',
                }
            },
            OutputSerialization={
                'CSV': {
                    'RecordDelimiter': '\n',
                    'FieldDelimiter': ',',
                }
            },
        )

        for event in s3SelectResponse['Payload']:
            if 'Records' in event:
                records = event['Records']['Payload'].decode('utf-8')
                print('s3SelectTestRecord:%s' % records)
            elif 'Stats' in event:
                statsDetails = event['Stats']['Details']
                print("Stats details bytesScanned: ")
                print(statsDetails['BytesScanned'])
                print("Stats details bytesProcessed: ")
                print(statsDetails['BytesProcessed'])

所感

結局のところRecordsのPayloadを取り出す時に改行コードでsplitしなきゃいけないので、
この辺りをもうちょっと改善できると使いやすいんですが、いい方法を考えたいですね。
マネージメントコンソールからクエリー投げれるところが気に入りました!JSONもいけるようです。

以上です!