Blog de Amazon Web Services (AWS)

El tiempo de ejecución Python 3.12 ya está disponible en AWS Lambda

Esta publicación fue escrita por Jeff Gebhart, Sr. Specialist TAM, Serverless. Traducida al español por Sebastián Vásquez, Technical Account Manager.

AWS Lambda ahora es compatible con Python 3.12 como tiempo de ejecución gestionado y como imagen base de contenedores. Python 3.12 se basa en las mejoras de rendimiento que se publicaron por primera vez con Python 3.11, y añade una serie de características de rendimiento y legibilidad del lenguaje en el intérprete. Con esta versión, los desarrolladores de Python ahora pueden aprovechar estas nuevas características y mejoras al crear aplicaciones sin servidor en AWS Lambda.

Puede utilizar Python 3.12 con Powertools para AWS Lambda (Python), un conjunto de herramientas para desarrolladores que permiten implementar las mejores prácticas serverless, como observabilidad, procesamiento por lotes, integración de AWS SSM Parameter Store, idempotencia, feature flags, métricas de CloudWatch y logs estructurados, entre otras características.

También puede usar Python 3.12 con Lambda @Edge, lo que le permite personalizar el contenido de baja latencia entregado a través de Amazon CloudFront.

Python es un lenguaje popular para crear aplicaciones serverless. La versión 3.12 de Python incluye una serie de mejoras sintácticas y de interpretación.

En el lanzamiento, los nuevos tiempos de ejecución de Lambda reciben menos uso que los tiempos de ejecución establecidos existentes. Esto puede provocar tiempos de arranque en frío más prolongados debido a la reducción de la residencia de la caché en los subsistemas internos de AWS Lambda. Los tiempos de arranque en frío suelen mejorar en las semanas posteriores al lanzamiento a medida que aumenta el uso. En consecuencia, AWS recomienda no sacar conclusiones a partir de comparaciones paralelas del rendimiento con otros tiempos de ejecución de AWS Lambda hasta que el rendimiento se haya estabilizado. Dado que el rendimiento depende en gran medida de la carga de trabajo, los clientes con cargas de trabajo sensibles al rendimiento deberían realizar sus propias pruebas, en lugar de basarse en puntos de referencia de pruebas genéricos.

Cambios en el tiempo de ejecución de Lambda

Amazon Linux 2023

El tiempo de ejecución de Python 3.12 se basa en el tiempo de ejecución provided.al2023, que se basa en la imagen mínima de contenedor de Amazon Linux 2023. Esta actualización del sistema operativo incorpora varias mejoras con respecto al sistema operativo basado en Amazon Linux 2 (AL2) utilizado en los tiempos de ejecución de Lambda Python, desde Python 3.8 hasta Python 3.11.

provided.al2023 contiene solo los componentes esenciales necesarios para instalar otros paquetes y ofrece un espacio de implementación más reducido, inferior a 40 MB, en comparación con los más de 100 MB de las imágenes basadas en AL2 de Lambda.

Con la versión 2.34 de glibc, los clientes tienen acceso a una versión moderna de glibc, actualizada a partir de la versión 2.26 en imágenes basadas en AL2.

La imagen mínima de Amazon Linux 2023 usa microdnf como administrador de paquetes, y está symlinked como dnf. Esto reemplaza al administrador de paquetes yum utilizado en las imágenes anteriores basadas en AL2. Si despliega sus funciones de Lambda como imágenes de contenedor, debe actualizar sus Dockerfiles para que usen dnf en lugar de yum al actualizar a la imagen base de Python 3.12.

Además, curl y gnupg2 también se incluyen como versiones mínimas, curl-minimal y gnupg2-minimal.

Obtenga más información sobre el tiempo de ejecución provided.al2023 en la entrada del blog “presentando el tiempo de ejecución de Amazon Linux 2023 para AWS Lambda“ y la entrada del blog sobre el lanzamiento de Amazon Linux 2023.

Cambio de formato de respuesta

A partir del tiempo de ejecución de Python 3.12, las funciones devuelven caracteres Unicode como parte de su respuesta JSON. Las versiones anteriores devolvían secuencias escapadas para los caracteres Unicode en las respuestas.

Por ejemplo, en Python 3.11, si devuelve una cadena Unicode como ”こんにちは», se escapan los caracteres Unicode y se devuelve “\ u3053\ u3093\ u306b\ u3061\ u306f”. El motor de ejecución de Python 3.12 devuelve el ”こんにちは” original.

Este cambio reduce el tamaño del payload devuelto por Lambda. En el ejemplo anterior, la versión escapada ocupa 32 bytes, en comparación con los 17 bytes de la cadena Unicode. El uso de respuestas Unicode reduce el tamaño de las respuestas Lambda, lo que facilita ajustar las respuestas más grandes al límite de 6 MB de respuestas (sincrónicas) de Lambda.

Al actualizar a Python 3.12, es posible que tenga que ajustar el código en otros módulos para tener en cuenta este nuevo comportamiento. Si quien realiza la petición espera que la respuesta Unicode se escape en función del anterior comportamiento del tiempo de ejecución, debe añadir código a tu función de retorno para escapar el Unicode manualmente, o ajustar el proceso que realiza la petición para que pueda procesar la respuesta Unicode.

Extensiones de procesamiento para un apagado correcto (graceful shutdown)

Las funciones de Lambda con extensiones externas ahora pueden beneficiarse de las capacidades mejoradas de apagado correcto. Cuando el servicio Lambda está a punto de terminar el entorno de ejecución, envía una señal SIGTERM al entorno de ejecución y, a continuación, un evento SHUTDOWN a cada extensión externa registrada.

Estos eventos se envían cada vez que se termina un entorno de ejecución. Esto le permite captar la señal SIGTERM en la función de Lambda y realizar una limpieza de recursos, como conexiones a bases de datos que fueron creados por la función.

Para obtener más información sobre el ciclo de vida del entorno de ejecución de Lambda, consulte Entorno de ejecución de Lambda. En el repositorio de GitHub AWS Samples encontrará detalles y ejemplos sobre cómo utilizar el terminado correcto con extensiones.

Nuevas características de Python

Comprensión en línea

Con la implementación del PEP 709, la comprensión de diccionarios, listas y sets ahora están integradas. Las versiones anteriores creaban una función de un solo uso para ejecutar dichas comprensiones. La eliminación de esta sobrecarga da como resultado una ejecución de la comprensión hasta dos veces más rápida.

Debido a esta actualización, se han producido algunos cambios de comportamiento en las comprensiones. Por ejemplo, una llamada a la función ‘locals()’ desde la comprensión ahora incluye objetos del ámbito que la contiene, no solo de la propia comprensión, como en versiones anteriores. Debe probar las funciones que está migrando de una versión anterior de Python a Python 3.12.

Cambios de escritura

Python 3.12 continúa con la evolución de incluir anotaciones de tipado en Python. El PEP 695 incluye una sintaxis nueva y más compacta para las clases y funciones genéricas, y añade una nueva sentencia “type” para permitir la creación de alias de tipos. Los alias de tipos se evalúan bajo demanda. Esto permite que los alias hagan referencia a otros tipos definidos más adelante.

Los parámetros de tipo son visibles dentro del ámbito de la declaración y de cualquier ámbito anidado, pero no en el ámbito exterior.

Formalización de f-strings

Uno de los cambios más importantes de Python 3.12, la formalización de la sintaxis de f-strings, se describe en el  PEP 701. Ahora, cualquier expresión válida puede estar incluida en una f-string, incluidas otras f-string.

En versiones anteriores de Python, la reutilización de comillas dentro de una f-string generaba errores. Con Python 3.12, la reutilización de comillas es totalmente compatible con las f-string anidadas, como en el siguiente ejemplo:

>>>songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']

>>>f"This is the playlist: {", ".join(songs)}"

'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

Además, cualquier expresión válida de Python puede estar incluida en una f-string. Esto incluye expresiones de varias líneas y la posibilidad de inyectar comentarios dentro de una f-string.

Antes de Python 3.12, el carácter “\” no estaba permitido dentro de una f-string. Esto impedía el uso de la sintaxis “\n” para definir los caracteres Unicode de escape dentro del cuerpo de una f-string.

Mejoras en Asyncio

Hay una serie de mejoras en el módulo asyncio. Estas incluyen mejoras en el rendimiento de la escritura de sockets y una nueva implementación de asyncio.current_task() que puede ofrecer un rendimiento de 4 a 6 veces mejor. Los bucles de eventos ahora optimizan a sus observadores hijos para su entorno subyacente.

Uso de Python 3.12 en Lambda

Consola de administración de AWS

Para usar el tiempo de ejecución de Python 3.12 para desarrollar sus funciones de Lambda, especifique el valor de parámetro de Tiempo de ejecución a Python 3.12 al crear o actualizar una función. La versión 3.12 de Python ya está disponible en el menú desplegable Tiempo de ejecución de la página Crear una Función:

 

Para actualizar una función de Lambda existente a Python 3.12, vaya a la función en la consola de Lambda y elija Editar en el panel de Configuración del tiempo de ejecución. La nueva versión de Python está disponible en el menú desplegable Tiempo de ejecución

Imagen de contenedor de AWS Lambda

Cambie la versión de la imagen base de Python modificando la sentencia FROM en su Dockerfile:

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

Los clientes que ejecuten las imágenes de Docker de Python 3.12 de forma local, incluidos los clientes que utilizan AWS SAM, deben actualizar su instalación de Docker a la versión 20.10.10 o posterior.

AWS Serverless Application Model (AWS SAM)

En AWS SAM, establezca el atributo Runtime a python3.12 para usar esta versión.

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.12

AWS SAM soporta la generación de esta plantilla con Python 3.12 para nuevas aplicaciones serverless mediante el comando `sam init`. Consulte la documentación de AWS SAM.

AWS Cloud Development Kit (AWS CDK)

En AWS CDK, defina el atributo Runtime.PYTHON_3_12 para usar esta versión.

En el CDK de 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_12, 
                                 code=_lambda.Code.from_asset('lambda'))

En el CDK de 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.12 enabled Lambda Function
    const lambdaFunction = new lambda.Function(this, 'python311LambdaFunction', {
      runtime: lambda.Runtime.PYTHON_3_12,
      memorySize: 512,
      code: lambda.Code.fromAsset(path.join(__dirname, '/../lambda')),
      handler: 'lambda_handler.handler'
    })
  }
}

Conclusión

Lambda ahora es compatible con Python 3.12. Esta versión utiliza el sistema operativo Amazon Linux 2023, soporta respuestas Unicode y permite apagar correctamente las funciones con extensiones externas, y soporta las características del lenguaje Python 3.12.

Puede crear e implementar funciones con Python 3.12 mediante la consola de administración de AWS, la CLI de AWS, el SDK de AWS, AWS SAM, AWS CDK o la herramienta de infraestructura como código (IaC) que elija. También puede usar la imagen base del contenedor de Python 3.12 si prefiere crear e implementar sus funciones con imágenes de contenedor.

La compatibilidad de Python 3.12 como tiempo de ejecución ayuda a los desarrolladores a crear aplicaciones serverless más eficientes, potentes y escalables. Pruebe hoy mismo el tiempo de ejecución de Python 3.12 en Lambda y disfrute de las ventajas de esta versión actualizada del lenguaje.

Para obtener más recursos de aprendizaje sin servidor, visite Serverless Land.

Este blog en español es una traducción de la publicación original del blog en inglés (Enlace aquí).Traductor: Sebastian Vasquez | Technical Account Manager en AWS Enterprise – Bogotá, Colombia