Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Definir el controlador de funciones de Lambda en Python

Modo de enfoque
Definir el controlador de funciones de Lambda en Python - AWS Lambda

El controlador de la función de Lambda es el método del código de la función que procesa eventos. Cuando se invoca una función, Lambda ejecuta el método del controlador. La función se ejecuta hasta que el controlador devuelve una respuesta, se cierra o se agota el tiempo de espera.

En esta página, se describe cómo trabajar con los controladores de funciones de Lambda en Python, incluidas las convenciones de nomenclatura, las firmas de controlador válidas y las prácticas recomendadas. Esta página también incluye un ejemplo de una función de Lambda de Python que recibe información sobre un pedido, genera un recibo en un archivo de texto y coloca este archivo en un bucket de Amazon Simple Storage Service (Amazon S3).

Código de función de Lambda de Python de ejemplo

El siguiente ejemplo de código de función de Lambda de Python recibe información sobre un pedido, genera un recibo en un archivo de texto y coloca este archivo en un bucket de Amazon S3:

ejemplo Función de Lambda de Python
import json import os import logging import boto3 # Initialize the S3 client outside of the handler s3_client = boto3.client('s3') # Initialize the logger logger = logging.getLogger() logger.setLevel("INFO") def upload_receipt_to_s3(bucket_name, key, receipt_content): """Helper function to upload receipt to S3""" try: s3_client.put_object( Bucket=bucket_name, Key=key, Body=receipt_content ) except Exception as e: logger.error(f"Failed to upload receipt to S3: {str(e)}") raise def lambda_handler(event, context): """ Main Lambda handler function Parameters: event: Dict containing the Lambda function event data context: Lambda runtime context Returns: Dict containing status message """ try: # Parse the input event order_id = event['Order_id'] amount = event['Amount'] item = event['Item'] # Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET') if not bucket_name: raise ValueError("Missing required environment variable RECEIPT_BUCKET") # Create the receipt content and key destination receipt_content = ( f"OrderID: {order_id}\n" f"Amount: ${amount}\n" f"Item: {item}" ) key = f"receipts/{order_id}.txt" # Upload the receipt to S3 upload_receipt_to_s3(bucket_name, key, receipt_content) logger.info(f"Successfully processed order {order_id} and stored receipt in S3 bucket {bucket_name}") return { "statusCode": 200, "message": "Receipt processed successfully" } except Exception as e: logger.error(f"Error processing order: {str(e)}") raise

Este archivo contiene las siguientes secciones de código:

  • Bloque import: utilice este bloque para incluir las bibliotecas que requiere la función de Lambda.

  • Inicialización global del cliente y el registrador del SDK: si se incluye código de inicialización fuera del controlador se aprovecha la reutilización del entorno de ejecución para mejorar el rendimiento de la función. Consulte Prácticas recomendadas de codificación para las funciones de Lambda en Python para obtener más información.

  • def upload_receipt_to_s3(bucket_name, key, receipt_content): se trata de una función auxiliar a la que llama la función lambda_handler principal.

  • def lambda_handler(event, context):: se trata de la función del controlador principal de su código, que contiene la lógica principal de la aplicación. Cuando Lambda invoca el controlador de funciones, el tiempo de ejecución de Lambda pasa dos argumentos a la función: el objeto de evento que contiene los datos que debe procesar la función y el objeto de contexto que contiene información sobre la invocación de la función.

Convenciones de nomenclatura de controladores

El nombre del controlador de funciones definido en el momento de la creación de una función de Lambda se deriva de lo siguiente:

  • El nombre del archivo en el que se encuentra la función del controlador de Lambda.

  • El nombre de la función del controlador de Python.

En el ejemplo anterior, si el archivo tiene un nombre lambda_function.py, el controlador se especificará como lambda_function.lambda_handler. Este es el nombre de controlador predeterminado que se asigna a las funciones que se crean con la consola de Lambda.

Si crea una función en la consola con un nombre de archivo o un nombre de controlador de funciones diferente, debe editar el nombre del controlador predeterminado.

Para cambiar el nombre de controlador de la función (consola)
  1. Abra la página Funciones de la consola de Lambda y elija su función.

  2. Elija la pestaña Código.

  3. Desplácese hacia abajo hasta el panel Configuración del tiempo de ejecución y elija Editar.

  4. En Controlador, ingrese el nuevo nombre del controlador de funciones.

  5. Seleccione Guardar.

Uso del objeto de evento de Lambda

Cuando Lambda invoca su función, pasa un argumento de objeto de evento al controlador de funciones. Los objetos JSON son el formato de eventos más común de las funciones de Lambda. En el ejemplo de código de la sección anterior, la función espera una entrada en el siguiente formato:

{ "Order_id": "12345", "Amount": 199.99, "Item": "Wireless Headphones" }

Si otro Servicio de AWS invoca su función, el evento de entrada también es un objeto de formato JSON. El formato exacto del objeto de evento depende del servicio que invoque la función. Para ver el formato de evento de un servicio concreto, consulte la página correspondiente del capítulo Invocar Lambda con eventos de otros servicios de AWS.

Si el evento de entrada tiene la forma de un objeto JSON, el tiempo de ejecución de Lambda convierte el objeto en un diccionario de Python. Para asignar valores en el JSON de entrada a las variables del código, utilice los métodos estándar del diccionario de Python, tal y como se ilustra en el código de ejemplo.

También puede pasar datos a la función como una matriz JSON o como cualquiera de los otros tipos de datos JSON válidos. La siguiente tabla define cómo el tiempo de ejecución de Python convierte estos tipos de JSON.

Tipos de datos de JSON Tipo de datos de Python
objeto diccionario (dict)
array lista (list)
número número entero (int) o número en coma flotante (float)
cadena cadena (str)
Booleano Booleano (bool)
null NoneType (NoneType)

Acceso y uso del objeto de contexto de Lambda

El objeto de contexto de Lambda contiene información sobre la invocación de la función y el entorno de ejecución. Lambda pasa el objeto de contexto a su función de forma automática cuando se invoca. Puede utilizar el objeto de contexto para generar información sobre la invocación de su función con fines de supervisión.

El objeto de contexto es una clase de Python que se define en el cliente de interfaz del tiempo de ejecución de Lambda. Para devolver el valor de cualquiera de las propiedades del objeto de contexto, utilice el método correspondiente en el objeto de contexto. Por ejemplo, el siguiente fragmento de código asigna el valor de la propiedad aws_request_id (el identificador de la solicitud de invocación) a una variable denominada request.

request = context.aws_request_id

Para obtener más información sobre el uso del objeto de contexto de Lambda y ver una lista completa de los métodos y propiedades disponibles, consulte Uso del objeto de contexto Lambda para recuperar información de funciones de Python.

Firmas de controlador válidas para los controladores de Python

Al definir la función de controlador en Python, la función debe tener dos argumentos. El primero de estos argumentos es el objeto de evento de Lambda y el segundo es el objeto de contexto de Lambda. Por convención, estos argumentos de entrada suelen tener como nombres event y context, pero puede darles cualquier nombre que desee. Si declara la función del controlador con un único argumento de entrada, Lambda generará un error cuando intente ejecutar la función. La forma más común de declarar una función de controlador en Python es la siguiente:

def lambda_handler(event, context):

También puede usar sugerencias de tipo de Python en la declaración de la función, como se muestra en el siguiente ejemplo:

from typing import Dict, Any def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:

Para utilizar la escritura especifica de AWS para los eventos generados por otros Servicios de AWS y para el objeto de contexto, agregue el paquete aws-lambda-typing al paquete de implementación de la función. Puede instalar esta biblioteca en su entorno de desarrollo si ejecuta pip install aws-lambda-typing. En el siguiente fragmento de código se muestra cómo usar sugerencias de tipo de AWS específicas. En este ejemplo, el evento esperado es un evento de Amazon S3.

from aws_lambda_typing.events import S3Event from aws_lambda_typing.context import Context from typing import Dict, Any def lambda_handler(event: S3Event, context: Context) -> Dict[str, Any]:

No puede usar el tipo de función async de Python para su función de controlador.

Devolver un valor

Si lo desea, el controlador puede devolver un valor que debe ser serializable en formato JSON. Los tipos de devolución más comunes incluyen dict, list, str, int, float y bool.

Lo que sucede con el valor devuelto depende del tipo de invocación y el servicio que invocó la función. Por ejemplo:

  • Si utiliza el tipo de invocación RequestResponse para invocar una función de Lambda de manera sincrónica, Lambda devuelve el resultado de la llamada a la función Python al cliente que invoca la función de Lambda (en la respuesta HTTP a la solicitud de invocación, serializado en JSON). Por ejemplo, la consola de AWS Lambda utiliza el tipo de invocación RequestResponse, por lo que al invocar la función utilizando la consola, esta mostrará el valor devuelto.

  • Si el controlador devuelve objetos que no se pueden serializar con json.dumps, el tiempo de ejecución devuelve un error.

  • Si el controlador devuelve None, al igual que hacen las funciones de Python sin una instrucción return, el runtime devuelve null.

  • Si se utiliza el tipo de invocación Event (una invocación asíncrona), el valor se descarta.

En el código de ejemplo, el controlador devuelve el siguiente diccionario de Python:

{ "statusCode": 200, "message": "Receipt processed successfully" }

El tiempo de ejecución de Lambda serializa este diccionario y lo devuelve al cliente que invocó la función como una cadena JSON.

nota

En Python 3.9 y versiones posteriores, Lambda incluye el valor requestId de la invocación en la respuesta de error.

Uso de AWS SDK para Python (Boto3) en el controlador

A menudo, utilizará las funciones de Lambda para interactuar con otros Servicios de AWS y recursos. La forma más sencilla de interactuar con estos recursos es utilizar AWS SDK para Python (Boto3). Todos los tiempos de ejecución de Lambda Python compatibles incluyen una versión del SDK para Python. Sin embargo, le recomendamos encarecidamente que incluya el SDK en el paquete de implementación de su función si su código necesita usarlo. Si incluye el SDK en el paquete de implementación, tendrá un control total sobre las dependencias y reducirá el riesgo de sufrir problemas de desalineación de las versiones con otras bibliotecas. Consulte Dependencias de tiempo de ejecución en Python y Compatibilidad con versiones anteriores para obtener más información.

Si desea usar el SDK para Python en la función de Lambda, agregue la siguiente instrucción al bloque de importación al principio del código de la función:

import boto3

Use el comando pip install para agregar la biblioteca de boto3 al paquete de implementación de la función. Para obtener instrucciones detalladas sobre cómo agregar dependencias a un paquete de implementación en formato .zip, consulte Creación de un paquete de despliegue .zip con dependencias. Para obtener más información sobre cómo agregar dependencias a las funciones de Lambda implementadas como imágenes de contenedor, consulte Creación de una imagen a partir de una imagen base o Creación de imágenes a partir de una imagen base alternativa.

Cuando usa boto3 en su código, no necesita proporcionar ninguna credencial para inicializar un cliente. Por ejemplo, en el código de ejemplo, utilizamos la siguiente línea de código para inicializar un cliente de Amazon S3:

# Initialize the S3 client outside of the handler s3_client = boto3.client('s3')

Con Python, Lambda crea automáticamente variables de entorno con credenciales. El SDK de boto3 comprueba estas credenciales en las variables de entorno de la función durante la inicialización.

Acceso a las variables de entorno

En el código del controlador, puede hacer referencia a variables de entorno mediante el método os.environ.get. En este código de ejemplo, hacemos referencia a la variable de entorno RECEIPT_BUCKET definida mediante la siguiente línea de código:

# Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET')

No olvide incluir una instrucción import os en el bloque de importación al principio del código.

Prácticas recomendadas de codificación para las funciones de Lambda en Python

Siga las directrices de la siguiente lista para utilizar las prácticas recomendadas de codificación al crear sus funciones de Lambda:

  • Separe el controlador de Lambda de la lógica del núcleo. Esto le permite probar las distintas unidades de la función con mayor facilidad. Por ejemplo, en Python, podría tener este aspecto:

    def lambda_handler(event, context): foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo, bar) def my_lambda_function(foo, bar): // MyLambdaFunction logic here
  • Controle las dependencias del paquete de implementación de la función. El entorno de ejecución AWS Lambda contiene varias bibliotecas. Para los tiempos de ejecución de Node.js y Python, estos incluyen los AWS SDK. Para disponer del conjunto más reciente de características y actualizaciones de seguridad, Lambda actualizará periódicamente estas bibliotecas. Estas actualizaciones pueden introducir cambios sutiles en el comportamiento de la función de Lambda. Para disponer de un control total de las dependencias que utiliza la función, empaquete todas las dependencias con el paquete de implementación.

  • Minimice la complejidad de las dependencias. Son preferibles los marcos de trabajo más sencillos, ya que se cargan rápidamente al arrancar el entorno de ejecución.

  • Minimice el tamaño del paquete de implementación de acuerdo con las necesidades de su tiempo de ejecución. Esto reducirá la cantidad de tiempo que tarda el paquete de implementación en descargarse y desempaquetarse antes de la invocación.

  • Reutilice el entorno de ejecución para mejorar el rendimiento de la función. Inicialice los clientes de SDK y las conexiones de base de datos fuera del controlador de funciones y almacene localmente en caché los recursos estáticos en el directorio /tmp. Las invocaciones posteriores procesadas por la misma instancia de su función pueden reutilizar estos recursos. Esto ahorra costes al reducir el tiempo de ejecución de la función.

    Para evitar posibles filtraciones de datos entre las invocaciones, no utilice el entorno de ejecución para almacenar datos de usuario, eventos u otra información con implicaciones de seguridad. Si su función se basa en un estado mutable que no se puede almacenar en la memoria dentro del controlador, considere crear una función independiente o versiones independientes de una función para cada usuario.

  • Utilice una directiva keep-alive para mantener conexiones persistentes. Lambda purga las conexiones inactivas a lo largo del tiempo. Si intenta reutilizar una conexión inactiva al invocar una función, se producirá un error de conexión. Para mantener la conexión persistente, use la directiva keep-alive asociada al tiempo de ejecución. Para ver un ejemplo, consulte Reutilización de conexiones con Keep-Alive en Node.js.

  • Utilice variables de entorno para pasar parámetros operativos a su función. Por ejemplo, si está escribiendo en un bucket de Amazon S3, en lugar de codificar de forma rígida el nombre del bucket, configúrelo como una variable de entorno.

  • Evite utilizar invocaciones recursivas en la función de Lambda, en las que la función se invoca a sí misma o inicia un proceso que puede volver a invocarla. Esto podría producir un volumen no intencionado de invocaciones de la función y costos elevados. Si observa un volumen imprevisto de invocaciones, establezca la simultaneidad reservada de funciones en 0 inmediatamente para limitar todas las invocaciones de la función mientras actualiza el código.

  • No utilice API no documentadas y no públicas en el código de la función de Lambda. Para tiempos de ejecución administrados de AWS Lambda, Lambda aplica periódicamente actualizaciones funcionales y de seguridad a las API internas de Lambda. Estas actualizaciones de las API internas pueden ser incompatibles con versiones anteriores, lo que conlleva consecuencias no deseadas, como errores de invocación si su función depende de estas API no públicas. Consulte la referencia de la API para obtener una lista de las API disponibles públicamente.

  • Escriba el código idempotente. Escribir el código idempotente para las funciones garantiza que los eventos duplicados se gestionen de la misma manera. El código debe validar y gestionar correctamente los eventos duplicados. Para obtener más información, consulte ¿Cómo puedo hacer que mi función de Lambda sea idempotente?.

PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.