ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

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/