使用容器镜像部署 Go Lambda 函数
您可以将 Lambda 函数代码部署为容器镜像。Amazon提供了以下资源,帮助您为 Go 函数构建容器镜像:
定义为容器镜像的函数的工作流包括以下步骤:
-
使用本主题中列出的资源构建容器镜像。
-
将镜像上载到 Amazon ECR 容器注册表。
AmazonGo 的 基本映像
Amazon 为 Go 提供了以下基本映像:
标签 | 运行时 | 操作系统 | Dockerfile |
---|---|---|---|
1 |
Go 1.x | Amazon Linux 2018.03 | GitHub 上适用于 Go 1.x 的 Dockerfile |
Amazon ECR 存储库:gallery.ecr.aws/lambda/go
Go 运行时接口客户端
Amazon 没有为 Go 提供单独的运行时接口客户端。aws-lambda-go/lambda
程序包包括运行时接口的实施。
使用 Go:1.x 基本映像
有关如何使用 Go:1.x 基本镜像的说明,请选择 Amazon ECR 存储库中 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 文件存档还是容器映像,前三个步骤都是相同的。
-
在本地计算机上,为新函数创建项目目录。
-
在项目文件夹中,运行以下命令以安装所需的 Lambda Go 库。
go get github.com/aws/aws-lambda-go
有关 Lambda Go 库的描述,请参阅使用 Go 构建 Lambda 函数。
创建您的 Go 处理程序代码并包含
aws-lambda-go/lambda
程序包。-
使用文本编辑器在项目目录中创建一个 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" ]
-
使用
docker build
命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为hello-world
。docker build -t
hello-world
. -
对您的 Amazon ECR 注册表进行 Docker CLI 身份验证。
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin123456789012
.dkr.ecr.us-east-1
.amazonaws.com -
标记镜像以匹配您的存储库名称,然后使用
docker push
命令将镜像部署到 Amazon ECR。docker tag
hello-world
:latest123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest docker push123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest
容器镜像驻留在 Amazon ECR 容器注册表中之后,可以创建 Lambda 函数并部署镜像。
根据备选基本镜像创建镜像
您可以从备用基本映像为 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 添加到映像
-
在 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" ]
-
使用文本编辑器在项目目录中创建包含以下内容的文件
entry.sh
:#!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/bin/aws-lambda-rie "$@" else exec "$@" fi
如果您不想将 RIE 添加到映像中,则可以在本地测试您的映像,而无需将 RIE 添加到映像中。
在不向映像添加 RIE 的情况下进行本地测试
-
从项目目录中,运行以下命令以从 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
-
使用
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
以本地方式启动终端节点。 -
使用
curl
命令将事件发布到以下终端节点:curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
此命令调用在容器映像中运行的 函数并返回响应。
容器镜像驻留在 Amazon ECR 容器注册表中之后,您可以创建 Lambda 函数并部署镜像。
部署容器镜像
对于新函数,您可以在创建函数时部署 Go 镜像。对于现有函数,如果重建容器镜像,则需要通过更新函数代码来重新部署该镜像。