😎
手軽に試せる! AWS SAMにおけるローカル環境でLambda関数にイベントを渡す方法
はじめに
AWS SAMを使った開発において、S3イベントがトリガーとなってLambda関数が呼ばれるケースを試してみたいと思い、調査したところ手軽に実現できる方法を見つけましたので、その方法をまとめました。今回はS3イベントを渡す方法について触れていますが、別のAWSサービスのイベントでも同様に渡すことは可能です。
実装のイメージ
下記イメージに基づいて実装します。
環境構築
以前記事でAWS SAMの環境構築について書いておりますので、こちらを参考にしてください。
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%
きちんとファイル名とバケット名が出力されているのを確認できました!
参考サイト
Discussion