我尝试用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"}

最终

这次就到这里吧。
下次我希望能试试更多不同的东西,然后将结果写在这里。

广告
将在 10 秒后关闭
bannerAds