AWSで公開されているgolangのLambdaコンテナイメージを動かしてみました。
パッケージの構成
├── docker
│ └── lambda-go-test
│ └── Dockerfile
├── docker-compose.yml
└── lambda
├── go.mod
├── go.sum
├── main
├── main.go
└── pkg
Dockerファイル作成
こちらを参考にDockerファイル等を作成。
FROM public.ecr.aws/lambda/go:1
# Copy function code
COPY ../../lambda ${LAMBDA_TASK_ROOT}
WORKDIR ${LAMBDA_TASK_ROOT}
# golangをinstall
RUN yum install -y golang
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "main" ]
docker-compose.ymlは以下のように作りました。
version: '3'
services:
lambda-go-test:
container_name: lambda-go-test
build:
context: .
dockerfile: ./docker/lambda-go-test/Dockerfile
volumes:
- ./lambda:/var/task # ${LAMBDA_TASK_ROOT}は/var/taskだったので/var/taskを指定.
ports:
- 9000:8080
golangファイル作成
package main
import(
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type Request struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
func requestHandler(ctx context.Context, req Request) (string, error) {
return fmt.Sprintf(
"Hello %s %s",
req.LastName,
req.FirstName,
), nil
}
func main() {
lambda.Start(requestHandler)
}
dockerをbuildして立ち上げ
$ docker-compose build
$ docker-compose up -d
# 初回なのでdockerコンテナ内に入って「go mod init」と「go get」
$ docker exec -it lambda-go-test bash
# ----- コンテナ内 -----
bash# pwd
/var/task
# go mod init
bash# go mod init lambda-go-test
# golang内で利用しているパッケージをgo get
bash# go get github.com/aws/aws-lambda-go/lambda
動かしてみる
$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"first_name":"taro", "last_name":"lambda"}'
"Hello lambda taro"
初回叩いた時は↓のエラーが返ってきたけどdocker再立ち上げしたら動いた... なんだったんでしょう。
{"errorMessage":"fork/exec /var/task/main: no such file or directory","errorType":"PathError"}
最後に
今回はここまでにします。
次回はもっと色々試してみた結果をこちらに書いていければと思ってます。