我尝试用Golang在Docker的Lambda容器映像中运行
我尝试运行了在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容器
$ 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"}
最终
这次就到这里吧。
下次我希望能试试更多不同的东西,然后将结果写在这里。