【ハンズオン】S3にファイルをアップロードしたらLambda関数実行

プログラミング未経験者にも優しい超簡単なハンズオンをやってみた。

やりたいこと

S3にファイルをアップロードすると、ファイル名をログ出力するLambda関数を呼び出す。
※複数ファイルアップロードされた場合は最初の1ファイルだけ見る

手順

S3バケットを作成

バケット名:lambda-trigger-bucket-yyyymmdd
※それ以外の設定は既定

Lambda関数を作成

(一から作成)
関数名:PrintFileNameFunction
ランタイム:Python 3.13
※それ以外の設定は既定

アクセス権限(実行ロール)は既定の「基本的なLambdaアクセス権限で新しいロールを作成」となるため、関数の作成と共にIAMロール「PrintFileNameFunction-role-pytcu9vu」が新規作成された。
※Lambda関数の実行結果をCloudWatch Logsに出力するために必要な権限。

コードの書き換え

サンプルコード(lambda_function.py)が用意されている。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

以下に書き換えてデプロイする。

def lambda_handler(event, context):
    # S3の情報を取り出す
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    print(f"ファイルがアップロードされました: バケット = {bucket}, ファイル名 = {key}")
    return {
        'statusCode': 200,
        'body': 'Success'
    }

コードの解説

def lambda_handler(event, context)

lambda_handlerという名前の関数を定義している。

event「Lambda関数に渡されたデータ」
Lambdaが呼び出されたトリガーに関する情報。
S3がLambda関数に渡すイベント情報の構造は決まっていて、公式ドキュメントに記載されている。

context「Lambdaの実行環境に関する情報」
関数の実行時間、関数名、メモリサイズ、リクエストIDなどが入っている。

# S3の情報を取り出す
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']

S3から受け取ったイベント情報(※)からbucket(バケット名)とkey(ファイル名)を取り出す。
※複数ファイルを同時にアップロードされた場合に備えてリスト(配列)で記録されている。ここでは最初の要素(最初にアップロードされたファイルの情報)を取り出している。

print(f"ファイルがアップロードされました: バケット = {bucket}, ファイル名 = {key}")

print()はPythonで画面(ログ)出力したいときに使う関数。
※Lambdaではprint()の内容がCloudWatch Logsに出力される。

f""はフォーマット済み文字列。{} の中に変数や計算式を文字列に埋め込める(fを付け忘れると展開されずただの文字列になる)。

ここではバケット名とファイル名をログ出力している。

return {
    'statusCode': 200,   #HTTPステータスコード
    'body': 'Success'    #レスポンスの本文(なんでもOK)   
}

returnで戻り値を返す。
Lambdaではこの値が呼び出し元(今回の場合S3)に返される。

※呼び出し元がAPI Gatewayなどの場合に意味を持つ(返された値をHTTPレスポンスとしてクライアントに渡すなど)。
※S3の場合戻り値はあまり使われない(ログで判断することが多い)が、今回はお作法として記載しておく。

トリガーの設定

ソース:S3
バケット:作成したバケット(lambda-trigger-bucket-yyyymmdd)
イベントタイプ:PUT(ファイルのアップロード時)
※それ以外の設定は既定

今回はLamdaのコンソール(トリガー)から追加したが、S3のコンソール(イベント通知)からも同様の設定が可能。

実行

準備ができたので、S3バケットにファイル(hello2.txt)のアップロードを実施。

ログの確認

CloudWatchログを確認。
ファイルアップロード前には存在しなかったログストリームが記録された。

S3にファイルをアップロード前
S3にファイルをアップロードした後(2つあるのはテストしたため)

無事ファイル名がログに出力された。

参考

Process Amazon S3 event notifications with Lambda - AWS Lambda
Use Lambda to process event notifications from Amazon S3.
タイトルとURLをコピーしました