AWS SAMでLambdaのみのFunctionを作成してみた
前回に引き続き、AWS SAMネタです。
sam init コマンドで作成されてるのはAPI Gateway + Lambdaという構成のテンプレートなのですが
Lambda単体で動かしたい or Lambdaと別のイベント(S3とかDynamoDBとか)を切っ掛けに動かしたいこともあるかと思います。
なのでsam initコマンドで作成したテンプレートを改修し、Lambda単体で動くFunctionを作成してみました。
以下、やってみた手順とソースです。
手順
既にsam initでプロジェクトが作成済の前提です。
1. プロジェクト内にフォルダを新たに作り、main.goファイルを作成する。
2. main.goを以下のように作成する。
package main import ( "context" "fmt" "time" "github.com/aws/aws-lambda-go/lambda" ) const timeFormat = "2006-01-02 15:04:05" const messageFormat = "Hello, now is %s!" // MyEvent ... type MyEvent struct { Name string `json:"name"` } // HandleRequest ... func HandleRequest(ctx context.Context) (string, error) { t := time.Now() message := createMessage(t) return message, nil } func createMessage(t time.Time) string { return fmt.Sprintf(messageFormat, t.Format(timeFormat)) } func main() { lambda.Start(HandleRequest) }
今回作成したのは現在日時を返すFunctionです。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html
こちらを元として作成しました。
3. (デプロイまで試すなら)template.ymlを修正して、追加したFunctionをデプロイ対象に加える。
4. Makefileを修正する。
sam init で作成したhello-world、今回作成したmy-eventの両方をビルドするようにしました。
.PHONY: deps clean build all: deps clean build deps: go get -u github.com/aws/aws-lambda-go/events go get -u github.com/aws/aws-lambda-go/lambda clean: rm -rf ./hello-world/hello-world rm -rf ./my-event/my-event build: GOOS=linux GOARCH=amd64 go build -o hello-world/hello-world ./hello-world GOOS=linux GOARCH=amd64 go build -o my-event/my-event ./my-event
5. テストを作成する
main_test.goを作成し、以下のようなテストメソッドを作成しました。
mainの中身とそのままですがw、メッセージを作成する内部処理をテストしています。
package main import ( "fmt" "testing" "time" ) func TestCreateMessage(t *testing.T) { now := time.Now() message := createMessage(now) expect := fmt.Sprintf(messageFormat, now.Format(timeFormat)) if message != expect { t.Fatal("createMessage Failed.") } }
6. ローカルでの実行
ビルドして、ローカルでLambdaを実行してみます。
$ make $ sam local generate-event cloudwatch scheduled-event > my-event.json $ sam local invoke MyEventFunction --event my-event.json
7. テストの実行
go test -v ./my-event/
参考サイト
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-generate-event.html