aws lambdaでGo
アドベントカレンダー5日目です。
Goはaws lambdaで正式にサポートされていましたが、Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するに伴い、Go 用ランタイムもサポートが終了してしまいます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html
そのため、これからはprovided.al2
イメージ上に作成する必要があります。
Dockerfile作成
touch app/day5/Dockerfile
touch app/day5/main.go
day5
を独立したモジュールとしたいため、初期化しておきます。
cd app/day5
got mod init github.com/shuyaeer/learn-go/app/day5
Dockerfileです。ビルドしたバイナリをprovided:al2
上で実行しています。
FROM golang:latest as build
WORKDIR /app
COPY go.mod go.sum ./
COPY main.go .
RUN go build -tags lambda.norpc -o main main.go
FROM public.ecr.aws/lambda/provided:al2
COPY --from=build /app/main ./main
ENTRYPOINT [ "./main" ]
メインのプログラムです。シンプルに文字列を返すものにしました。
package main
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
response := events.APIGatewayProxyResponse{
StatusCode: 200,
Body: "\"Hello from Lambda!\"",
}
return response, nil
}
func main() {
lambda.Start(handler)
}
ビルド
docker build -t lambda-go-sample:test .
ローカルでlambdaを実行するためのエミュレータをインストール
mkdir aws-lambda-rie
curl -Lo aws-lambda-rie/aws-lambda-rie \
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie
chmod +x aws-lambda-rie/aws-lambda-rie
コンテナ起動
$ docker run -v `pwd`/aws-lambda-rie:/aws-lambda \
-p 9000:8080 --entrypoint /aws-lambda/aws-lambda-rie \
lambda-go-sample:test ./main
05 Dec 2023 14:52:33,937 [INFO] (rapid) exec './main' (cwd=/var/task, handler=)
05 Dec 2023 14:52:59,385 [INFO] (rapid) INIT START(type: on-demand, phase: init)
05 Dec 2023 14:52:59,390 [INFO] (rapid) The extension's directory "/opt/extensions" does not exist, assuming no extensions to be loaded.
START RequestId: cf4d9fad-94cd-4731-aa8c-a38f774d384d Version: $LATEST
05 Dec 2023 14:52:59,394 [INFO] (rapid) Starting runtime without AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN , Expected?: false
05 Dec 2023 14:52:59,475 [INFO] (rapid) INIT RTDONE(status: success)
05 Dec 2023 14:52:59,475 [INFO] (rapid) INIT REPORT(durationMs: 92.176000)
05 Dec 2023 14:52:59,477 [INFO] (rapid) INVOKE START(requestId: c97ef940-dce9-4b25-881a-dbb5eee68382)
05 Dec 2023 14:52:59,525 [INFO] (rapid) INVOKE RTDONE(status: success, produced bytes: 0, duration: 46.652000ms)
別ターミナルからリクエストを送ってみます。
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}' | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 92 100 90 100 2 4754 105 --:--:-- --:--:-- --:--:-- 6571
{
"statusCode": 200,
"headers": null,
"multiValueHeaders": null,
"body": "\"Hello from Lambda!\""
}
よさそうです。