AWS Lambda (Golang) を API Gateway と一緒に使う

タイトル通り。

API Gateway で利用することを前提にしたコードなだけで、 API Gateway 側の設定とかは説明しない。

インターフェース

$ curl -XPOST -d '{"name": "mmyoji"}' http://<api gateway url>
'{"message": "Hello, mmyoji!"}'

みたいなのを作るとする。

口で説明すると、

  • name key を取る JSON を request body に入れて、 POST で API Gateway にリクエスト送る
  • message key に Hello, #{name}! が入った JSON が返ってくる

実装

package main

import (
	"context"
	"fmt"

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

type request struct {
	Name string `json:"name"`
}

type response struct {
	Message string `json:"message"`
}

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

func handler(ctx context.Context, req request) (response, error) {
	msg := fmt.Sprintf("Hello, %s!", req.Name)

	return response{msg}, nil
}

これだけ。

lambda.Start に渡す関数の引数はいくつかパターンがあるが、今回はリクエストに渡すデータを取るために request という構造体を定義して渡している。

context.Context はなくてもいいが、マナー的に渡している。

詳しくは別の記事を参考に。(丸投げ)

返り値は (response, error) となってて、 error が起きる可能性があれば、別途 return response{}, errors.New("hoge") とかする

Deploy

AWS Lambda 側で関数を作って(例えば hello-test という関数名)、ランタイムを Go 1.x にする。

ハンドラ名は handler とかで。(ここで登録したハンドラ名とバイナリファイルの名前が一致してないとだめらしいので気をつける)

# handler という名前の binary を build
$ GOOS=linux GOARCH=amd64 go build -o handler

# upload 用の zip ファイル作成
$ zip handler.zip ./handler

# aws cli でアップロード
# --dry-run オプションで dry run もできる
# web から直接ポチポチして upload してもおk
$ aws lambda update-function-code \
  --function-name hello-test \
  --zip-file fileb://handler.zip

以上。

これで Lambda 側でテストして動けば、 API Gateway 側の設定をして紐付ければ完成。

ポチポチするだけなので説明は省略

感想

もともと apex を利用していたが、こちらに置き換えたら余計なファイルやコードが減ってかなりスッキリした。

ローカルでテストする場合にどんな感じのテストコード書けばいいのかわかってない

参考

Contents