添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用 Ruby 的 AWS 基本映像

AWS 基本映像 会预加载一个语言运行时系统、一个用于管理 Lambda 和函数代码之间交互的运行时系统接口客户端,以及一个用于本地测试的运行时系统接口仿真器。

使用 AWS 仅限操作系统的基础镜像

AWS 仅限操作系统的运行时系统 包含 Amazon Linux 发行版和 运行时系统接口模拟器 。这些镜像通常用于为编译语言(例如 Go Rust )以及 Lambda 未提供基础映像的语言或语言版本(例如 Node.js 19)创建容器镜像。您也可以使用仅限操作系统的基础映像来实施 自定义运行时系统 。要使映像与 Ruby 兼容,您必须在映像中包含 Java 的运行时系统接口客户端

使用非 AWS 基本映像

您还可以使用其他容器注册表的备用基本映像,例如 Alpine Linux 或 Debian。您还可以使用您的组织创建的自定义映像。要使映像与 Ruby 兼容,您必须在映像中包含 Java 的运行时系统接口客户端

提示

要缩短 Lambda 容器函数激活所需的时间,请参阅 Docker 文档中的 使用多阶段构建 。要构建高效的容器映像,请遵循 编写 Dockerfiles 的最佳实践

此页面介绍了如何为 Lambda 构建、测试和部署容器映像。

Ruby AWS 基本映像

AWS 为 Ruby 提供了以下基本映像:

cd example

创建名为 Gemfile 的新文件。您可以在此处列出应用程序所需的 RubyGems 软件包。AWS SDK for Ruby 可从 RubyGems 获得。您应该选择特定的 AWS 服务 Gem 进行安装。例如,要使用 适用于 Lambda 的 Ruby Gem ,Gemfile 应如下所示:

source 'https://rubygems.org' gem 'aws-sdk-lambda'

或者, aws-sdk Gem 包含所有可用的 AWS 服务 Gem。此 Gem 非常大。我们建议您仅在依赖许多 AWS 服务时使用它。

使用 bundle 安装 来安装 Gemfile 中指定的依赖项。

bundle install

创建名为 lambda_function.rb 的新文件。您可以将以下示例函数代码添加到文件中进行测试,也可以使用您自己的函数代码。

例 Ruby 函数
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!"

创建新 Dockerfile。以下示例 Dockerfile 使用 AWS 基本映像。此 Docerfile 使用以下配置:

FROM 属性设置为基本映像的 URI。

使用 COPY 命令将函数代码和运行时系统依赖项复制到 {LAMBDA_TASK_ROOT},此为 Lambda 定义的环境变量

CMD 参数设置为 Lambda 函数处理程序。

请注意,示例 Dockerfile 不包含 USER 指令。当您将容器映像部署到 Lambda 时,Lambda 会自动定义具有最低权限的默认 Linux 用户。这与标准 Docker 行为不同,标准 Docker 在未提供 USER 指令时默认为 root 用户。

例 Dockerfile
FROM public.ecr.aws/lambda/ruby:3.2 # Copy Gemfile and Gemfile.lock COPY Gemfile Gemfile.lock ${LAMBDA_TASK_ROOT}/ # Install Bundler and the specified gems RUN gem install bundler:2.4.20 && \ bundle config set --local path 'vendor/bundle' && \ bundle install # Copy function code COPY lambda_function.rb ${LAMBDA_TASK_ROOT}/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "lambda_function.LambdaFunction::Handler.process" ]

使用 docker build 命令构建 Docker 映像。以下示例将映像命名为 docker-image 并为其提供 test 标签。要使您的映像与 Lambda 兼容,您必须使用 --provenance=false 选项。

docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
注意

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

使用 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 选项。

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

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
将映像上传到 Amazon ECR 并创建 Lambda 函数
  1. 运行 get-login-password 命令,以针对 Amazon ECR 注册表进行 Docker CLI 身份验证。

    111122223333 替换为您的 AWS 账户 ID。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com

    使用 create-repository 命令在 Amazon ECR 中创建存储库。

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    注意

    Amazon ECR 存储库必须与 Lambda 函数位于同一 AWS 区域 内。

    如果成功,您将会看到如下响应:

    "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true "encryptionConfiguration": { "encryptionType": "AES256"

    从上一步的输出中复制 repositoryUri

    运行 docker tag 命令,将本地映像作为最新版本标记到 Amazon ECR 存储库中。在此命令中:

    docker-image:test 是 Docker 映像的名称和 标签 。这是您在 docker build 命令中指定的映像名称和标签。

    <ECRrepositoryUri> 替换为复制的 repositoryUri 。确保 URI 末尾包含 :latest

    docker tag docker-image:test <ECRrepositoryUri>:latest
    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

    运行 docker push 命令,以将本地映像部署到 Amazon ECR 存储库。确保存储库 URI 末尾包含 :latest

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

    如果您还没有函数的执行角色,请 创建执行角色 。在下一步中,您需要提供角色的 Amazon 资源名称(ARN)。

    创建 Lambda 函数。对于 ImageUri ,指定之前的存储库 URI。确保 URI 末尾包含 :latest

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    注意

    只要映像与 Lambda 函数位于同一区域内,您就可以使用其他 AWS 账户中的映像创建函数。有关更多信息,请参阅 Amazon ECR 跨账户权限

    调用函数。

    aws lambda invoke --function-name hello-world response.json

    应出现如下响应:

    "ExecutedVersion": "$LATEST", "StatusCode": 200

    要查看函数的输出,请检查 response.json 文件。

要更新函数代码,您必须再次构建映像,将新映像上传到 Amazon ECR 存储库,然后使用 update-function-code 命令将映像部署到 Lambda 函数。

Lambda 会将映像标签解析为特定的映像摘要。这意味着,如果您将用于部署函数的映像标签指向 Amazon ECR 中的新映像,则 Lambda 不会自动更新该函数以使用新映像。

要将新映像部署到相同的 Lambda 函数,即使 Amazon ECR 中的映像标签保持不变,也必须使用 update-function-code 命令。在以下示例中, --publish 选项使用更新的容器映像创建函数的新版本。

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

将备用基本映像与运行时系统接口客户端配合使用

如果使用 仅限操作系统的基础映像 或者备用基础映像,则必须在映像中包括运行时系统接口客户端。运行时系统接口客户端可扩展 将 Lambda 运行时 API 用于自定义运行时 ,用于管理 Lambda 和函数代码之间的交互。

使用 RubyGems.org 程序包管理器安装 适用于 Ruby 的 Lambda 运行时系统接口客户端

gem install aws_lambda_ric

您也可以从 GitHub 下载 Ruby 运行时接口客户端

以下示例演示了如何使用非 AWS 基本映像构建适用于 Ruby 的容器映像。示例 Dockerfile 使用官方 Ruby 基本映像。Docker 包含运行时系统接口客户端。

要完成本节中的步骤,您必须满足以下条件:

cd example

创建名为 Gemfile 的新文件。您可以在此处列出应用程序所需的 RubyGems 软件包。AWS SDK for Ruby 可从 RubyGems 获得。您应该选择特定的 AWS 服务 Gem 进行安装。例如,要使用 适用于 Lambda 的 Ruby Gem ,Gemfile 应如下所示:

source 'https://rubygems.org' gem 'aws-sdk-lambda'

或者, aws-sdk Gem 包含所有可用的 AWS 服务 Gem。此 Gem 非常大。我们建议您仅在依赖许多 AWS 服务时使用它。

使用 bundle 安装 来安装 Gemfile 中指定的依赖项。

bundle install

创建名为 lambda_function.rb 的新文件。您可以将以下示例函数代码添加到文件中进行测试,也可以使用您自己的函数代码。

例 Ruby 函数
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!"

创建新 Dockerfile。以下 Dockerfile 使用 Ruby 基本映像而不是 AWS 基本映像。Dockerfile 包含适用于 Ruby 的运行时系统接口客户端,该客户端可使映像与 Lambda 兼容。或者,您可以将运行时系统接口客户端添加到应用程序的 Gemfile 中。

FROM 属性设置为 Ruby 基本映像。

为函数代码创建目录和指向该目录的环境变量。在本示例中,目录为 /var/task,会镜像 Lambda 执行环境。不过,您可以为函数代码选择任何目录,因为 Dockerfile 不使用 AWS 基础映像。

ENTRYPOINT 设置为您希望 Docker 容器在启动时运行的模块。在本例中,模块为运行时系统接口客户端。

CMD 参数设置为 Lambda 函数处理程序。

请注意,示例 Dockerfile 不包含 USER 指令。当您将容器映像部署到 Lambda 时,Lambda 会自动定义具有最低权限的默认 Linux 用户。这与标准 Docker 行为不同,标准 Docker 在未提供 USER 指令时默认为 root 用户。

例 Dockerfile
FROM ruby:2.7 # Install the runtime interface client for Ruby RUN gem install aws_lambda_ric # Add the runtime interface client to the PATH ENV PATH="/usr/local/bundle/bin:${PATH}" # Create a directory for the Lambda function ENV LAMBDA_TASK_ROOT=/var/task RUN mkdir -p ${LAMBDA_TASK_ROOT} WORKDIR ${LAMBDA_TASK_ROOT} # Copy Gemfile and Gemfile.lock COPY Gemfile Gemfile.lock ${LAMBDA_TASK_ROOT}/ # Install Bundler and the specified gems RUN gem install bundler:2.4.20 && \ bundle config set --local path 'vendor/bundle' && \ bundle install # Copy function code COPY lambda_function.rb ${LAMBDA_TASK_ROOT}/ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "aws_lambda_ric" ] # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "lambda_function.LambdaFunction::Handler.process" ]

使用 docker build 命令构建 Docker 映像。以下示例将映像命名为 docker-image 并为其提供 test 标签。要使您的映像与 Lambda 兼容,您必须使用 --provenance=false 选项。

docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
注意

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

使用 运行时系统接口仿真器 在本地测试映像。您可以 将仿真器构建到映像中 ,也可以使用以下程序将其安装在本地计算机上。

在本地计算机上安装并运行运行时系统接口仿真器
  1. 从项目目录中,运行以下命令以从 GitHub 下载运行时系统接口仿真器(x86-64 架构)并将其安装在本地计算机上。

    Linux/macOS
    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

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

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

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

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64

    使用 docker run 命令启动 Docker 映像。请注意以下几点:

    docker-image 是映像名称, test 是标签。

    aws_lambda_ric lambda_function.LambdaFunction::Handler.process ENTRYPOINT ,后跟您 Dockerfile 中的 CMD

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ docker-image:test \ aws_lambda_ric lambda_function.LambdaFunction::Handler.process
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` docker-image:test ` aws_lambda_ric lambda_function.LambdaFunction::Handler.process

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

    注意

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

    将事件发布到本地端点。

    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
将映像上传到 Amazon ECR 并创建 Lambda 函数
  1. 运行 get-login-password 命令,以针对 Amazon ECR 注册表进行 Docker CLI 身份验证。

    111122223333 替换为您的 AWS 账户 ID。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com

    使用 create-repository 命令在 Amazon ECR 中创建存储库。

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    注意

    Amazon ECR 存储库必须与 Lambda 函数位于同一 AWS 区域 内。

    如果成功,您将会看到如下响应:

    "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true "encryptionConfiguration": { "encryptionType": "AES256"

    从上一步的输出中复制 repositoryUri

    运行 docker tag 命令,将本地映像作为最新版本标记到 Amazon ECR 存储库中。在此命令中:

    docker-image:test 是 Docker 映像的名称和 标签 。这是您在 docker build 命令中指定的映像名称和标签。

    <ECRrepositoryUri> 替换为复制的 repositoryUri 。确保 URI 末尾包含 :latest

    docker tag docker-image:test <ECRrepositoryUri>:latest
    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

    运行 docker push 命令,以将本地映像部署到 Amazon ECR 存储库。确保存储库 URI 末尾包含 :latest

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

    如果您还没有函数的执行角色,请 创建执行角色 。在下一步中,您需要提供角色的 Amazon 资源名称(ARN)。

    创建 Lambda 函数。对于 ImageUri ,指定之前的存储库 URI。确保 URI 末尾包含 :latest

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    注意

    只要映像与 Lambda 函数位于同一区域内,您就可以使用其他 AWS 账户中的映像创建函数。有关更多信息,请参阅 Amazon ECR 跨账户权限

    调用函数。

    aws lambda invoke --function-name hello-world response.json

    应出现如下响应:

    "ExecutedVersion": "$LATEST", "StatusCode": 200