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

在本地测试 Lambda 容器映像

AWS Lambda 运行时接口模拟器 (RIE) 是 Lambda 运行时 API 的代理,允许您在本地测试打包为容器映像的 Lambda 函数。模拟器是一个轻量级 Web 服务器,它将 HTTP 请求转换为 JSON 事件以传递给容器映像中的 Lambda 函数。

Lambda 的 AWS 基本映像包括 RIE 组件。如果您使用备用基本映像,则可以在不向映像添加 RIE 的情况下测试映像。您还可以将 RIE 组件构建到基本映像中。AWS 在 AWS GitHub 存储库中提供了一个开源 RIE 组件。

您可以使用模拟器测试函数代码是否与 Lambda 环境兼容。还可以使用模拟器测试 Lambda 函数是否成功运行并提供预期的输出。如果将扩展和代理构建到容器映像中,则可以使用模拟器测试扩展和代理是否可以在 Lambda 扩展 API 中正常运行。

有关如何使用 RIE 的示例,请参阅 AWS 博客上的对 Lambda 的容器映像支持

RIE 的使用准则

使用运行时接口模拟器时,请注意以下准则:

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

  • 模拟器仅支持 Linux x86-64 架构。

  • 模拟器不支持AWS X-Ray跟踪或其他Lambda集成。

环境变量

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

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

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_REGION

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

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

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

在映像中包含 RIE 的情况下测试图像

Lambda 的 AWS 基本映像包含运行时接口模拟器。如果将 RIE 构建到备用基本映像中,也可以按照以下步骤操作。

使用模拟器测试您的 Lambda 函数

  1. 使用 docker build 命令在本地构建映像。

    docker build -t myfunction:latest .
  2. 使用 docker run 命令在本地运行容器映像。

    docker run -p 9000:8080 myfunction:latest

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

  3. 在新的终端窗口中,使用 curl 命令将事件发布到以下终端节点:

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

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

将 RIE 构建到您的基本映像中

您可以将 RIE 构建到基本映像中。将 RIE 从 GitHub 下载到本地计算机,然后更新 Dockerfile 以安装 RIE。

将模拟器构建到映像中

  1. 创建脚本并将其保存在项目目录中。以下示例显示了 Node.js 函数的典型脚本。AWS_LAMBDA_RUNTIME_API 环境变量的存在表示存在运行时 API。如果存在运行时 API,则脚本将运行运行时接口客户端。否则,脚本将运行运行时接口模拟器。

    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/npx aws-lambda-ric else exec /usr/bin/npx aws-lambda-ric fi
  2. 运行时接口模拟器从 GitHub 下载到项目目录中。

  3. 通过将以下行添加到 Docckerfile,安装模拟器程序包并将 ENTRYPOINT 更改为运行新脚本:

    ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ “/entry_script.sh” ]
  4. 使用 docker build 命令在本地构建映像。

    docker build -t myfunction:latest .

在不向映像添加 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 函数。

    docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie myfunction:latest <image entrypoint> \ <(optional) image command>

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

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

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

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