我想创建一个包含二进制共享库依赖项并在 Amazon Linux 2 Amazon Machine Image (AMI) 上运行的 AWS Lambda 函数。有没有一种方法可以在不重新编译软件包的情况下使用 Amazon Linux 2 AMI 软件包?
简短描述
用于 Lambda 运行时的 Amazon Linux 2 AMI 和 Amazon Linux AMI 不支持所有相同的本机二进制包。
作为解决方法,您可以先使用 Docker 命令行界面 (CLI) 构建 Lambda 容器镜像。然后,使用该容器镜像运行您的 Lambda 函数。
解决方法
**请注意:**如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
以下说明介绍了如何将 curl 库安装到 Docker 镜像(Lambda 容器镜像)中。然后,如何使用该镜像来运行 Python 3.9 版 Lambda 函数。对于其他编码语言,相应地调整步骤。
1. 如果您尚未完成,请安装 Docker CLI。
2. 创建一个名为 lambda-project 的项目目录。
3. 使用文本编辑器在 lambda-project 目录中创建一个 Dockerfile,其中包含以下示例代码:
FROM public.ecr.aws/lambda/python:3.9
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# Install the binary packages using yum install
RUN yum install -y curl
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.lambda_handler" ]
4. 使用文本编辑器在 lambda-project 目录中创建一个 lambda_function.py 文件,其中包含以下示例代码:
import subprocess
def lambda_handler(event, context):
my_output = subprocess.check_output(["curl","-X", "GET", "https://www.httpbin.org/get"], stderr=subprocess.STDOUT, shell=False)
print(my_output.decode('utf8'))
**重要提示:**请确保在 lambda-project 目录中运行以下所有命令(步骤 5-10)。
5. 通过运行以下 docker build Docker CLI 命令来创建 Lambda 容器镜像:
docker build -t hello-world
6. 通过在本地启动容器镜像来测试容器镜像的设置。要在本地启动容器镜像,请运行以下 docker run Docker CLI 命令:
docker run -p 9000:8080 hello-world
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
7. 通过运行以下 get-login-password AWS CLI 命令,对 Amazon Elastic Container Registry (Amazon ECR) 注册表中的 Docker 进行身份验证。
**重要提示:**将 us-east-1 替换为 AWS 区域。然后,将 123456789012 替换为您的 AWS 账户 ID。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
有关更多信息,请参阅 Amazon ECR 用户指南中的使用授权令牌。
8. 通过运行以下 create-repository AWS CLI 命令创建 Amazon ECR 存储库:
**重要提示:**请将 hello-world 替换为您的 Amazon ECR 存储库的名称。
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
有关更多信息,请参阅 Amazon ECR 用户指南中的步骤 3:创建存储库。
9. 通过运行以下 docker tag Docker CLI 命令来标记要推送到存储库的容器镜像:
**重要提示:**请将 123456789012 替换为您的 AWS 账户 ID。将 us-east-1 替换为 AWS 区域。
docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
10. 通过运行以下 docker push Docker CLI 命令将您的容器镜像推送到存储库:
**重要提示:**请将 123456789012 替换为您的 AWS 账户 ID。将 us-east-1 替换为 AWS 区域。
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
您的容器映像现在位于您的 Amazon ECR 存储库中。有关更多信息,请参阅 Amazon ECR 用户指南中的步骤 4:向 Amazon ECR 推送镜像。
11. 使用您创建的容器映像创建和测试您的 Lambda 函数。有关说明,请参阅 Lambda 开发人员指南中的创建定义为容器镜像的 Lambda 函数。