😎

手軽に試せる! AWS SAMにおけるローカル環境でLambda関数にイベントを渡す方法

2023/07/22に公開

はじめに

AWS SAMを使った開発において、S3イベントがトリガーとなってLambda関数が呼ばれるケースを試してみたいと思い、調査したところ手軽に実現できる方法を見つけましたので、その方法をまとめました。今回はS3イベントを渡す方法について触れていますが、別のAWSサービスのイベントでも同様に渡すことは可能です。

実装のイメージ

下記イメージに基づいて実装します。

環境構築

以前記事でAWS SAMの環境構築について書いておりますので、こちらを参考にしてください。
https://zenn.dev/tamakiiii/articles/123753184f10b9#開発

S3のputイベントを作成

今回はS3のputイベントを作成します。

$ sam local generate-event s3 put | tee events/s3-event.json

sam local generate-event s3 putを使用すれば、生成されたイベントが画面出力されますが、ファイル出力を行うこともおすすめです!ファイル出力を行うことで、より詳細な内容を確認できます。

以下が作成されたS3のputイベントの内容です。

event/s3-event.json
{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "example-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::example-bucket"
        },
        "object": {
          "key": "test/key",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

参考コマンド

サンプルイベントを作成するときのお助けコマンド

サンプルイベント作成

サービスとイベントにお好きなものを指定します。

$ sam local generate-event <service> <event>

どのサービスが使用可能か知りたい場合

$ sam local generate-event -h

どのイベントが使用可能か知りたい場合

$ sam local generate-event <service> -h

サンプルイベントの一部変更したい場合

サンプルイベントを変更するにはオプションをまず確認します。
確認コマンドの形式は下記になります。

$ sam local generate-event <service> <event> -h

例えばs3のputイベントを変更したい場合、下記コマンドを入力します。

$ sam local generate-event s3 put -h 

Usage: sam local generate-event s3 put [OPTIONS]

Options:
  --region TEXT       Specify the region name you'd like, otherwise the default = us-east-1
  --partition TEXT    Specify the partition name you'd like, otherwise the default = aws
  --bucket TEXT       Specify the bucket name you'd like, otherwise the default = example-bucket
  --key TEXT          Specify the key name you'd like, otherwise the default = test/key
  --debug             Turn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.
  --config-file TEXT  Configuration file containing default parameter values.  [default: samconfig.toml]
  --config-env TEXT   Environment name specifying default parameter values in the configuration file.  [default:
                      default]
  -h, --help          Show this message and exit.

オプションから変更できるものがリスト表示されるので、そこから説明に沿って入力します。
バケット名を変更したい場合はこちらを入力します。

$ sam local generate-event s3 put --bucket MyBucket | tee events/s3-event.json

Lambda関数を作成

作成したJSONを見ると、リクエストされる値が多いため、S3バケット名[s3.bucket.name]とアップロードされたファイル名[s3.object.key]の情報だけを取得するように実装します。

s3-event.json
{
  "Records": [
    {
      (省略)
      "s3": {
        "s3SchemaVersion": "1.0",
        "bucket": {
          "name": "example-bucket",
	  (省略)
        },
        "object": {
          "key": "test/key",
	  (省略)
        }
      }
    }
  ]
}

呼び出されるLambda関数は下記の内容です。

main.go
package main

import (
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(s3Event events.S3Event) {
	for _, record := range s3Event.Records {
		fmt.Printf("bucket=%v\n", record.S3.Bucket.Name)
		fmt.Printf("file=%v\n", record.S3.Object.Key)
	}

}

func main() {
	lambda.Start(handler)
}

Lambda関数の呼び出しテスト

ビルドしてからテストします。

$ sam build
$ sam local invoke -e events/s3-event.json HelloWorldFunction

START RequestId: cb8e34df-0483-4f9b-87bf-4650e6690ed7 Version: $LATEST
bucket=example-bucket
file=test/key
END RequestId: cb8e34df-0483-4f9b-87bf-4650e6690ed7
REPORT RequestId: cb8e34df-0483-4f9b-87bf-4650e6690ed7  Init Duration: 0.03 ms  Duration: 147.13 ms     Billed Duration: 148 ms Memory Size: 128 MB    Max Memory Used: 128 MB
null%

きちんとファイル名とバケット名が出力されているのを確認できました!

参考サイト

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/using-sam-cli-local-generate-event.html

Discussion