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 架构有单独的程序包。
运行时系统接口仿真器使用准则
使用运行时系统接口仿真器时,请注意以下准则:
环境变量
运行时系统接口仿真器支持本地运行映像中 Lambda 函数的环境变量子集。
如果您的函数使用安全凭证,则可以通过设置以下环境变量来配置凭证:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
AWS_DEFAULT_REGION
要设置函数超时,请配置 AWS_LAMBDA_FUNCTION_TIMEOUT
。输入您想允许函数运行的最大秒数。
仿真器不填充以下 Lambda 环境变量。但是,您可以将它们设置为与函数在 Lambda 服务中运行时您所期望的值匹配:
测试通过 Amazon 基本映像构建的映像
Lambda 的 Amazon 基本映像包含运行时系统接口仿真器。构建 Docker 映像后,请按照以下步骤在本地对其进行测试。
-
使用 docker run 命令启动 Docker 映像。在此示例中,docker-image
是映像名称,test
是标签。
docker run -p 9000:8080 docker-image
:test
此命令会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations
创建本地端点。
-
在新的终端窗口中,将事件发布到本地端点。
- 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"
-
获取容器 ID。
docker ps
-
使用 docker kill 命令停止容器。在此命令中,将 3766c4ab331c
替换为上一步中的容器 ID。
docker kill 3766c4ab331c
测试根据 provided.al2 基本映像构建的映像
自定义运行时系统的基本映像包含运行时接口仿真器。构建 Docker 映像后,请按照以下步骤在本地对其进行测试。
-
使用 docker run 命令启动 Docker 映像。
- Node.js
-
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test
\
/usr/local/bin/npx aws-lambda-ric index.handler
- Python
-
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test
\
/usr/local/bin/python -m awslambdaric app.handler
- Java
-
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test
\
/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
- Go
-
在以下示例中,/main
是在 Docker 构建期间编译的二进制文件。
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test
\
/main
- Ruby
-
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test
\
aws_lambda_ric index.LambdaFunction::Handler.process
此命令会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations
创建本地端点。
-
使用 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!"}
'
-
获取容器 ID。
docker ps
-
使用 docker kill 命令停止容器。在此命令中,将 3766c4ab331c
替换为上一步中的容器 ID。
docker kill 3766c4ab331c
测试根据备用基本映像构建的映像
如果您使用备用基本映像,例如 Alpine Linux 或 Debian 映像,则可将仿真器构建到映像中或将其安装在本地计算机上。
将运行时系统接口仿真器构建到映像中
将仿真器构建到映像中
-
创建脚本并将其保存在项目目录中。设置脚本文件的执行权限。
脚本将检查 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
-
将目标架构的运行时系统接口仿真器从 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
-
将以下行添加至您的 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
" ]
-
使用 docker build 命令构建 Docker 映像。以下示例将映像命名为 docker-image
并为其提供 test
标签。
docker build --platform linux/amd64 -t docker-image
:test
.
该命令指定了 --platform linux/amd64
选项,可确保无论生成计算机的架构如何,容器始终与 Lambda 执行环境兼容。如果打算使用 ARM64 指令集架构创建 Lambda 函数,请务必将命令更改为使用 --platform linux/arm64
选项。
-
使用 docker run 命令启动 Docker 映像。在此示例中,docker-image
是映像名称,test
是标签。
docker run -p 9000:8080 docker-image
:test
此命令会将映像作为容器运行,并在 localhost:9000/2015-03-31/functions/function/invocations
创建本地端点。
-
在新的终端窗口中,将事件发布到本地端点。
- 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"
-
获取容器 ID。
docker ps
-
使用 docker kill 命令停止容器。在此命令中,将 3766c4ab331c
替换为上一步中的容器 ID。
docker kill 3766c4ab331c
本地安装运行时系统接口仿真器
要在本地计算机上安装运行时系统接口仿真器,请从 GitHub 下载适用于您的首选架构的程序包。然后,使用 docker run 命令启动容器映像并将 --entrypoint
设置为仿真器。有关更多信息,请选择您的首选语言的说明: