O blog da AWS

O runtime do Node.js 20.x está disponível no AWS Lambda

Este post foi escrito por Pascal Vogel, arquiteto de soluções, e Andrea Amorosi, arquiteta de soluções sênior.

Agora você pode desenvolver funções do AWS Lambda usando o runtime Node.js 20. Esta versão do Node.js está no status LTS ativo e pronta para uso geral. Para usar essa nova versão, especifique o valor do parâmetro de runtime nodejs20.x ao criar ou atualizar funções ou ao usar a imagem base de container apropriada.

Você pode usar o Node.js 20 com o Powertools for AWS Lambda (TypeScript), um kit de ferramentas para desenvolvedores para implementar as melhores práticas Serverless e aumentar a velocidade do desenvolvedor. O Powertools for AWS Lambda inclui bibliotecas comprovadas para oferecer suporte a padrões comuns, como observabilidade, integração com Parameter Store, idempotência, processamento em lote e muito mais.

Você também pode usar o Node.js 20 com o Lambda @Edge, permitindo que você personalize o conteúdo de baixa latência entregue pelo Amazon CloudFront.

Este artigo destaca mudanças importantes no runtime do Node.js, atualizações notáveis da linguagem Node.js e como você pode usar o novo runtime Node.js 20 em seus aplicativos Serverless.

Atualizações de runtime do Node.js 20

Alterações no carregamento do certificado Root CA

Por padrão, o Node.js inclui certificados de autoridade de certificação raiz (CA) de provedores de certificados conhecidos. Os runtimes anteriores do Lambda Node.js até Node.js 18 enriqueceram esses certificados com certificados CA específicos da Amazon, facilitando a criação de funções acessando outros serviços da AWS. Por exemplo, incluiu os certificados do Amazon RDS necessários para validar o certificado de identidade do servidor instalado no seu banco de dados do Amazon RDS.

No entanto, carregar esses certificados adicionais tem um impacto no desempenho durante a inicialização a frio (cold start). A partir do Node.js 20, o Lambda não carrega mais esses certificados CA adicionais por padrão. O runtime do Node.js 20 contém um arquivo de certificado com todos os certificados da Amazon CA localizados em /var/runtime/ca-cert.pem. Ao definir a variável de ambiente NODE_EXTRA_CA_CERTS como /var/runtime/ca-cert.pem, você pode restaurar o comportamento do Node.js 18 e de runtimes anteriores.

Isso faz com que o Node.js valide e carregue todos os certificados da Amazon CA durante uma inicialização a frio. Pode levar mais tempo em comparação com o carregamento somente de certificados específicos. Para obter o melhor desempenho, recomendamos agrupar somente os certificados necessários ao seu pacote de implantação e carregá-los por meio de NODE_EXTRA_CA_CERTS. O arquivo de certificados deve consistir em um ou mais certificados CA raiz ou intermediários confiáveis no formato PEM.

Por exemplo, para RDS, inclua os certificados necessários junto com seu código como certificates/rds.pem e carregue-o da seguinte forma:

NODE_EXTRA_CA_CERTS=/var/task/certificates/rds.pem
Bash

Consulte como usar variáveis de ambiente do Lambda no Guia do desenvolvedor do AWS Lambda para obter instruções detalhadas sobre como definir variáveis de ambiente.

Amazon Linux 2023

O runtime do Node.js 20 é baseado no runtime provided.al2023. O runtime provided.al2023, por sua vez, é baseado na versão mínima de imagem de container do Amazon Linux 2023 e traz várias melhorias em relação ao Amazon Linux 2 (AL2).

O provided.al2023 contém somente os componentes essenciais necessários para instalar outros pacotes e oferece um espaço de implantação menor com um tamanho de imagem compactado de menos de 40 MB em comparação com a imagem base de mais de 100 MB baseada em Al2.

Com a versão 2.34 da glibc, os clientes têm acesso a uma versão mais recente da glibc, atualizada da versão 2.26 em imagens baseadas em AL2.

A imagem mínima do Amazon Linux 2023 usa microdnf como gerenciador de pacotes, com link simbólico como dnf, substituindo o yum em imagens baseadas em AL2. Além disso, curl e gnupg2 também estão incluídos como suas versões mínimas curl-minimal e gnupg2-minimal.

Saiba mais sobre o runtime provided.al2023 neste post Apresentando o runtime do Amazon Linux 2023 para o AWS Lambda e no post de lançamento do Amazon Linux 2023.

Interface Cliente de runtime

O runtime do Node.js 20 usa o AWS Lambda NodeJS Runtime Interface Client (RIC) de código aberto. Agora você pode usar a mesma versão do RIC em suas imagens de container Lambda da Open Container Initiative (OCI) que a usada pelo runtime gerenciado do Node.js 20.

O runtime do Node.js 20 oferece suporte ao streaming de resposta Lambda, que permite enviar dados de carga útil de resposta aos chamadores assim que estiverem disponíveis. O streaming de respostas pode melhorar o desempenho do aplicativo ao reduzir o tempo até o primeiro byte, pode indicar o progresso durante tarefas de longa execução e permite que você crie funções que retornam cargas maiores que 6 MB, que é o limite do Lambda para respostas armazenadas em buffer.

Configurando o tamanho do heap de memória do Node.js

O Node.js permite que você configure o tamanho do heap do motor v8 por meio das opções --max-old-space-size e --max-semi-space-size. Por padrão, o Lambda substitui os valores padrão do Node.js por valores derivados do tamanho da memória configurado para a função. Se você precisar controlar a alocação de memória do seu runtime, agora você pode definir essas duas opções usando a variável de ambiente NODE_OPTIONS, sem precisar de um script exec wrapper. Consulte Como usar variáveis de ambiente do Lambda no Guia do desenvolvedor do AWS Lambda para obter detalhes.

Use a opção –max-old-space-size para definir o tamanho máximo de memória da seção de memória antiga do V8 e a opção –max-semi-space-size para definir o tamanho máximo do semiespaço para o garbage collector do V8. Consulte a documentação do Node.js para obter mais detalhes sobre essas opções.

Atualizações de idioma do Node.js 20

Características da linguagem

Com essa versão, os clientes do Lambda podem aproveitar os novos recursos da linguagem Node.js 20, incluindo:

  • HTTP (S) /1.1 default KeepAlive: Node.js agora define o KeepAlive como true por padrão. Qualquer conexão HTTPS de saída usa HTTP 1.1 keep-alive com uma janela de espera padrão de 5 segundos. Isso pode oferecer uma taxa de transferência aprimorada à medida que as conexões são reutilizadas por padrão.
  • A API Fetch é ativada por padrão: A API global Node.js Fetch API está ativada por padrão. No entanto, ainda é um módulo experimental.
  • Análise de URL mais rápida: o Node.js 20 vem com o analisador de URL Ada 2.0, que traz melhorias de desempenho na análise de URL. Isso também foi transferido para o Node.js 18.7.0.
  • API Web Crypto agora estável: a implementação Node.js da API Web Crypto padrão foi marcada como estável. Você pode acessar as primitivas criptográficas fornecidas por meio de GlobalThis.crypto.
  • Suporte de montagem na Web: o Node.js 20 ativa a API experimental WebAssembly System Interface (WASI) por padrão, sem a necessidade de definir um sinalizador experimental.

Para uma visão geral detalhada dos recursos da linguagem Node.js 20, consulte a postagem do blog de lançamento do Node.js 20 e o changelog do Node.js 20.

Considerações sobre desempenho

O Node.js 19.3 introduziu uma alteração que afeta a forma como os módulos não essenciais são carregados lentamente durante a inicialização do processo Node.js. Em termos do impacto nas funções do Lambda, isso reduz o trabalho durante a inicialização de cada ambiente de execução e, se usados, os módulos serão carregados durante a primeira chamada da função. Essa alteração permanece no Node.js 20.

Os desenvolvedores devem continuar medindo e testando o desempenho da função e otimizando o código e a configuração da função para qualquer impacto. Para saber mais sobre como otimizar o desempenho do Node.js no Lambda, consulte Otimização de desempenho no Guia do operador do Lambda e nossa postagem no blog Otimizando dependências do Node.js no AWS Lambda.

Migração de runtimes anteriores do Node.js

Migração do Node.js 16

Ocasionalmente, o serviço do AWS Lambda atrasa a descontinuação de um runtime do Lambda por um período limitado além da data de término do suporte da versão da linguagem compatível com o runtime. Durante esse período, o Lambda aplica apenas patches de segurança ao sistema operacional em runtime. O Lambda não aplica patches de segurança aos runtimes da linguagem de programação depois que eles atingem a data de fim do suporte.

No caso do Node.js 16, adiamos a descontinuação do fim do suporte da comunidade em 11 de setembro de 2023 para 12 de junho de 2024. Isso dá aos clientes a oportunidade de migrar diretamente do Node.js 16 para o Node.js 20, ignorando o Node.js 18.

SDK da AWS para JavaScript

Até o Node.js 16, os runtimes do Node.js do Lambda incluíam o SDK da AWS para JavaScript versão 2. Desde então, isso foi substituído pelo AWS SDK para JavaScript versão 3, lançado em dezembro de 2020. Começando com o Node.js 18 e continuando com o Node.js 20, os runtimes do Lambda Node.js atualizaram a versão do AWS SDK para JavaScript incluída no runtime de v2 para v3. Os clientes que estão atualizando do Node.js 16 ou versões anteriores que estão usando o SDK da AWS para JavaScript v2 incluído devem atualizar seu código para usar o SDK v3.

Para um desempenho ideal e para ter controle total sobre suas dependências de código, recomendamos agrupar e reduzir o SDK da AWS em seu pacote de implantação, em vez de usar o SDK incluído no runtime. Para obter mais informações, consulte Otimização das dependências do Node.js no AWS Lambda.

Usando o runtime Node.js 2.0 no AWS Lambda

Console de gerenciamento da AWS

Para usar o runtime do Node.js 20 para desenvolver suas funções do Lambda, especifique um valor de parâmetro de runtime Node.js 20.x ao criar ou atualizar uma função. A versão de runtime do Node.js 2.0 agora está disponível no menu suspenso Runtime na página Criar função no console do AWS Lambda:

Select Node.js 20.x when creating a new AWS Lambda function in the AWS Management Console

Para atualizar uma função Lambda existente para o Node.js 20, navegue até a função no console do Lambda e escolha Editar no painel de configurações do Runtime. A nova versão do Node.js está disponível no menu suspenso Runtime:

Select Node.js 20.x when updating an existing AWS Lambda function in the AWS Management Console

AWS Lambda — Imagem de container

Altere a versão da imagem base do Node.js modificando a instrução FROM em seu Dockerfile:

FROM public.ecr.aws/lambda/nodejs:20
# Copy function code
COPY lambda_handler.xx ${LAMBDA_TASK_ROOT}
Docker

Os clientes que executam imagens do Docker Node.js 20 localmente, incluindo clientes que usam o AWS SAM, precisarão atualizar sua instalação do Docker para a versão 20.10.10 ou posterior.

Modelo de aplicativo Serverless da AWS (AWS SAM)

No AWS SAM, defina o atributo Runtime como node20.x para usar esta versão:


AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: nodejs20.x
      CodeUri: my_function/.
      Description: My Node.js Lambda Function
YAML

Kit de desenvolvimento de nuvem da AWS (AWS CDK)

No AWS CDK, defina o atributo de runtime como runtime.nodejs_20_x para usar esta versão:


import * as cdk from "aws-cdk-lib";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as path from "path";
import { Construct } from "constructs";

export class CdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    // The Node.js 20 enabled Lambda Function
    const lambdaFunction = new lambda.Function(this, "node20LambdaFunction", {
      runtime: lambda.Runtime.NODEJS_20_X,
      code: lambda.Code.fromAsset(path.join(__dirname, "/../lambda")),
      handler: "index.handler",
    });
  }
}
JavaScript

Conclusão

O Lambda agora oferece suporte ao Node.js 20. Esta versão usa o sistema operacional Amazon Linux 2023, oferece suporte ao carregamento configurável de certificados CA para inicializações a frio mais rápidas, além de outras melhorias detalhadas nesta postagem do blog.

Você pode criar e implantar funções usando o runtime Node.js 20 usando o AWS Management Console, o AWS CLI, o AWS SDK, o AWS SAM, o AWS CDK ou a infraestrutura como código (IaC) de sua escolha. Você também pode usar a imagem base do container Node.js 20 se preferir criar e implantar suas funções usando imagens de container.

O runtime do Node.js 20 capacita os desenvolvedores a criar aplicativos Serverless mais eficientes, poderosos e escaláveis. Experimente o runtime do Node.js no Lambda hoje e leia sobre o modelo de programação Node.js na documentação do Lambda para saber mais sobre como escrever funções no Node.js 20.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land.

Este conteúdo foi traduzido para Português do blog original em inglês (link aqui).

Biografia dos autores

Pascal Vogel é arquiteto de soluções na AWS
Andrea Amorosi é arquiteto de soluções sênior.


Biografia do tradutor

Daniel Abib é arquiteto de soluções sênior na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/

Biografia do revisor

Rodrigo Peres é um Solutions Architect na AWS, com mais de 20 anos trabalhando com arquitetura de soluções, desenvolvimento de sistemas e modernização de sistemas legados.