Implantar funções do Lambda em Ruby com imagens de contêiner
Existem três maneiras de criar uma imagem de contêiner para uma função do Lambda em Ruby:
-
Usar uma imagem base da AWS para Ruby
As imagens base da AWS são pré-carregadas com um runtime de linguagem, um cliente de interface de runtime para gerenciar a interação entre o Lambda e o código da sua função e um emulador de interface de runtime para testes locais.
-
Usar uma imagem base somente para sistema operacional da AWS
As imagens base somente para sistema operacional da AWS
contêm uma distribuição do Amazon Linux e o emulador de interface de runtime . Essas imagens são comumente usadas para criar imagens de contêiner para linguagens compiladas, como Go e Rust e para uma linguagem ou versão de linguagem para a qual o Lambda não fornece uma imagem base, como Node.js 19. Também é possível usar imagens base somente para sistema operacional para implementar um runtime personalizado. Para tornar a imagem compatível com o Lambda, você deve incluir o cliente de interface de runtime do Ruby na imagem. -
Usar uma imagem base que não é da AWS
Também é possível usar uma imagem base alternativa de outro registro de contêiner, como Alpine Linux ou Debian. Também é possível usar uma imagem personalizada criada por sua organização. Para tornar a imagem compatível com o Lambda, você deve incluir o cliente de interface de runtime do Ruby na imagem.
dica
Para reduzir o tempo necessário para que as funções do contêiner do Lambda se tornem ativas, consulte Use multi-stage builds
Esta página explica como criar, testar e implantar imagens de contêiner para o Lambda.
Tópicos
Imagens base da AWS para Ruby
A AWS oferece as seguintes imagens base para Ruby:
| Tags | Runtime | Sistema operacional | Dockerfile | Desaprovação |
|---|---|---|---|---|
3.4 |
Ruby 3.4 | Amazon Linux 2023 | Dockerfile para Ruby 3.4 no GitHub |
31 de março de 2028 |
3.3 |
Ruby 3.3 | Amazon Linux 2023 | Dockerfile para Ruby 3.3 no GitHub |
31 de março de 2027 |
3.2 |
Ruby 3.2 | Amazon Linux 2 | Dockerfile para Ruby 3.2 no GitHub |
31 de março de 2026 |
Repositório do Amazon ECR: gallery.ecr.aws/lambda/ruby
Usar uma imagem base da AWS para Ruby
Para executar as etapas desta seção, você deve ter o seguinte:
Para criar uma imagem de contêiner para Ruby
-
Crie um diretório para o projeto e depois mude para esse diretório.
mkdir example cd example -
Crie um novo arquivo chamado
Gemfile. É aqui que você lista os pacotes do RubyGems necessários da sua aplicação. O AWS SDK para Ruby está disponível no RubyGems. Você deve escolher gems de serviço da AWS específicos para instalar. Por exemplo, para usar o gem do Ruby para Lambda, seu Gemfile deve ser: source 'https://rubygems.org' gem 'aws-sdk-lambda'Como alternativa, o gem aws-sdk
contém todos os gems de serviço da AWS disponíveis. Esse gem é muito grande. Recomendamos que ele só seja usado se você depender de muitos serviços da AWS. -
Instale as dependências especificadas no Gemfile usando instalação de pacote
. bundle install -
Crie um novo arquivo chamado
lambda_function.rb. É possível adicionar o exemplo de código de função a seguir ao arquivo para testes ou usar o seu próprio código.exemplo Função Ruby
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!" end end end -
Crie um novo Dockerfile. É mostrado a seguir um exemplo de Dockerfile que usa uma imagem base da AWS. Esse Dockerfile usa a seguinte configuração:
-
Defina a propriedade
FROMcomo o URI da imagem base. -
Use o comando COPY para copiar o código da função e as dependências do runtime para
{LAMBDA_TASK_ROOT}, uma variável de ambiente definida pelo Lambda. -
Defina o argumento
CMDcomo o manipulador de funções do Lambda.
Observe que o Dockerfile de exemplo não inclui uma instrução USER
. Quando você implanta uma imagem de contêiner no Lambda, o Lambda define automaticamente um usuário padrão do Linux com permissões de privilégio mínimo. Isso é diferente do comportamento padrão do Docker, que adota o usuário rootcomo padrão quando nenhuma instruçãoUSERé fornecida.exemplo Dockerfile
FROMpublic.ecr.aws/lambda/ruby:3.4# 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 COPYlambda_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" ] -
-
Crie a imagem do Docker com o comando docker build
. O exemplo a seguir nomeia a imagem como docker-imagee atribui a ela a tagtest. Para tornar sua imagem compatível com o Lambda, é necessário usar a opção--provenance=false.docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.nota
O comando especifica a opção
--platform linux/amd64para garantir que seu contêiner seja compatível com o ambiente de execução do Lambda, independentemente da arquitetura da sua máquina de compilação. Se você pretende criar uma função do Lambda usando a arquitetura do conjunto de instruções ARM64, certifique-se de alterar o comando para usar a opção--platform linux/arm64em vez disso.
-
Inicie a imagem do Docker com o comando docker run. Neste exemplo,
docker-imageé o nome da imagem etesté a tag.docker run --platform linux/amd64 -p 9000:8080docker-image:testEsse comando executa a imagem como um contêiner e cria um endpoint local em
localhost:9000/2015-03-31/functions/function/invocations.nota
Se você criou a imagem do Docker para a arquitetura do conjunto de instruções ARM64, certifique-se de usar a opção
--platform linux/, em vez dearm64--platform linux/.amd64 -
Em uma nova janela de terminal, publique um evento no endpoint local.
-
Obtenha o ID do contêiner.
docker ps -
Use o comando docker kill
para parar o contêiner. Nesse comando, substitua 3766c4ab331cpelo ID do contêiner da etapa anterior.docker kill3766c4ab331c
Para enviar a imagem ao Amazon ECR e criar a função do Lambda
-
Execute o comando get-login-password
para autenticar a CLI do Docker no seu registro do Amazon ECR. -
Defina o valor
--regionpara a Região da AWS onde você deseja criar o repositório do Amazon ECR. -
Substituir
111122223333por seu ID da Conta da AWS.
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
Crie um repositório no Amazon ECR usando o comando create-repository
. aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEnota
O repositório do Amazon ECR deve estar na mesma Região da AWS que a função do Lambda.
Se tiver êxito, você verá uma resposta como esta:
{ "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" } } } -
Copie o
repositoryUrida saída na etapa anterior. -
Execute o comando docker tag
para aplicar uma tag na sua imagem local em seu repositório do Amazon ECR como a versão mais recente. Neste comando: -
docker-image:testé o nome e a tagda sua imagem do Docker. Esse é o nome e a tag da imagem que você especificou no comando docker build. -
Substitua
<ECRrepositoryUri>pelorepositoryUrique você copiou. Certifique-se de incluir:latestno final do URI.
docker tag docker-image:test<ECRrepositoryUri>:latestExemplo:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
Execute o comando docker push
para implantar a imagem local no repositório do Amazon ECR. Certifique-se de incluir :latestno final do URI do repositório.docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
Crie um perfil de execução para a função, caso ainda não tenha um. Você precisará do nome do recurso da Amazon (ARN) do perfil na próxima etapa.
-
Criar a função do Lambda. Em
ImageUri, especifique o URI do repositório anterior. Certifique-se de incluir:latestno final do URI.aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-exnota
É possível criar uma função usando uma imagem em uma conta da AWS diferente desde que a imagem esteja na mesma região da função do Lambda. Para obter mais informações, consulte Permissões entre contas do Amazon ECR.
-
Invoque a função.
aws lambda invoke --function-namehello-worldresponse.jsonVocê obterá uma resposta parecida com esta:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
Para ver a saída da função, verifique o arquivo
response.json.
Para atualizar o código da função, você deve criar a imagem novamente, fazer upload da nova imagem no repositório do Amazon ECR e, em seguida, usar o comando update-function-code
O Lambda resolve a tag de imagem em um resumo de imagem específico. Isso significa que, se você apontar a tag de imagem que foi usada para implantar a função em uma nova imagem no Amazon ECR, o Lambda não atualizará automaticamente a função para usar a nova imagem.
Para implantar a nova imagem na mesma função do Lambda, você deverá usar o comando update-function-code--publish cria uma nova versão da função usando a imagem de contêiner atualizada.
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish
Usar uma imagem base alternativa com o cliente da interface de runtime
Se você usar uma imagem base somente para sistema operacional ou uma imagem base alternativa, deverá incluir o cliente de interface de runtime na imagem. O cliente de interface de runtime estende API de runtime, que gerencia a interação entre o Lambda e o código da sua função.
Instale o cliente de interface de runtime para Ruby
gem install aws_lambda_ric
Também é possível fazer download do cliente de interface de runtime do Ruby
O exemplo a seguir demonstra como criar uma imagem de contêiner para Ruby usando uma imagem base que não é da AWS. O exemplo de Dockerfile usa uma imagem base oficial do Ruby. O Dockerfile inclui o cliente de interface de runtime.
Para executar as etapas desta seção, você deve ter o seguinte:
Para criar uma imagem de contêiner usando uma imagem base alternativa do Ruby
-
Crie um diretório para o projeto e depois mude para esse diretório.
mkdir example cd example -
Crie um novo arquivo chamado
Gemfile. É aqui que você lista os pacotes do RubyGems necessários da sua aplicação. O AWS SDK para Ruby está disponível no RubyGems. Você deve escolher gems de serviço da AWS específicos para instalar. Por exemplo, para usar o gem do Ruby para Lambda, seu Gemfile deve ser: source 'https://rubygems.org' gem 'aws-sdk-lambda'Como alternativa, o gem aws-sdk
contém todos os gems de serviço da AWS disponíveis. Esse gem é muito grande. Recomendamos que ele só seja usado se você depender de muitos serviços da AWS. -
Instale as dependências especificadas no Gemfile usando instalação de pacote
. bundle install -
Crie um novo arquivo chamado
lambda_function.rb. É possível adicionar o exemplo de código de função a seguir ao arquivo para testes ou usar o seu próprio código.exemplo Função Ruby
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!" end end end -
Crie um novo Dockerfile. O Dockerfile a seguir usa uma imagem base do Ruby em vez de uma imagem base da AWS. O Dockerfile inclui o cliente de interface de runtime do Ruby
, o que torna a imagem compatível com o Lambda. Como alternativa, você pode adicionar o cliente da interface de runtime ao Gemfile da aplicação. -
Defina a propriedade
FROMcomo a imagem básica do Ruby. -
Crie um diretório para o código da função e uma variável de ambiente que aponte para esse diretório. Neste exemplo, o diretório é
/var/task, que espelha o ambiente de execução do Lambda. No entanto, você pode escolher qualquer diretório para o código da função, pois o Dockerfile não usa uma imagem básica da AWS. -
Defina o
ENTRYPOINTcomo o módulo em que você deseja que o contêiner do Docker seja executado quando for iniciado. Nesse caso, o módulo é o cliente de interface de runtime. -
Defina o argumento
CMDcomo o manipulador de funções do Lambda.
Observe que o Dockerfile de exemplo não inclui uma instrução USER
. Quando você implanta uma imagem de contêiner no Lambda, o Lambda define automaticamente um usuário padrão do Linux com permissões de privilégio mínimo. Isso é diferente do comportamento padrão do Docker, que adota o usuário rootcomo padrão quando nenhuma instruçãoUSERé fornecida.exemplo Dockerfile
FROMruby: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 COPYlambda_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" ] -
-
Crie a imagem do Docker com o comando docker build
. O exemplo a seguir nomeia a imagem como docker-imagee atribui a ela a tagtest. Para tornar sua imagem compatível com o Lambda, é necessário usar a opção--provenance=false.docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.nota
O comando especifica a opção
--platform linux/amd64para garantir que seu contêiner seja compatível com o ambiente de execução do Lambda, independentemente da arquitetura da sua máquina de compilação. Se você pretende criar uma função do Lambda usando a arquitetura do conjunto de instruções ARM64, certifique-se de alterar o comando para usar a opção--platform linux/arm64em vez disso.
Use o emulador de interface de runtime
Para instalar o emulador de interface de runtime na sua máquina local
-
No diretório do projeto, execute o comando a seguir para baixar o emulador de interface de runtime (arquitetura x86-64) do GitHub e instalá-lo na sua máquina local.
-
Inicie a imagem do Docker com o comando docker run. Observe o seguinte:
-
docker-imageé o nome da imagem etesté a tag. -
aws_lambda_ric lambda_function.LambdaFunction::Handler.processé oENTRYPOINTseguido peloCMDdo Dockerfile.
Esse comando executa a imagem como um contêiner e cria um endpoint local em
localhost:9000/2015-03-31/functions/function/invocations.nota
Se você criou a imagem do Docker para a arquitetura do conjunto de instruções ARM64, certifique-se de usar a opção
--platform linux/, em vez dearm64--platform linux/.amd64 -
-
Publique um evento no endpoint local.
-
Obtenha o ID do contêiner.
docker ps -
Use o comando docker kill
para parar o contêiner. Nesse comando, substitua 3766c4ab331cpelo ID do contêiner da etapa anterior.docker kill3766c4ab331c
Para enviar a imagem ao Amazon ECR e criar a função do Lambda
-
Execute o comando get-login-password
para autenticar a CLI do Docker no seu registro do Amazon ECR. -
Defina o valor
--regionpara a Região da AWS onde você deseja criar o repositório do Amazon ECR. -
Substituir
111122223333por seu ID da Conta da AWS.
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
Crie um repositório no Amazon ECR usando o comando create-repository
. aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEnota
O repositório do Amazon ECR deve estar na mesma Região da AWS que a função do Lambda.
Se tiver êxito, você verá uma resposta como esta:
{ "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" } } } -
Copie o
repositoryUrida saída na etapa anterior. -
Execute o comando docker tag
para aplicar uma tag na sua imagem local em seu repositório do Amazon ECR como a versão mais recente. Neste comando: -
docker-image:testé o nome e a tagda sua imagem do Docker. Esse é o nome e a tag da imagem que você especificou no comando docker build. -
Substitua
<ECRrepositoryUri>pelorepositoryUrique você copiou. Certifique-se de incluir:latestno final do URI.
docker tag docker-image:test<ECRrepositoryUri>:latestExemplo:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
Execute o comando docker push
para implantar a imagem local no repositório do Amazon ECR. Certifique-se de incluir :latestno final do URI do repositório.docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
Crie um perfil de execução para a função, caso ainda não tenha um. Você precisará do nome do recurso da Amazon (ARN) do perfil na próxima etapa.
-
Criar a função do Lambda. Em
ImageUri, especifique o URI do repositório anterior. Certifique-se de incluir:latestno final do URI.aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-exnota
É possível criar uma função usando uma imagem em uma conta da AWS diferente desde que a imagem esteja na mesma região da função do Lambda. Para obter mais informações, consulte Permissões entre contas do Amazon ECR.
-
Invoque a função.
aws lambda invoke --function-namehello-worldresponse.jsonVocê obterá uma resposta parecida com esta:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
Para ver a saída da função, verifique o arquivo
response.json.
Para atualizar o código da função, você deve criar a imagem novamente, fazer upload da nova imagem no repositório do Amazon ECR e, em seguida, usar o comando update-function-code
O Lambda resolve a tag de imagem em um resumo de imagem específico. Isso significa que, se você apontar a tag de imagem que foi usada para implantar a função em uma nova imagem no Amazon ECR, o Lambda não atualizará automaticamente a função para usar a nova imagem.
Para implantar a nova imagem na mesma função do Lambda, você deverá usar o comando update-function-code--publish cria uma nova versão da função usando a imagem de contêiner atualizada.
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish