🚴
Go+Lambda+Dockerのローカル環境を構築する
サンプルコード
概要
Lambda開発の初期の頃はランタイムによる実装が主流でしたが、Dockerによる開発が増えてきました。
当記事ではローカル開発におけるLambda関数の構築方法をおさらいします。
Goサンプル
Goのコードは以下としておきます。
package main
import (
"context"
"github.com/aws/aws-lambda-go/lambda"
"log"
)
func Handler(ctx context.Context) error {
log.Println("Hello World.")
return nil
}
func main() {
lambda.Start(Handler)
}
Dockerfile
- Goビルド用Dockerfile
FROM golang:1.20.5-alpine
- Lambda実行用Dockerfile
FROM public.ecr.aws/lambda/provided:al2
COPY ./docker/lambda/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/main"]
- Lambda実行用entorypoint.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie "$@"
else
exec "$@"
fi
上記の定義を合わせてcomposeにまとめたものが以下となります。
version: '3.8'
services:
go-lambda-docker-lambda:
build:
context: .
dockerfile: ./docker/lambda/Dockerfile
image: go-lambda-docker-lambda
container_name: go-lambda-docker-lambda
volumes:
- $PWD/.bin/sample:/main
go-lambda-docker-go:
build:
context: .
dockerfile: ./docker/go/Dockerfile
image: go-lambda-docker-go
container_name: go-lambda-docker-go
working_dir: /workspace
volumes:
- $PWD:/workspace/
実行手順
続いて実行手順を紹介しましょう。
- GoのコンテナでGoをビルドし、
./.bin/sample
に配置します。
$ docker compose run --rm go-lambda-docker-go go build -o ./.bin/sample ./cmd/sample/main.go
- docker-compose.yamlの以下の箇所に注目してください。
volumes:
- $PWD/.bin/sample:/main
Goのアプリケーションを/main
にマウントします。
DockerfileでCMD ["/main"]
をしているのでこれで実行できます。
- ポート番号を指定し、実行します。
$ docker compose run -p 8080:8080 --rm go-lambda-docker-lambda
[+] Building 0.0s (0/0)
13 Jul 2023 07:38:22,637 [INFO] (rapid) exec '/main' (cwd=/var/task, handler=)
- Lambda実行用エンドポイントを指定します。
$ curl -i -XPOST http://localhost:8080/2015-03-31/functions/function/invocations -d '{}'
HTTP/1.1 200 OK
Date: Thu, 13 Jul 2023 07:38:34 GMT
Content-Length: 4
Content-Type: text/plain; charset=utf-8
null
- Dockerのコンテナに以下のログが流れていれば成功です。
2023/07/13 07:38:34 Hello World.
Discussion