使用容器映像部署 Go Lambda 函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用容器映像部署 Go Lambda 函数

您可以将 Lambda 函数代码部署为容器映像。Amazon 提供了以下资源,帮助您为 Go 函数构建容器映像:

  • Lambda 的 Amazon 基本镜像

    这些基本镜像预加载了语言运行时以及在 Lambda 上运行镜像所需的其他组件。Amazon 为每个基本镜像提供 Dockerfile,以帮助构建容器镜像。

  • 开源运行时接口客户端

    如果您使用社区或私有企业基本镜像,请将运行时接口客户端添加到基本镜像以使其与 Lambda 兼容。

定义为容器镜像的函数的工作流包括以下步骤:

  1. 使用本主题中列出的资源构建容器镜像。

  2. 将镜像上传到 Amazon ECR 镜像仓库。请参阅创建镜像中的步骤 7-9。

  3. 创建 Lambda 函数并部署镜像。

Go 的 Amazon 基本映像

Amazon 为 Go 提供了以下基本映像:

Tags 运行时 操作系统 Dockerfile

1

Go 1.x Amazon Linux 2018.03 GitHub 上适用于 Go 1.x 的 Dockerfile

Docker Hub 存储库:amazon/aws-lambda-go

Amazon ECR 存储库:gallery.ecr.aws/lambda/go

Go 运行时接口客户端

Amazon 没有为 Go 提供单独的运行时接口客户端。aws-lambda-go/lambda 程序包包括运行时接口的实施。

使用 Go:1.x 基本映像

有关如何使用 Go:1.x 基本映像的说明,请选择 Amazon ECR 存储库Go Lambda 基本映像usage(使用情况)选项卡。

这些说明也可以在 Docker Hub 存储库中 Go Lambda 基本映像中获得。

使用 provided.al2 基本映像部署 Go

要为 Go 构建在 Amazon Linux 2 上运行的容器映像,请使用 provided.al2 基本映像。有关此基本映像的更多信息,请参阅 Amazon ECR 公共库中提供的内容

你可以在 Go 处理程序中包含 aws-lambda-go/lambda 程序包。此程序包实施 Go 的编程模型,包括运行时接口客户端。provided.al2 基本映像还包括运行时接口模拟器。

使用 provided.al2 基本映像构建和部署 Go 函数。

请注意,无论是将函数部署为 .zip 文件存档还是容器映像,前三个步骤都是相同的。

  1. 在本地计算机上,为新函数创建项目目录。

  2. 在项目文件夹中,运行以下命令以安装所需的 Lambda Go 库。

    go get github.com/aws/aws-lambda-go

    有关 Lambda Go 库的描述,请参阅使用 Go 构建 Lambda 函数

  3. 创建您的 Go 处理程序代码并包含 aws-lambda-go/lambda 程序包。

  4. 使用文本编辑器在项目目录中创建 Dockerfile。以下示例 Dockerfile 使用 Amazon provided.al2 基本映像。

    FROM public.ecr.aws/lambda/provided:al2 as build # install compiler RUN yum install -y golang RUN go env -w GOPROXY=direct # cache dependencies ADD go.mod go.sum ./ RUN go mod download # build ADD . . RUN go build -o /main # copy artifacts to a clean image FROM public.ecr.aws/lambda/provided:al2 COPY --from=build /main /main ENTRYPOINT [ "/main" ]
  5. 使用 docker build 命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为 hello-world

    docker build -t hello-world .
  6. 对您的 Amazon ECR 注册表进行 Docker CLI 身份验证。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  7. 标记映像以匹配您的存储库名称,然后使用 docker push 命令将映像部署到 Amazon ECR。

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

容器映像驻留在 Amazon ECR 容器注册表中之后,您可以创建 Lambda 函数并部署映像。

使用备用基本映像部署 Go

您可以从备用基本映像为 Go 构建容器映像。以下示例 Dockerfile 使用 alpine 作为基本映像。

FROM alpine as build # install build tools RUN apk add go git RUN go env -w GOPROXY=direct # cache dependencies ADD go.mod go.sum ./ RUN go mod download # build ADD . . RUN go build -o /main # copy artifacts to a clean image FROM alpine COPY --from=build /main /main ENTRYPOINT [ "/main" ]

这些步骤与 provided.al2 基本映像描述的步骤相同,还有一个额外的考虑因素:如果要将 RIE 添加到映像中,则需要在运行 docker build 命令之前执行这些附加步骤。有关使用 RIE 在本地测试映像的更多信息,请参阅 在本地测试 Lambda 容器映像

将 RIE 添加到映像

  1. 在 Dockerfile 中,将 ENTRYPOINT 指令替换为以下内容:

    # (Optional) Add Lambda Runtime Interface Emulator and use a script in the ENTRYPOINT for simpler local runs ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie RUN chmod 755 /usr/bin/aws-lambda-rie COPY entry.sh / RUN chmod 755 /entry.sh ENTRYPOINT [ "/entry.sh" ]
  2. 使用文本编辑器在项目目录中创建包含以下内容的文件 entry.sh

    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/bin/aws-lambda-rie "$@" else exec "$@" fi

如果您不想将 RIE 添加到映像中,则可以在本地测试您的映像,而无需将 RIE 添加到映像中。

在不向映像添加 RIE 的情况下进行本地测试

  1. 从项目目录中,运行以下命令以从 GitHub 下载 RIE 并将其安装在本地计算机上。

    mkdir -p ~/.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
  2. 使用 docker run 命令运行您的 Lambda 映像函数。在以下示例中,/main 是函数入口点的路径。

    docker run -d -v ~/.aws-lambda-rie:/aws-lambda --entrypoint /aws-lambda/aws-lambda-rie -p 9000:8080 myfunction:latest /main

    这会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations 以本地方式启动终端节点。

  3. 使用 curl 命令将事件发布到以下终端节点:

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    此命令调用在容器映像中运行的函数并返回响应。

容器映像驻留在 Amazon ECR 容器注册表中之后,您可以创建 Lambda 函数并部署映像。