在本地测试 Lambda 容器镜像 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在本地测试 Lambda 容器镜像

您可以使用 Lambda 运行时系统接口仿真器在本地测试容器映像函数,然后将其上传到 Amazon Elastic Container Registry(Amazon ECR)并将其部署到 Lambda。该仿真器是 Lambda 运行时 API 的代理。它是一个轻量级 Web 服务器,可将 HTTP 请求转换为 JSON 事件以传递给容器映像中的 Lambda 函数。

Amazon 基础映像仅限操作系统的基础映像包含运行时系统接口模拟器。如果您使用备用基本映像,例如 Alpine Linux 或  Debian 映像,则可将仿真器构建到映像中将其安装在本地计算机上

Amazon GitHub 存储库中提供了运行时接口仿真器。x86-64 和 arm64 架构有单独的程序包。

运行时系统接口仿真器使用准则

使用运行时系统接口仿真器时,请注意以下准则:

  • RIE 不模拟 Lambda 的安全和身份验证配置或 Lambda 编排。

  • Lambda 为每个指令集架构提供了一个仿真器。

  • 仿真器不支持 Amazon X-Ray 跟踪或其他 Lambda 集成。

环境变量

运行时系统接口仿真器支持本地运行映像中 Lambda 函数的环境变量子集。

如果您的函数使用安全凭证,则可以通过设置以下环境变量来配置凭证:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_DEFAULT_REGION

要设置函数超时,请配置 AWS_LAMBDA_FUNCTION_TIMEOUT。输入您想允许函数运行的最大秒数。

仿真器不填充以下 Lambda 环境变量。但是,您可以将它们设置为与函数在 Lambda 服务中运行时您所期望的值匹配:

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

测试通过 Amazon 基本映像构建的映像

Lambda 的 Amazon 基本映像包含运行时系统接口仿真器。构建 Docker 映像后,请按照以下步骤在本地对其进行测试。

  1. 使用 docker run 命令启动 Docker 映像。在此示例中,docker-image 是映像名称,test 是标签。

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    此命令会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations 创建本地端点。

    注意

    如果为 ARM64 指令集架构创建 Docker 映像,请务必使用 --platform linux/arm64 选项,而不是 --platform linux/amd64 选项。

  2. 在新的终端窗口中,将事件发布到本地端点。

    Linux/macOS

    在 Linux 和 macOS 中,运行以下 curl 命令:

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

    此命令使用空事件调用函数并返回响应。如果您使用自己的函数代码而不是示例函数代码,则可能需要使用 JSON 负载调用函数。例如:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    在中 PowerShell,运行以下Invoke-WebRequest命令:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    此命令使用空事件调用函数并返回响应。如果您使用自己的函数代码而不是示例函数代码,则可能需要使用 JSON 负载调用函数。例如:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. 获取容器 ID。

    docker ps
  4. 使用 docker kill 命令停止容器。在此命令中,将 3766c4ab331c 替换为上一步中的容器 ID。

    docker kill 3766c4ab331c

测试根据备用基本映像构建的映像

如果您使用备用基本映像,例如 Alpine Linux 或  Debian 映像,则可将仿真器构建到映像中将其安装在本地计算机上

将运行时系统接口仿真器构建到映像中

将仿真器构建到映像中
  1. 创建脚本并将其保存在项目目录中。设置脚本文件的执行权限。

    脚本将检查 AWS_LAMBDA_RUNTIME_API 环境变量是否存在,该变量表示存在运行时 API。如果存在运行时 API,则脚本将运行运行时接口客户端。否则,脚本将运行运行时系统接口仿真器。

    选择您的语言以查看示例脚本:

    Node.js

    在以下示例中,/usr/local/bin/npx aws-lambda-ric 是启动 Node.js 运行时系统接口客户端的 npx 命令。

    例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric $@ else exec /usr/local/bin/npx aws-lambda-ric $@ fi
    注意

    如果您使用的是 Windows,请确保保存具有 LF 行结尾的脚本。如果脚本使用 CRLF,则在尝试运行 Docker 映像时会出现这样的错误:

    exec /entry_script.sh: no such file or directory
    Python

    在以下示例中,/usr/local/bin/python -m awslambdaric 是将 Python 运行时系统接口客户端作为脚本运行的 Python 解释器命令。

    例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@ else exec /usr/local/bin/python -m awslambdaric $@ fi
    注意

    如果您使用的是 Windows,请确保保存具有 LF 行结尾的脚本。如果脚本使用 CRLF,则在尝试运行 Docker 映像时会出现这样的错误:

    exec /entry_script.sh: no such file or directory
    Java

    在以下示例中,/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda 将类路径设置为 Java 运行时系统接口客户端。

    例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ else exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ fi
    注意

    如果您使用的是 Windows,请确保保存具有 LF 行结尾的脚本。如果脚本使用 CRLF,则在尝试运行 Docker 映像时会出现这样的错误:

    exec /entry_script.sh: no such file or directory
    Go

    在以下示例中,/main 是在 Docker 构建期间编译的二进制文件。

    例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /main $@ else exec /main $@ fi
    注意

    如果您使用的是 Windows,请确保保存具有 LF 行结尾的脚本。如果脚本使用 CRLF,则在尝试运行 Docker 映像时会出现这样的错误:

    exec /entry_script.sh: no such file or directory
    Ruby

    在以下示例中,aws_lambda_ric 是 Luby 的运行时系统接口客户端。

    例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie aws_lambda_ric $@ else exec aws_lambda_ric $@ fi
    注意

    如果您使用的是 Windows,请确保保存具有 LF 行结尾的脚本。如果脚本使用 CRLF,则在尝试运行 Docker 映像时会出现这样的错误:

    exec /entry_script.sh: no such file or directory
  2. 将目标架构的运行时接口模拟器从您的项目目录下载 GitHub 到您的项目目录中。Lambda 为每个指令集架构提供了一个仿真器。

    Linux/macOS
    curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x aws-lambda-rie

    要安装 arm64 模拟器,请将上一个命令中的 GitHub 存储库 URL 替换为以下内容:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie

    要安装 arm64 模拟器,请将 Uri 替换为以下内容:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  3. 将以下行添加至您的 Dockerfile。ENTRYPOINT 包括您在步骤 1 中创建的脚本和您的函数处理程序。

    例 要添加到 Dockerfile 的行

    在以下示例中,将 lambda_function.handler 替换为您的函数处理程序。

    COPY ./entry_script.sh /entry_script.sh RUN chmod +x /entry_script.sh ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh","lambda_function.handler" ]
  4. 使用 docker build 命令构建 Docker 映像。以下示例将映像命名为 docker-image 并为其提供 test 标签

    docker build --platform linux/amd64 -t docker-image:test .
    注意

    该命令指定了 --platform linux/amd64 选项,可确保无论生成计算机的架构如何,容器始终与 Lambda 执行环境兼容。如果打算使用 ARM64 指令集架构创建 Lambda 函数,请务必将命令更改为使用 --platform linux/arm64 选项。

  5. 使用 docker run 命令启动 Docker 映像。在此示例中,docker-image 是映像名称,test 是标签。

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    此命令会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations 创建本地端点。

    注意

    如果为 ARM64 指令集架构创建 Docker 映像,请务必使用 --platform linux/arm64 选项,而不是 --platform linux/amd64 选项。

  6. 在新的终端窗口中,将事件发布到本地端点。

    Linux/macOS

    在 Linux 和 macOS 中,运行以下 curl 命令:

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

    此命令使用空事件调用函数并返回响应。如果您使用自己的函数代码而不是示例函数代码,则可能需要使用 JSON 负载调用函数。例如:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    在中 PowerShell,运行以下Invoke-WebRequest命令:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    此命令使用空事件调用函数并返回响应。如果您使用自己的函数代码而不是示例函数代码,则可能需要使用 JSON 负载调用函数。例如:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  7. 获取容器 ID。

    docker ps
  8. 使用 docker kill 命令停止容器。在此命令中,将 3766c4ab331c 替换为上一步中的容器 ID。

    docker kill 3766c4ab331c

本地安装运行时系统接口仿真器

要在本地计算机上安装运行时接口模拟器,请从中下载适用于您的首选架构的软件包 GitHub。然后,使用 docker run 命令启动容器映像并将 --entrypoint 设置为仿真器。有关更多信息,请选择您的首选语言的说明: