AWS Lambda (Golang) を API Gateway と一緒に使う
by mmyoji
2 min read
タイトル通り。
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 を利用していたが、こちらに置き換えたら余計なファイルやコードが減ってかなりスッキリした。
ローカルでテストする場合にどんな感じのテストコード書けばいいのかわかってない