1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

S3へアップロードされたことをトリガーにzipファイルをLambdaを使って解凍しよう!

Last updated at Posted at 2024-05-10

概要

S3へzipファイルがアップロードされたことをトリガーにzipファイルを解凍するLambdaを作成する方法について解説していきたいと思います

前提

  • Pythonで解凍処理を作成します

Lambdaの作成

zipファイルを解凍するLambdaを新規作成します
スクリーンショット 2024-04-22 15.45.02.png

今回は基本的なLambdaアクセス権限で新しいロールを作成します
スクリーンショット 2024-05-10 13.46.47.png

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へ置く

権限を追加で付与します

スクリーンショット 2024-05-10 13.46.05.png

{
    "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の作成

zipファイルをアップロードするS3バケットを作成します
スクリーンショット 2024-04-22 15.50.28.png

スクリーンショット 2024-04-22 15.50.58.png

イベントの設定

ファイルのアップロードをトリガーにLambdaを実行できるよう、S3へイベントを設定します
スクリーンショット 2024-04-22 15.51.28.png

プロパティを選択します
スクリーンショット 2024-04-22 15.56.19.png

イベント通知を作成します
スクリーンショット 2024-04-22 15.56.29.png

イベント名とサフィックスを設定します
今回はzipファイルがアップロードされたことをトリガーにしたいので.zipを指定します
スクリーンショット 2024-04-22 15.57.46.png

イベントタイプにPOSTを指定します
スクリーンショット 2024-05-10 14.10.28.png

送信先に今回作成したLambdaを指定します
スクリーンショット 2024-04-22 15.59.03.png

以下のようにイベントが設定されていたら成功です
スクリーンショット 2024-05-10 14.12.40.png

実際にアップロードしてみよう!

作成したS3へzipファイルをアップロードします
スクリーンショット 2024-04-23 8.55.24.png

今回はimport_customer.zipというファイルをアップロードします
スクリーンショット 2024-05-10 14.05.20.png

以下のようにzipファイルの中身が展開されていたら成功です
スクリーンショット 2024-05-10 13.49.01.png

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?