0
1

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バケットへのアップロードをトリガーにLambdaを実行する構成を試してみた

0
Last updated at Posted at 2025-06-19

はじめに

いきなり余談ですが、木曜日って1週間の疲れがピークに達するタイミングですよね…。そんな中でもなんとか気合いを入れてアウトプットしていきます!(※頑張れ自分!!

今回は、S3バケットにファイルがアップロードされたことをトリガーにLambda関数を実行する構成を構築してみました。

AWSのサーバーレス構成の基礎的な組み合わせであり、さまざまな場面で応用可能なパターンです。

内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです...!

書こうと思ったきっかけ

S3バケットにファイルがアップロードされたことをトリガーに、AWS Lambda関数を自動実行する仕組みを今まで技術検証したことがなかったので、手軽に試してみようと思いました。

こんな感じのよく見る構成です!!

Screenshot 2025-06-19 at 22.41.28.png

引用画像:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example.html

ファイル処理や通知など、将来的に応用できそうな構成でもあるため、一度しっかり動かして理解しておきたいと思い、未来の自分に向けて整理してみました!

似たような検証として、S3にホストされた静的ページのURLをLambda関数が返し、そのURLをもとにユーザーにウェブページを表示する、という構成は以前に試したことがありました!

実際にやってみた

1. S3バケットの作成

AWSマネジメントコンソールまたはCLIでバケット(例:my-upload-bucket-honda)を作成します。

aws s3 mb s3://my-upload-bucket-honda

想定通り作成されていることが確認できました!

Screenshot 2025-06-19 at 22.44.48.png

2. Lambda関数の作成

S3イベントを受け取り、バケット名とファイル名をログに出力するシンプルなPythonコードを用意しました。

import json

def lambda_handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        print(f"S3バケット: {bucket}, アップロードファイル: {key}")
    return {
        'statusCode': 200,
        'body': json.dumps('S3トリガー受信完了')
    }

実際にコードを貼り付けたあとは、下図の赤枠で示した「デプロイ」ボタンをクリックして反映してください!

Screenshot 2025-06-19 at 22.46.24.png

IAMロールにはS3アクセス権限とCloudWatchログ出力権限を付与が必要なので、この後解説します。

IAMロールの変更

今回の構成で必要となる主な権限は以下の通りです:

  • S3アクセス権限:S3バケットに関する情報を取得(読み取り)する
  • CloudWatch Logs権限:Lambda関数のログをCloudWatchに出力する

補足:IAMロールの作成手順(マネジメントコンソール)

「ポリシーのアタッチ」画面で以下を選択:

  • AmazonS3ReadOnlyAccess
  • CloudWatchLogsFullAccess(※実際の運用では最小権限に調整推奨)

作成したロールをLambda関数にアタッチしてください!

Screenshot 2025-06-19 at 22.49.44.png

本番運用では CloudWatchLogsFullAccessAmazonS3ReadOnlyAccess のような広い権限ではなく、以下のように必要なアクションのみに絞ったカスタムポリシーを作成して付与してください!

3. S3トリガーの設定

Lambda関数のトリガーとしてS3を設定。イベントタイプは「オブジェクト作成(すべて)」。

CLIからLambda関数への呼び出し権限をS3に付与:

aws lambda add-permission \
  --function-name my-upload-bucket \
  --principal s3.amazonaws.com \
  --statement-id AllowS3Invoke \
  --action "lambda:InvokeFunction" \
  --source-arn arn:aws:s3:::my-upload-bucket-honda

想定通り設定が反映されていることが確認できました!

Screenshot 2025-06-19 at 22.54.50.png

補足:S3のイベント通知設定について

Lambda関数に対して aws lambda add-permission コマンドを実行するだけでは、S3からのイベントで自動的にLambdaが実行されるようにはなりません。

このコマンドはあくまで「S3がLambdaを呼び出すことを許可する」ためのものであり、S3側にも明示的なイベント通知設定が必要です。

S3 側の設定手順

以下のCLIコマンドを使用して、S3バケットにイベント通知を設定します。

aws s3api put-bucket-notification-configuration \
  --bucket my-upload-bucket-honda \
  --notification-configuration '{
    "LambdaFunctionConfigurations": [
      {
        "LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:xxx:function:my-upload-bucket",
        "Events": ["s3:ObjectCreated:*"]
      }
    ]
  }'

この設定により、my-upload-bucket-honda バケットにファイルがアップロードされるたびに、指定したLambda関数が実行されるようになります。

私はこんな感じで、CloudShell 上から実行してみました!

Screenshot 2025-06-19 at 22.57.03.png

注意点

  • Lambda関数のARNは、実際の関数に合わせて変更してください。
  • バケット名もご自身のものに置き換えてください。

アップロードして確認してみた

テストファイルをS3にアップロードして、CloudWatch Logsに出力されるか確認していきます。

echo "test" > test.txt
aws s3 cp test.txt s3://my-upload-bucket-honda/

こちらも CloudShell 上で一度実行したうえで、マネジメントコンソールから確認したところ、問題なくアップロードされていることが確認できました!

実際のマネコン画面

Screenshot 2025-06-19 at 22.59.40.png

アップロードと同時にLambdaが自動実行されていることも確認できました!

Screenshot 2025-06-19 at 23.01.12.png

最後に CloudWatch のログも確認しましたが、想定通りファイル名がログに出力されていました。

Screenshot 2025-06-19 at 23.03.27.png

まとめ

ここまで読んでいただき、ありがとうございました!S3とLambdaの連携は簡単に実現できることがわかりました(今までやったことなかったのが謎...)。

また、IAMロールの設定や、Lambda関数に対するトリガー許可の設定など、権限まわりの仕組みについても理解を深める良い検証となりました。

この週末は、CSV処理や画像サムネイル生成など、実用的なLambda処理に発展させてみようと思います...!!

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?