O blog da AWS

O runtime do Python 3.11 agora disponível no AWS Lambda

P or Ramesh Mathikumar, consultor sênior de DevOps , Francesco Vergona, arquiteto de soluções 

O AWS Lambda agora oferece suporte ao Python 3.11 como ambiente de execução gerenciado e imagem base de contêiner. O Python 3.11 contém aprimoramentos de desempenho significativos em relação ao Python 3.10. Recursos como tempo de inicialização reduzido, estruturas de pilha simplificadas e interpretador adaptativo especializado em CPython ajudam muitas cargas de trabalho usando o Python 3.11 a serem executadas de forma mais rápida e barata, graças ao modelo de cobrança por milissegundo do Lambda. Com essa versão, os desenvolvedores de Python agora podem aproveitar os novos recursos e melhorias introduzidos no Python 3.11 ao criar aplicativos Serverless no Lambda.

Você pode usar o Python 3.11 com o Lambda Powertools for Python, um kit de ferramentas para desenvolvedores para implementar as melhores práticas Serverless e aumentar a velocidade do desenvolvedor. O Lambda Powertools inclui bibliotecas verificadas para oferecer suporte a padrões comuns, como observabilidade, integração de armazenamento de parâmetros, idempotência, processamento em lote, sinalizadores de recursos e muito mais. Saiba mais sobre o PowerTools for AWS Lambda for Python na documentação.

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

Python é uma linguagem popular para criar aplicativos Serverless. A versão 3.11 do Python inclui melhorias de desempenho e novos recursos de linguagem. Para clientes que implantam suas funções do Lambda usando imagem de contêiner, a imagem base do Python 3.11 também inclui alterações para facilitar o gerenciamento de pacotes instalados.

Este blog analisa essas mudanças, seguidas por uma visão geral de como você pode começar a usar o Python 3.11 no Lambda.

Melhorias de desempenho

As otimizações do CPython introduzidas pelo Python 3.11 trazem melhorias significativas de desempenho, tornando-o em média 25% mais rápido do que o Python 3.10, com base nos testes de benchmark da comunidade Python usando o Python Performance Benchmark Suite.

Esta versão se concentra em duas áreas principais:

  • Inicialização mais rápida: os módulos principais e essenciais para o Python agora estão “congelados”, com objetos de código alocados estaticamente, resultando em uma inicialização do interpretador de 10 a 15% mais rápida em relação ao Python 3.10.
  • Execução mais rápida de funções: as melhorias incluem a criação simplificada de quadros, chamadas de função Python in-lined para reduzir o uso da pilha C e a implementação de um intérprete adaptativo especializado, que especializa o interpretador em “código ativo” (código executado várias vezes) e na redução da sobrecarga durante a execução.

Essas otimizações podem melhorar o desempenho em 10 a 60%, dependendo da carga de trabalho. No contexto da execução de uma função Lambda, isso resulta em melhorias de desempenho para invocações de “inicialização a frio” e “inicialização a quente”

Além de melhorias mais rápidas no desempenho do CPython, o Python 3.11 também fornece melhorias de desempenho em outras áreas. Por exemplo:

  • A formatação de strings com códigos printf-style% agora é tão rápida quanto as expressões f-string.
  • A divisão de números inteiros é cerca de 20% mais rápida em x86-64 em determinados cenários.
  • Operações como sum () e redimensionamento de listas tiveram melhorias notáveis na velocidade.
  • Os dicionários economizam memória ao não armazenar valores de hash quando as chaves são objetos Unicode.
  • Melhorias no asyncio. O DatagramProtocol introduz transferências de arquivos grandes significativamente mais rápidas via UDP.
  • Funções matemáticas, funções estatísticas e unicodedata.normalize () também se beneficiam de melhorias substanciais na velocidade.

Características da linguagem

Graças à sua simplicidade, legibilidade e amplo suporte da comunidade, o Python é uma linguagem popular para criar aplicativos Serverless. A versão 3.11 do Python inclui vários novos recursos de linguagem, incluindo:

  • Genéricos variáveis (PEP 646): o Python 3.11 introduz o TypeVarTuple, permitindo a parametrização com um número arbitrário de tipos.
  • Marcar itens individuais do TypedDict como necessários ou não obrigatórios (PEP 655): A introdução de Required e NotRequired no TypedDict permite a marcação explícita dos requisitos de itens individuais, eliminando a necessidade de herança.
  • Tipo próprio (PEP 673): A anotação Self simplifica a anotação de métodos que retornam uma instância de sua classe, de forma semelhante ao TypeVar no PEP 484
  • Tipo de string literal arbitrário (PEP 675): a anotação literalString permite que um parâmetro de função aceite qualquer tipo de string literal, incluindo strings criadas a partir de literais.
  • Transformações de classe de dados (PEP 681): O decorador @dataclass_transform () permite que os objetos utilizem transformações de runtime para funcionalidades semelhantes às de classes de dados.

Para ver a lista completa das alterações do Python 3.11, consulte as notas de lançamento do Python 3.11.

Alteração na localização dos módulos pré-instalados e no caminho de pesquisa

Anteriormente, as imagens de contêiner base do Lambda para Python incluíam o diretório /var/runtime antes do diretório /var/lang/lib/python3.x no caminho de pesquisa. Isso significa que os pacotes em /var/runtime são carregados em vez dos pacotes instalados via pip em /var/lang/lib/python3.x. Como o SDK da AWS para Python (boto3/botocore) foi pré-instalado em /var/runtime, isso dificultou que os clientes de imagens de contêiner básicas atualizassem a versão do SDK.

Com o runtime do Python 3.11, o SDK da AWS e suas dependências agora estão pré-instalados no diretório /var/lang/lib/python3.11, e o caminho de pesquisa foi modificado para que esse diretório tenha precedência sobre /var/runtime. Essa mudança significa que os clientes que criam e implantam funções do Lambda usando a imagem de contêiner base do Python 3.11 agora podem substituir o SDK simplesmente executando pip install em uma versão mais recente. Essa alteração também permite que o pip verifique e rastreie se o SDK pré-instalado e suas dependências são compatíveis com qualquer pacote instalado pelo cliente.

Este é o sys.path padrão antes do Python 3.11 (onde X.Y é a versão major.minor do Python):

  • /var/task/: Função do usuário
  • /opt/python/lib/pythonX.Y/site-packages/: Camada de usuário
  • /opt/python/: Camada de usuário
  • /var/runtime/: módulos pré-instalados
  • /var/lang/lib/pythonX.Y/site-packages/: local padrão de instalação do pip

Aqui está o sys.path padrão a partir do Python 3.11:

  • /var/task/: Função do usuário
  • /opt/python/lib/pythonX.Y/site-packages/: Camada de usuário
  • /opt/python/: Camada de usuário
  • /var/lang/lib/pythonX.Y/site-packages/: módulos pré-instalados e local padrão de instalação do pip
  • /var/runtime/: Sem módulos pré-instalados

Usando o Python 3.11 no Lambda

Console de gerenciamento da AWS

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

Create function

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

Edit function

AWS Lambda — Imagem de contêiner

Altere a versão da imagem base do Python modificando a instrução FROM no Dockerfile:

FROM public.ecr.aws/lambda/python:3.11
# Copy function code
COPY lambda_handler.py ${LAMBDA_TASK_ROOT}
Docker

Para saber mais, consulte a guia de uso sobre como criar funções como imagens de contêiner.

Modelo de aplicativo Serverless da AWS (AWS SAM)

No AWS SAM, defina o atributo Runtime como python3.11 para usar essa versão.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple Lambda Function
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Description: My Python Lambda Function
      CodeUri: my_function/
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
YAML

O AWS SAM oferece suporte à geração desse modelo com o Python 3.11 pronto para uso para novos aplicativos Serverless usando o comando sam init. Consulte a documentação do AWS SAM aqui.

Kit de desenvolvimento de nuvem da AWS (AWS CDK)

No AWS CDK, defina o atributo de runtime como  Runtime.PYTHON_3_11 para usar essa versão. Em Python:

from constructs import Construct 
from aws_cdk import ( App, Stack, aws_lambda as _lambda )

class SampleLambdaStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
        
        base_lambda = _lambda.Function(self, 'SampleLambda', 
                                       handler='lambda_handler.handler', 
                                    runtime=_lambda.Runtime.PYTHON_3_11, 
                                 code=_lambda.Code.from_asset('lambda'))
Python

Em TypeScript:

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 python3.11 enabled Lambda Function
    const lambdaFunction = new lambda.Function(this, 'python311LambdaFunction', {
      runtime: lambda.Runtime.PYTHON_3_11,
      memorySize: 512,
      code: lambda.Code.fromAsset(path.join(__dirname, '/../lambda')),
      handler: 'lambda_handler.handler'
    })
  }
}
TypeScript

Conclusão

Você pode criar e implantar funções usando o Python 3.11 usando o Console de Gerenciamento da AWS, 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 contêiner Python 3.11 se preferir criar e implantar suas funções usando imagens de contêiner.

Estamos empolgados em trazer o suporte de runtime do Python 3.11 para o Lambda e capacitar os desenvolvedores a criar aplicativos Serverless mais eficientes, poderosos e escaláveis. Experimente o runtime do Python 3.11 no Lambda hoje e experimente os benefícios dessa versão atualizada da linguagem e aproveite o desempenho aprimorado e os novos recursos da linguagem.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land

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

 


Sobre o autor

Ramesh Mathikumar é Senior DevOps Consultant

 

 

 

 

Francesco Vergona é Solutions Architect.

 

 

 

 

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/