Implantar funções do Lambda em Node.js com imagens de contêiner
Existem três maneiras de criar uma imagem de contêiner para uma função do Lambda em Node.js:
-
Usar uma imagem base da AWS para Node.js
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. Você também pode 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 para Node.js na imagem. -
Usar uma imagem base que não é da AWS
Você também pode usar uma imagem base alternativa de outro registro de contêiner, como Alpine Linux ou Debian. Você também pode 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 para Node.js 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 Node.js
A AWS oferece as seguintes imagens base para Node.js:
| Tags | Runtime | Sistema operacional | Dockerfile | Desaprovação |
|---|---|---|---|---|
22 |
Node.js 22 | Amazon Linux 2023 | Dockerfile para Node.js 22 no GitHub |
30 de abril de 2027 |
20 |
Node.js 20 | Amazon Linux 2023 | Dockerfile para Node.js 20 no GitHub |
30 de abril de 2026 |
Repositório do Amazon ECR: gallery.ecr.aws/lambda/nodejs
As imagens base do Node.js 20 e posteriores são baseadas na imagem de contêiner mínimo do Amazon Linux 2023. Imagens base anteriores usam o Amazon Linux 2. O AL2023 oferece várias vantagens em relação ao Amazon Linux 2, incluindo uma área de implantação menor e versões atualizadas de bibliotecas, como glibc.
As imagens baseadas no AL2023 usam o microdnf (com link simbólico dnf) como o gerenciador de pacotes, em vez do yum, que é o gerenciador de pacotes padrão no Amazon Linux 2. O microdnf é uma implementação autônoma do dnf. Para obter uma lista dos pacotes incluídos nas imagens baseadas no AL2023, consulte as colunas Contêiner mínimo em Comparar pacotes instalados em imagens de contêiner do Amazon Linux 2023. Para obter mais informações sobre as diferenças entre o AL2023 e o Amazon Linux 2, consulte Introdução ao runtime do Amazon Linux 2023 para AWS Lambda
nota
Para executar imagens baseadas no AL2023 localmente, inclusive com o AWS Serverless Application Model (AWS SAM), você deve usar o Docker versão 20.10.10 ou posterior.
Usar uma imagem base da AWS para Node.js
Para executar as etapas desta seção, você deve ter o seguinte:
Para criar uma imagem de contêiner a partir de uma imagem base da AWS para Node.js
-
Crie um diretório para o projeto e depois mude para esse diretório.
mkdir example cd example -
Crie um novo projeto Node.js com o
npm. Para aceitar as opções padrão fornecidas na experiência interativa, pressioneEnter.npm init -
Crie um novo arquivo chamado
index.js. É 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 Manipulador CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; -
Se a função depender de outras bibliotecas que não o AWS SDK para JavaScript, use o npm
para adicioná-las ao seu pacote. -
Crie um novo Dockerfile com 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/nodejs:22# Copy function code COPYindex.js${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "index.handler" ] -
-
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 em Node.js
npm install aws-lambda-ric
Você também pode fazer download do cliente de interface de runtime Node.js
O exemplo a seguir demonstra como criar uma imagem de contêiner para Node.js usando uma imagem base que não é da AWS. O exemplo de Dockerfile usa a imagem base da bookworm. 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 de uma imagem base que não é da AWS
-
Crie um diretório para o projeto e depois mude para esse diretório.
mkdir example cd example -
Crie um novo projeto Node.js com o
npm. Para aceitar as opções padrão fornecidas na experiência interativa, pressioneEnter.npm init -
Crie um novo arquivo chamado
index.js. É 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 Manipulador CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; -
Crie um novo Dockerfile. O Dockerfile a seguir usa uma imagem base de
bookwormem vez de uma imagem base da AWS. O Dockerfile inclui o cliente de interface de runtime, o que torna a imagem compatível com o Lambda. O Dockerfile usa uma compilação em vários estágios . O primeiro estágio cria uma imagem de compilação, que é um ambiente Node.js padrão em que as dependências da função são instaladas. O segundo estágio cria uma imagem mais fina que inclui o código da função e suas dependências. Isso reduz o tamanho final da imagem. -
Defina a propriedade
FROMcomo o identificador da imagem base. -
Use o comando
COPYpara copiar o código da função e as dependências do runtime. -
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
# Define custom function directory ARG FUNCTION_DIR="/function" FROMnode:20-bookwormas build-image # Include global arg in this stage of the build ARG FUNCTION_DIR # Install build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Copy function code RUN mkdir -p ${FUNCTION_DIR} COPY . ${FUNCTION_DIR} WORKDIR ${FUNCTION_DIR} # Install Node.js dependencies RUN npm install # Install the runtime interface client RUN npm install aws-lambda-ric # Grab a fresh slim copy of the image to reduce the final size FROMnode:20-bookworm-slim# Required for Node runtimes which use npm@8.6.0+ because # by default npm writes logs under /home/.npm and Lambda fs is read-only ENV NPM_CONFIG_CACHE=/tmp/.npm # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the built dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} # Set runtime interface client as default command for the container runtime ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"] # Pass the name of the function handler as an argument to the runtime CMD ["index.handler"] -
-
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. -
/usr/local/bin/npx aws-lambda-ric index.handleré 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