O blog da AWS

Apresentando o runtime do Amazon Linux 2023 para o AWS Lambda

Por Rakshith Rao, Senior Solutions Architect

 

O AWS Lambda agora oferece suporte ao Amazon Linux 2023 (AL2023) como um runtime gerenciado e uma imagem base de contêineres. Chamado provided.al2023, esse runtime fornece um ambiente somente de sistema operacional para executar suas funções do Lambda.Ele se baseia na versão mínima de imagem de contêiner do Amazon Linux 2023 e tem várias melhorias em relação ao Amazon Linux 2 (AL2), como uma área de implantação menor, versões atualizadas de bibliotecas como glibc e um novo gerenciador de pacotes.

O que são runtimes do Lambda para o sistema operacional?

Os runtimes do Lambda definem o ambiente de execução em que sua função é executada. Eles fornecem o sistema operacional, suporte a idiomas e configurações adicionais, como variáveis de ambiente e certificados.

O Lambda fornece runtimes gerenciados para Java, Python, Node.js, .NET e Ruby. No entanto, se você quiser desenvolver suas funções do Lambda em linguagens de programação que não são suportadas pelos runtimes da linguagem gerenciada do Lambda, a família de runtime “fornecida” disponibiliza um ambiente somente de sistema operacional no qual você pode executar código escrito em qualquer linguagem. Esta versão estende a família de runtime fornecida para oferecer suporte ao Amazon Linux 2023.

Os clientes usam esses runtimes somente do sistema operacional em três cenários comuns. Primeiro, eles são usados com linguagens que compilam para código nativo, como Go, Rust, C++, .NET Native AOT e Java GraalVM Native. Como você só carrega o binário compilado para o Lambda, essas linguagens não exigem um runtime de linguagem dedicado, elas exigem apenas um ambiente de sistema operacional no qual o binário possa ser executado.

Em segundo lugar, os runtimes exclusivos do sistema operacional também permitem a criação de runtimes de idiomas de terceiros que você pode usar imediatamente. Por exemplo, você pode escrever funções Lambda em PHP usando Bref ou Swift usando o Swift AWS Lambda Runtime.

Em terceiro lugar, você pode usar o runtime exclusivo do sistema operacional para implantar runtimes personalizados, que você cria para uma linguagem ou versão de linguagem que o Lambda não fornece um runtime gerenciado. Por exemplo, Node.js 19 — Lambda fornece apenas runtimes gerenciados para versões LTS, que para Node.js são as versões com números pares.

Novidades da imagem base do Amazon Linux 2023 para Lambda

Pacotes atualizados

A imagem base do AL2023 para Lambda é baseada na imagem de contêiner AL2023-Minimal e inclui várias atualizações e alterações de pacotes em comparação com provided.al2.

A versão da glibc na imagem base do AL2023 foi atualizada para 2.34, da 2.26 que estava incluída na imagem base do AL2. Algumas bibliotecas que os desenvolvedores queriam usar nos runtimes fornecidos exigiam versões mais recentes do glibc. Com esse lançamento, agora você pode usar uma versão atualizada do glibc com sua função Lambda.

A imagem base AL2 para Lambda veio pré-instalada com o Python 2.7. Isso foi necessário porque o Python era uma dependência necessária para alguns dos pacotes que estavam agrupados na imagem base. A imagem base AL2023 do Lambda removeu essa dependência do Python 2.7 e não vem com nenhum runtime de linguagem pré-instalado. Você pode escolher e instalar qualquer versão compatível do Python de que precisar.

Como a imagem base do AL2023 para Lambda é baseada na distribuição mínima do AL2023, você também se beneficia de uma área de implantação significativamente menor. A nova imagem tem menos de 40 MB em comparação com a imagem base baseada em AL2, que tem mais de 100 MB de tamanho. Você pode encontrar a lista completa de pacotes disponíveis na imagem base do AL2023 do Lambda na coluna “contêiner mínimo” da documentação da lista de pacotes do AL2023.

Gerenciador de pacotes

O Amazon Linux 2023 usa dnf como gerenciador de pacotes, substituindo o yum, que era o gerenciador de pacotes padrão no Amazon Linux 2. A imagem base AL2023 para Lambda usa microdnf como gerenciador de pacotes, que é uma implementação autônoma do dnf baseada em libdnf e não requer dependências extras, como Python. O microdnf em provided.al2023 tem um link simbólico (symlinked) como dnf. Observe que o microdnf não suporta todas as opções de dnf. Por exemplo, você não pode instalar um rpm remoto usando o URL do rpm ou instalar um arquivo rpm local. Em vez disso, você pode usar o comando rpm diretamente para instalar esses pacotes.

Este exemplo de Dockerfile mostra como você pode instalar pacotes usando dnf ao criar uma função Lambda baseada em contêiner:

# Use the Amazon Linux 2023 Lambda base image
FROM public.ecr.aws/lambda/provided.al2023

# Install the required Python version
RUN dnf install -y python3
Docker

Suporte de runtime

Com o lançamento do provided.al2023, você pode migrar imediatamente suas funções Lambda personalizadas baseadas em runtime do AL2. Ele também define a base dos futuros runtimes gerenciados pelo Lambda. As futuras versões de runtimes de linguagem gerenciada, como Node.js 20, Python 3.12, Java 21 e .NET 8, são baseadas no Amazon Linux 2023 e usarão provided.al2023 como imagem base.

Alterando os runtimes e usando outros serviços de computação

Anteriormente, a imagem provided.al2023 era criada como uma imagem personalizada que usava uma seleção de pacotes do AL2. Ele incluía pacotes como curl e yum, necessários para criar funções usando o runtime personalizado. Além disso, cada runtime de linguagem gerenciada usou pacotes diferentes com base no caso de uso.

Como as versões futuras de runtimes gerenciados usam provided.al2023 como imagem base, elas contêm o mesmo conjunto de pacotes básicos que vêm com o AL2023-minimal. Isso simplifica a migração da função Lambda de um runtime personalizado para um runtime de linguagem gerenciada. Também facilita a mudança para outros serviços de computação, como o AWS Fargate ou o Amazon Elastic Container Services (ECS), para executar seu aplicativo.

Atualização a partir de runtimes baseados em AL1

Para obter mais informações sobre a depreciação do runtime do Lambda, consulte Runtimes do Lambda.

O fim do suporte do AL1 está programado para 31 de dezembro de 2023. Os runtimes baseados em AL1 go1.x, java8 e provided serão descontinuados a partir dessa data. Você deve migrar suas funções do Lambda baseadas em Go para a família de runtime fornecida, como provided.al2 ou provided.al2023. Usar um runtime fornecido oferece vários benefícios em relação ao runtime go1.x. Primeiro, você pode executar suas funções do Lambda nos processadores AWS Graviton2 que oferecem uma relação preço-desempenho até 34% melhor em comparação com funções executadas em processadores x86_64. Em segundo lugar, ele oferece um pacote de implantação menor e um caminho de invocação de função mais rápido. E terceiro, ele alinha o Go com outras linguagens que também são compiladas em código nativo e executadas na família de runtime fornecido.

A descontinuação da imagem base do Amazon Linux 1 (AL1) para o Lambda também está programada para 31 de dezembro de 2023. Com o provided.al2023 agora disponível ao público em geral, você deve começar a planejar a migração de suas funções Lambda baseadas em go1.x e AL1 para provided.al2023.

Usando a imagem base AL2023 para Lambda

Para criar funções do Lambda usando um runtime personalizado, siga estas etapas usando o runtime provided.al2023.

Console de gerenciamento da AWS

Navegue até a página Criar função no console Lambda. Para usar o runtime personalizado do AL2023, selecione Forneça seu próprio bootstrap no Amazon Linux 2023 como o valor do runtime:

Runtime value

Modelo de template do Serverless Application Model (AWS SAM)

Se você usa o template do AWS SAM para criar e implantar sua função Lambda, use provided.al2023 como o valor do Runtime:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: my.bootstrap.file
      Runtime: provided.al2023
YAML

Criação de funções do Lambda que compilam nativamente

O runtime personalizado do Lambda simplifica a experiência de criar funções em linguagens que são compiladas em código nativo, ampliando a variedade de linguagens que você pode usar. O Lambda fornece a API Runtime, uma API HTTP que runtimes personalizados podem usar para interagir com o serviço Lambda. As implementações dessa API, chamada Runtime Interface Client (RIC), permitem que sua função receba eventos de invocação do Lambda, envie a resposta de volta ao Lambda e relate erros ao serviço Lambda. Os RICs estão disponíveis como bibliotecas específicas de linguagem para várias linguagens de programação populares, como Go, Rust, Python e Java.

Por exemplo, você pode criar funções usando Go, conforme mostrado na seção Building with Go da documentação do desenvolvedor do Lambda. Observe que o nome do arquivo executável da sua função sempre deve ser bootstrap em provided.al2023 ao usar o modelo de implantação zip. Para usar o AL2023 neste exemplo, use provided.al2023 como o runtime da sua função Lambda.

Se você estiver usando CLI, defina a opção —runtime como provided.al2023:

aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
Bash

Se você estiver usando o AWS Serverless Application Model, use provided.al2023 como o valor do Runtime em seu arquivo de modelo do AWS SAM:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Metadata:
      BuildMethod: go1.x
    Properties:
      CodeUri: hello-world/ # folder where your main program resides
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures: [arm64]
YAML

Se você executar sua função como uma imagem de contêiner, conforme mostrado no exemplo de imagem de contêiner Deploy, use este Dockerfile. Você pode usar qualquer nome para o arquivo executável da sua função ao usar imagens de contêiner. Você precisa especificar o nome do executável como ENTRYPOINT em seu Dockerfile:

FROM golang:1.20 as build
WORKDIR /helloworld

# Copy dependencies list
COPY go.mod go.sum ./

# Build with optional lambda.norpc tag
COPY main.go .
RUN go build -tags lambda.norpc -o main main.go

# Copy artifacts to a clean image
FROM public.ecr.aws/lambda/provided:al2023
COPY --from=build /helloworld/main ./main
ENTRYPOINT [ "./main" ]
Docker

Conclusão

Com esse lançamento, agora você pode criar suas funções do Lambda usando o Amazon Linux 2023 como runtime personalizado ou usá-lo como imagem base para executar suas funções do Lambda baseadas em contêineres. Você se beneficia das versões atualizadas de bibliotecas, como glibc, novo gerenciador de pacotes e tamanho de implantação menor do que os runtimes baseados no Amazon Linux 2. O Lambda também usa o Amazon Linux 2023-minimal como base para futuras versões de runtime do Lambda.

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

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Rakshith Rao é arquiteto sênior de soluções

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect 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/