概要
S3へzipファイルがアップロードされたことをトリガーにzipファイルを解凍するLambdaを作成する方法について解説していきたいと思います
前提
- Pythonで解凍処理を作成します
Lambdaの作成
今回は基本的なLambdaアクセス権限で新しいロールを作成します
zipファイルを解凍する処理の作成
まず、S3へzipがアップロードされたことをトリガーに解凍処理をするので最初にeventから
- バケット
- オブジェクトキー
を取得します
次に解凍処理を実行するための一時フォルダを作成します
S3からZIPファイルをダウンロードし、一時フォルダに格納します
一時フォルダ内でZIPファイルからファイルを全て展開した後に一時ファイル内のZIPファイル以外のファイルをS3バケットへアップロードします
Lambdaの実行が完了したら一時ファイルは自動的に削除されます
import boto3
import zipfile
import os
import tempfile
s3_client = boto3.client('s3')
def lambda_handler(event, context):
bucket_name = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
with tempfile.TemporaryDirectory() as tmpdir:
download_path = os.path.join(tmpdir, os.path.basename(key))
s3_client.download_file(bucket_name, key, download_path)
with zipfile.ZipFile(download_path, 'r') as zip_ref:
zip_ref.extractall(tmpdir)
for file in os.listdir(tmpdir):
if file != os.path.basename(key):
s3_client.upload_file(os.path.join(tmpdir, file), bucket_name, file)
ロールの修正
Lambdaを使ってzipファイルを解凍するのでS3バケットへの
- オブジェクトのS3から取得
- オブジェクトをS3へ置く
権限を追加で付与します
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup"
],
"Resource": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:log-group:/aws/lambda/shun198-unzip-files-in-s3:*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::shun198-unzip-zip-file/*"
}
]
}
S3の作成
イベントの設定
ファイルのアップロードをトリガーにLambdaを実行できるよう、S3へイベントを設定します
イベント名とサフィックスを設定します
今回はzipファイルがアップロードされたことをトリガーにしたいので.zipを指定します
実際にアップロードしてみよう!
今回はimport_customer.zipというファイルをアップロードします
参考