S3ファイルをまとめてダウンロードできる環境を作る の続きになります。
追加仕様
設定情報をLambda内ではなくテストイベントに保存する。
そうすることでコードを修正することなく何パターンも設定を作ることができる。
テストイベントの作成
- テストイベントの設定
- 新しいテストイベントの作成
- イベント名は適当にわかりやすい名前にする
- テストコードとPythonコードを修正する
json
{
"s3": {
"in": {
"bucket": "s3inbucket",
"prefix": "hoge/neko/",
"extension": ".jpg",
"max": 1000,
"marker": ""
},
"out": {
"bucket": "s3outbucket",
"dir": "out/",
"filenmae": "archive"
}
}
}
Pythonコード
lambda_function.py
import boto3
import tarfile
import os
s3_client = boto3.client('s3')
def lambda_handler(event, context):
response = s3_client.list_objects(Bucket=event['s3']['in']['bucket'], Prefix=event['s3']['in']['prefix'], MaxKeys=event['s3']['in']['max'], Marker=event['s3']['in']['marker'])
if 'Contents' not in response:
return
s3_files = [c['Key'] for c in response['Contents'] if c['Key'].endswith(event['s3']['in']['extension'])]
if s3_files:
get_s3_files(event, s3_files)
create_archive(event)
return s3_files
def get_s3_files(event, s3_files):
for s3_file in s3_files:
basename = os.path.basename(s3_file)
tmp_file = os.path.join('/tmp/', basename)
s3_client.download_file(event['s3']['in']['bucket'], s3_file, tmp_file)
def create_archive(event):
out_file = os.path.join(event['s3']['out']['dir'], event['s3']['out']['filenmae'] + '.tar.gz')
archive_file = os.path.join('/tmp/', event['s3']['out']['filenmae'] + '.tar.gz')
archive = tarfile.open(archive_file, mode='w:gz')
archive.add('/tmp/', arcname=event['s3']['out']['filenmae'])
archive.close()
s3_client.upload_file(archive_file, event['s3']['out']['bucket'], out_file)
print('output ' + event['s3']['out']['bucket'] + ':' + out_file)