如何将 Amazon Linux 2 AMI 本机二进制包与 Lambda 结合使用?

上次更新时间:2022 年 3 月 28 日

我想创建一个包含二进制共享库依赖项并在 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 函数


这篇文章对您有帮助吗?


您是否需要账单或技术支持?