

# Comprender los métodos de invocación de la función de Lambda
<a name="lambda-invocation"></a>

Después de implementar la función de Lambda, puede invocarla de varias maneras:
+ La [consola de Lambda](testing-functions.md): utilice la consola de Lambda para crear rápidamente un evento de prueba a fin de invocar la función.
+ [AWSSDK](https://aws.amazon.com/developer/tools/): utilice AWS SDK para invocar la función mediante programación.
+ API [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html): utilice la API Invoke de Lambda para invocar directamente la función.
+ La [AWS Command Line Interface (AWS CLI)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html): utilice el comando `aws lambda invoke` de la AWS CLI para invocar directamente la función desde la línea de comandos.
+ Un [punto de conexión HTTP(S)](urls-configuration.md): utilice las URL de función para crear un punto de conexión HTTP(S) dedicado que pueda utilizar para invocar la función.

Todos estos métodos son formas *directas* de invocar la función. En Lambda, un caso de uso común es invocar la función según un evento que se produce en otra parte de la aplicación. Algunos servicios pueden invocar una función de Lambda con cada nuevo evento. Esto se llama [desencadenador](lambda-services.md). Para los servicios basados en flujos y colas, Lambda invoca la función con lotes de registros. Esto se denomina [asignación de orígenes de eventos](invocation-eventsourcemapping.md).

Al invocar una función, puede optar por invocarla de forma síncrona o asíncrona. Con [invocación síncrona](invocation-sync.md), espere la función para procesar el evento y devolver una respuesta. Con invocación [asíncrona](invocation-async.md), Lambda pone en cola el evento para su procesamiento y devuelve una respuesta inmediatamente. El [parámetro de solicitud `InvocationType` de la API Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#API_Invoke_RequestParameters) determina cómo Lambda invoca la función. Un valor de `RequestResponse` indica una invocación sincrónica y un valor de `Event` indica una invocación asíncrona.

[Para invocar su función a través de IPv6, utilice los puntos finales públicos de doble pila de Lambda.](https://docs.aws.amazon.com/general/latest/gr/rande.html#dual-stack-endpoints) Puntos de conexión de doble pila compatibles con IPv4 e IPv6 Los puntos de conexión de doble pila de Lambda utilizan la siguiente sintaxis:

```
protocol://lambda.us-east-1.api.aws
```

También puede usar las [URL de función de Lambda](urls-configuration.md) para invocar funciones a través de IPv6. Los puntos de conexión de la URL de función tienen el siguiente formato:

```
https://url-id.lambda-url.us-east-1.on.aws
```

Si la invocación de la función produce un error, en el caso de las invocaciones sincrónicas, consulte el mensaje de error en la respuesta y vuelva a intentar la invocación manualmente. Para invocaciones asíncronas, Lambda gestiona los reintentos automáticamente y puede enviar registros de invocación a un [destino](invocation-async-retain-records.md#invocation-async-destinations).

# Invocación de una función de Lambda de forma sincrónica
<a name="invocation-sync"></a>

Al invocar una función sincrónicamente, Lambda ejecuta la función y espera una respuesta. Cuando finaliza la función, Lambda devuelve la respuesta desde el código de la función con datos adicionales, como la versión de la función que se invocó. Para invocar una función de forma síncrona con la AWS CLI, utilice el comando `invoke`.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload '{ "key": "value" }' response.json
```

La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.

Debería ver los siguientes datos de salida:

```
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
```

El siguiente diagrama muestra a los clientes que invocan una función de Lambda de forma sincrónica. Lambda envía los eventos directamente a la función y envía la respuesta de la función al invocador.

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/invocation-sync.png)


El `payload` es una cadena que contiene un evento en formato JSON. El nombre del archivo donde AWS CLI escribe la respuesta de la función es `response.json`. Si la función devuelve un objeto o error, el cuerpo de la respuesta es el objeto o error en formato JSON. Si la función sale sin errores, el cuerpo de la respuesta es `null`.

**nota**  
Lambda no espera a que se completen las extensiones externas para enviar la respuesta. Las extensiones se ejecutan como un proceso independiente en el entorno de ejecución y puede continuar ejecutándose luego de que la invocación de la función se complete. Para obtener más información, consulte [Aumente las funciones de Lambda utilizando extensiones de Lambda](lambda-extensions.md).

La salida del comando, que se muestra en el terminal, incluye información de los encabezados en la respuesta de Lambda. Esto incluye la versión que ha procesado el evento (útil cuando se utilizan [alias](configuration-aliases.md)) y el código de estado devuelto por Lambda. Si Lambda pudo ejecutar la función, el código de estado es 200, incluso aunque la función devolviera un error.

**nota**  
Para funciones con un tiempo de espera largo, el cliente puede desconectarse durante la invocación síncrona mientras espera una respuesta. Configure el cliente HTTP, SDK, el firewall, el proxy o el sistema operativo para permitir conexiones largas con tiempo de espera o ajustes keep-alive.

Si Lambda no puede ejecutar la función, el error se muestra en la salida.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload value response.json
```

Debería ver los siguientes datos de salida:

```
An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"value"; line: 1, column: 11]
```

La AWS CLI es una herramienta de código abierto que lo habitlita para interactuar con los servicios de AWS mediante el uso de comandos en el shell de la línea de comandos. Para completar los pasos de esta sección, debe disponer de la [versión 2 de la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Puede utilizar la [CLI de AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) para recuperar registros de una invocación mediante la opción de comando `--log-type`. La respuesta contiene un campo `LogResult` que contiene hasta 4 KB de registros con codificación base64 a partir de la invocación.

**Example recuperar un ID de registro**  
En el ejemplo siguiente se muestra cómo recuperar un *ID de registro* del campo `LogResult` para una función denominada `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
Debería ver los siguientes datos de salida:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decodificar los registros**  
En el mismo símbolo del sistema, utilice la utilidad `base64` para decodificar los registros. En el ejemplo siguiente se muestra cómo recuperar registros codificados en base64 para `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.  
Debería ver los siguientes datos de salida:  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
La utilidad `base64` está disponible en Linux, macOS y [Ubuntu en Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Es posible que los usuarios de macOS necesiten usar `base64 -D`.

Para obtener más información acerca de la API `Invoke`, incluida una lista completa de parámetros, encabezados y errores, consulte [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html).

Al invocar una función directamente, puede comprobar la respuesta en busca de errores y volver a intentarlo. La AWS CLI y el SDK de AWS también reintentan automáticamente en los tiempos de espera, limitaciones y errores de servicio del cliente. Para obtener más información, consulte [Comprender el comportamiento de reintento en Lambda](invocation-retries.md).

# Invocación de una función de Lambda de forma asíncrona
<a name="invocation-async"></a>

Varios Servicios de AWS, como de Amazon Simple Storage Service (Amazon S3) y Amazon Simple Notification Service (Amazon SNS), invocan funciones de forma asíncrona para procesar eventos. También puede invocar una función de Lambda de forma asíncrona mediante la AWS Command Line Interface (AWS CLI) o los AWS SDK. Cuando se invoca una función de forma asíncrona, no se espera una respuesta del código de función. Se entrega el evento a Lambda, y Lambda se ocupa del resto. Puede configurar la forma en que Lambda gestiona los errores y enviar registros de invocaciones a un recurso posterior, como Amazon Simple Queue Service (Amazon SQS) o Amazon EventBridge (EventBridge), para encadenar los componentes de la aplicación.

El siguiente diagrama muestra los clientes que invocan una función de Lambda de forma asíncrona. Lambda pone en cola los eventos antes de enviarlos a la función.

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/features-async.png)


Para la invocación asíncrona, Lambda coloca el evento en una cola y devuelve una respuesta de “proceso realizado con éxito” sin información adicional. Un proceso independiente lee eventos de la cola y los envía a la función.

 Para invocar una función de Lambda de forma asíncrona mediante la AWS Command Line Interface (AWS CLI) o uno de los SDK de AWS, establezca el parámetro [InvocationType](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#lambda-Invoke-request-InvocationType) en `Event`. En el siguiente ejemplo se muestra un comando de la AWS CLI para invocar una función.

```
aws lambda invoke \
  --function-name my-function  \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{ "key": "value" }' response.json
```

Debería ver los siguientes datos de salida:

```
{
    "StatusCode": 202
}
```

La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.

El archivo de salida (`response.json`) no contiene ninguna información, pero se crea al ejecutar este comando. Si Lambda no puede añadir el caso a la cola, el mensaje de error aparece en la salida del comando.

# Cómo Lambda administra los errores y los reintentos mediante la invocación asíncrona
<a name="invocation-async-error-handling"></a>

Lambda administra la cola de eventos asincrónica de la función y vuelve a intentarlo en caso de errores. Si la función devuelve un error, de forma predeterminada, Lambda intenta ejecutarla dos veces más, con una espera de un minuto entre los dos primeros intentos y dos minutos entre el segundo y el tercero. Los errores de la función incluyen errores devueltos por el código de la función y los errores devueltos por el tiempo de ejecución de la función, como, por ejemplo, los tiempos de espera.

Si la función no tiene disponible suficiente simultaneidad para procesar todos los eventos, se limitan las solicitudes adicionales. Para la limitación controlada de errores (429) y errores del sistema (serie 500), de forma predeterminada, Lambda devuelve el evento a la cola e intenta ejecutar la función de nuevo durante un máximo de 6 horas. El intervalo de reintento aumenta exponencialmente desde 1 segundo después del primer intento hasta un máximo de 5 minutos. Si la cola contiene muchas entradas, Lambda aumenta el intervalo de reintento y reduce la velocidad a la que lee eventos de la cola.

Aunque la función no devuelva un error, es posible que reciba el mismo evento de Lambda varias veces, ya que la propia cola ofrece consistencia final. Si la función no es capaz de gestionar los eventos entrantes, podrían también eliminarse de la cola sin que se envíen a la función. Asegúrese de que el código de la función gestione sin problemas eventos duplicados y de que tenga simultaneidad suficiente disponible para gestionar todas las invocaciones.

Cuando la cola es muy larga, es posible que los nuevos eventos se agoten antes de que Lambda pueda enviarlos a la función. Cuando un evento caduca o todos los intentos de procesamiento fallan, Lambda lo descarga. Puede [configurar la administración de errores](invocation-async-configuring.md) de una función para reducir el número de reintentos que realiza Lambda o para descartar eventos no procesados más rápidamente. Para conservar los eventos descartados, [configure una cola de mensajes fallidos](invocation-async-retain-records.md#invocation-dlq) para la función. Para conservar registros de invocaciones fallidas (como tiempos de espera o errores de tiempo de ejecución), [cree un destino en caso de error](invocation-async-retain-records.md#invocation-async-destinations). 

# Configuración de la gestión de errores para invocaciones asíncronas de Lambda
<a name="invocation-async-configuring"></a>

Utilice los siguientes parámetros para configurar la forma en que Lambda gestiona los errores y los reintentos de las invocaciones de funciones asíncronas:
+ [MaximumEventAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumEventAgeInSeconds): cantidad de tiempo máxima, en segundos, que Lambda mantiene un evento en la cola de eventos asíncrona antes de descartarlo.
+ [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumRetryAttempts): número máximo de veces que Lambda reintenta los eventos cuando la función devuelve un error.

Utilice la consola de Lambda o la AWS CLI para configurar los parámetros de gestión de errores en una función, una versión o un alias.

------
#### [ Console ]

**Para configurar la gestión de errores**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija una función.

1. Elija **Configuración** y, a continuación, elija **Invocación asíncrona**.

1. En **Asynchronous invocation (Invocación asincrónica)**, elija **Edit (Editar)**.

1. Configure los siguientes ajustes.
   + **Antigüedad máxima del evento**: el período máximo de tiempo durante el que Lambda retiene un evento en la cola de evento asincrónico, hasta 6 horas.
   + **Número de reintentos**: número de reintentos que Lambda realiza cuando la función devuelve un error, entre 0 y 2.

1. Seleccione **Guardar**.

------
#### [ AWS CLI ]

Para configurar la invocación asíncrona con la AWS CLI, utilice el comando [put-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/put-function-event-invoke-config.html). En el ejemplo siguiente se configura una función con una antigüedad máxima de evento de 1 hora y sin reintentos.

```
aws lambda put-function-event-invoke-config \ 
  --function-name error \
  --maximum-event-age-in-seconds 3600 \
  --maximum-retry-attempts 0
```

El comando `put-function-event-invoke-config` sobrescribe cualquier configuración existente en la función, versión o alias. Para configurar una opción sin restablecer las otras, utilice [update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html). En el siguiente ejemplo, se configura Lambda para enviar un registro a una cola de SQS estándar llamada `destination` cuando no se puede procesar un evento.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

Debería ver los siguientes datos de salida:

```
{
    "LastModified": 1573686021.479,
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "MaximumRetryAttempts": 0,
    "MaximumEventAgeInSeconds": 3600,
    "DestinationConfig": {
        "OnSuccess": {},
        "OnFailure": {}
    }
}
```

Cuando un evento de invocación supera la antigüedad máxima o no supera ningún reintento, Lambda lo descarta. Para conservar una copia de los eventos descartados, configure un [destino](invocation-async-retain-records.md#invocation-async-destinations) de eventos fallidos.

# Captura de los registros de invocaciones asíncronas de Lambda
<a name="invocation-async-retain-records"></a>

Lambda puede enviar registros de invocaciones asíncronas a uno de los siguientes Servicios de AWS.
+ **Amazon SQS**: una cola de SQS estándar.
+ **Amazon SNS**: un tema de SNS estándar.
+ **Amazon S3**: un bucket de Amazon S3 (solo en caso de error).
+ **AWS Lambda**: una función de Lambda.
+ **Amazon EventBridge**: un bus de eventos de EventBridge.

El registro de invocación contiene detalles sobre la solicitud y la respuesta en formato JSON. Puede configurar destinos independientes en eventos que se procesan con éxito, y eventos que fallan todos los intentos de procesamiento. También puede configurar una cola de Amazon SQS estándar o un tema de Amazon SNS estándar como una cola de mensajes fallidos para eventos descartados. En las colas de mensajes fallidos, Lambda solo envía el contenido del evento, sin detalles sobre la respuesta.

Si Lambda no puede enviar un registro a un destino que haya configurado, envía una métrica `DestinationDeliveryFailures` a Amazon CloudWatch. Esto puede ocurrir si la configuración incluye un tipo de destino no admitido, como una cola FIFO de Amazon SQS o un tema FIFO de Amazon SNS. También pueden producirse errores de entrega debido a errores de permisos y límites de tamaño. Para obtener más información sobre las métricas de invocación de Lambda, consulte [Métricas de invocación](monitoring-metrics-types.md#invocation-metrics).

**nota**  
Para evitar que una función se active, puede establecer la simultaneidad reservada de la función en cero. Cuando establece la simultaneidad reservada en cero para una función invocada de forma asíncrona, Lambda comienza a enviar nuevos eventos a la [cola de mensajes fallidos](#invocation-dlq) configurada o al [destino para eventos](#invocation-async-destinations) en caso de error, sin reintentos. Para procesar eventos que se enviaron mientras la simultaneidad reservada estaba establecida en cero, debe consumir los eventos de la cola de mensajes fallidos o el destino para eventos en caso de error.

## Cómo agregar un destino
<a name="invocation-async-destinations"></a>

Para retener registros de invocaciones asincrónicas, agregue un destino a su función. Puede elegir enviar las invocaciones correctas o fallidas a un destino. Cada función puede tener varios destinos, por lo que puede configurar destinos independientes para los eventos correctos y los fallidos. Cada registro enviado al destino es un documento JSON con detalles sobre la invocación. Al igual que con los ajustes de gestión de errores, puede configurar los destinos en una función, versión de la función o alias.

**sugerencia**  
También puede retener registros de las invocaciones fallidas para los siguientes tipos de asignación de orígenes de eventos: [Amazon Kinesis](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console), [Amazon DynamoDB](services-dynamodb-errors.md) y [Apache Kafka (Amazon MSK y Apache Kafka autoadministrado)](kafka-on-failure.md#kafka-onfailure-destination).<a name="destinations-permissions"></a>

La siguiente table enumera los destinos admitidos para los registros de invocación asincrónica. Para que Lambda envíe correctamente los registros al destino elegido, asegúrese de que el [rol de ejecución](lambda-intro-execution-role.md) de la función también contenga los permisos pertinentes. En la tabla también se describe cómo cada tipo de destino recibe el registro de invocación de JSON.


| Tipo de destino | Permiso necesario | Formato JSON específico del destino | 
| --- | --- | --- | 
|  Cola de Amazon SQS  |  [sqs:SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)  |  Lambda pasa el registro de invocación como `Message` al destino.  | 
|  Tema de Amazon SNS  |  [sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)  |  Lambda pasa el registro de invocación como `Message` al destino.  | 
|  Bucket de Amazon S3 (solo en caso de error)  |  [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) [s3:ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/invocation-async-retain-records.html)  | 
|  Función de Lambda  |  [lambda:InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Lambda pasa el registro de invocación como carga útil a la función.  | 
|  EventBridge  |  [events:PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/invocation-async-retain-records.html)  | 

**nota**  
Para los destinos de Amazon S3, si ha habilitado el cifrado en el bucket mediante una clave de KMS, su función también necesitará el permiso [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html).

**importante**  
Tenga en cuenta que Amazon SNS tiene un límite máximo de tamaño de mensaje de 256 KB cuando lo utilice como destino. Si la carga útil de invocación asíncrona se acerca a 1 MB, el registro de invocación (que incluye la carga útil original más metadatos adicionales) puede superar el límite de Amazon SNS y provocar errores en la entrega. Piense en la posibilidad de utilizar destinos de Amazon SQS o Amazon S3 para cargas útiles más grandes.

En los siguientes pasos se describe cómo configurar un destino para una función utilizando la consola de Lambda y la AWS CLI.

------
#### [ Console ]

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija una función.

1. En **Descripción general de la función**, elija **Agregar destino**.

1. En **Source (Origen)**, elija **Asynchronous invocation (Invocación asincrónica)**.

1. En **Condition (Condición)** elija una de las siguientes opciones:
   + **En caso de error**: enviar un registro cuando el evento no supera los intentos de procesamiento o supera la antigüedad máxima.
   + **Si es correcto**: enviar un registro cuando la función procesa correctamente una invocación asincrónica.

1. En **Destination type** (Tipo de destino), elija el tipo de recurso que recibe el registro de invocación.

1. En **Destination** (Destino), elija un recurso.

1. Seleccione **Save**.

------
#### [ AWS CLI ]

Para configurar un destino mediante la AWS CLI, ejecute el comando [update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html). En el siguiente ejemplo, se configura Lambda para enviar un registro a una cola de SQS estándar llamada `destination` cuando no se puede procesar un evento.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

### Prácticas recomendadas de seguridad para destinos de Amazon S3
<a name="s3-destination-security"></a>

Eliminar un bucket de S3 que está configurado como destino sin eliminar el destino de la configuración de la función puede suponer un riesgo de seguridad. Si otro usuario conoce el nombre del bucket de destino, puede volver a crear el bucket en su Cuenta de AWS. Los registros de las invocaciones fallidas se enviarán a su bucket, lo que podría exponer los datos de su función.

**aviso**  
Para asegurarse de que los registros de invocación de su función no se puedan enviar a un bucket de S3 de otra Cuenta de AWS, agregue una condición al rol de ejecución de la función que limite los permisos `s3:PutObject` a los buckets de su cuenta. 

En el siguiente ejemplo, se muestra una política de IAM que limita los permisos `s3:PutObject` de la función a los buckets de la cuenta. Esta política también otorga a Lambda el permiso `s3:ListBucket` que necesita para usar un bucket de S3 como destino.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Para agregar una política de permisos al rol de ejecución de su función mediante la Consola de administración de AWS o la AWS CLI, consulte las instrucciones de los siguientes procedimientos:

------
#### [ Console ]

**Cómo agregar una política de permisos al rol de ejecución de la función (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función de Lambda cuyo rol de ejecución desee modificar.

1. En la pestaña **Configuración**, elija **Permisos**.

1. En la pestaña **Rol de ejecución**, seleccione el **nombre del rol** de la función para abrir la página de la consola de IAM del rol.

1. Agregue una política de permisos al rol de la siguiente manera:

   1. En el panel **Política de permisos**, elija **Agregar permisos** y seleccione **Crear política insertada**.

   1. En el **editor de políticas**, seleccione **JSON**.

   1. Pegue la política que desee agregar en el editor (sustituyendo el JSON existente) y, a continuación, seleccione **Siguiente**.

   1. En **Detalles de política**, ingrese un **Nombre de política**.

   1. Elija **Crear política**.

------
#### [ AWS CLI ]

**Cómo agregar una política de permisos al rol de ejecución de la función (CLI)**

1. Cree un documento de política de JSON con los permisos necesarios y guárdelo en un directorio local.

1. Utilice el comando de la CLI de IAM `put-role-policy` para agregar permisos al rol de ejecución de la función. Ejecute el siguiente comando desde el directorio en el que guardó el documento de política JSON y sustituya el nombre del rol, el nombre de la política y el documento de política por sus propios valores.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Registro de invocación de ejemplo
<a name="destination-example-record"></a>

Cuando una invocación coincide con la condición, Lambda envía [un documento JSON](#destinations-permissions) con detalles sobre la invocación al destino. El ejemplo siguiente muestra un registro de invocación para un evento que ha fallado tres intentos de procesamiento debido a un error de función.

**Example**  

```
{
    "version": "1.0",
    "timestamp": "2019-11-14T18:16:05.568Z",
    "requestContext": {
        "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
        "condition": "RetriesExhausted",
        "approximateInvokeCount": 3
    },
    "requestPayload": {
        "ORDER_IDS": [
            "9e07af03-ce31-4ff3-xmpl-36dce652cb4f",
            "637de236-e7b2-464e-xmpl-baf57f86bb53",
            "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15"
        ]
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "responsePayload": {
        "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request"
    }
}
```

El registro de invocación contiene detalles sobre el evento, la respuesta y el motivo por el que se ha enviado el registro.

### Seguimiento de solicitudes a destinos
<a name="destinations-tracing"></a>

Puede utilizar AWS X-Ray para ver una vista conectada de cada solicitud a medida que se pone en cola, la procesa una función de Lambda y se pasa al servicio de destino. Al activar el seguimiento de X-Ray para una función o un servicio que invoca una función, Lambda agrega un encabezado de X-Ray a la solicitud y lo pasa al servicio de destino. El seguimiento de los servicios anteriores se vincula automáticamente al seguimiento de las funciones de Lambda posteriores, lo que crea una vista integral de toda la aplicación. Para obtener más información sobre el seguimiento, consulte [Visualice las invocaciones de la función de Lambda mediante AWS X-Ray](services-xray.md).

## Cómo agregar una cola de mensajes fallidos
<a name="invocation-dlq"></a>

Como alternativa a un [destino en caso de fallo](#invocation-async-destinations), puede configurar su función con una cola de mensajes fallidos para guardar eventos descartados para su posterior procesamiento. Una cola de mensajes fallidos actúa igual que un destino en caso de error, ya que se utiliza cuando un evento falla todos los intentos de procesamiento o caduca sin ser procesado. Sin embargo, solo puede agregar o eliminar una cola de mensajes fallidos a nivel de función. Las versiones de la función usan la misma configuración de cola de mensajes fallidos que la versión no publicada (\$1LATEST). Los destinos en caso de error también admiten destinos adicionales e incluyen detalles sobre la respuesta de la función en el registro de invocación.

Para volver a procesar los eventos en una cola de mensajes fallidos, puede configurarla como un [origen de eventos](invocation-eventsourcemapping.md) para su función de Lambda. También puede recuperar manualmente los eventos.

Puede elegir una cola de Amazon SQS estándar o un tema estándar de Amazon SNS para la cola de mensajes fallidos. No se admiten las colas FIFO ni los temas FIFO de Amazon SNS.
+ [Cola de Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html): una cola que contiene eventos fallidos hasta que se recuperan. Elija una cola estándar de Amazon SQS si espera que una sola entidad, como una función de Lambda o una alarma de CloudWatch, procese el evento fallido. Para obtener más información, consulte [Uso de Lambda con Amazon SQS](with-sqs.md).
+ [Tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/gsg/CreateTopic.html): un tema transmite eventos fallidos a uno o más destinos. Elija un tema estándar de Amazon SNS si espera que varias entidades actúen en un evento fallido. Por ejemplo, puede configurar un tema para enviar eventos a una dirección de correo electrónico, una función de Lambda o un punto de enlace HTTP. Para obtener más información, consulte [Invocar las funciones de Lambda usando las notificaciones de Amazon SNS](with-sns.md).

Para enviar eventos a una cola o tema, la función necesita permisos adicionales. Agregue una política con los [permisos necesarios](#destinations-permissions) al [rol de ejecución](lambda-intro-execution-role.md) de la función. Si la cola o el tema de destino están cifrados con una clave de AWS KMS administrada por el cliente, asegúrese de que tanto el rol de ejecución de su función como la [política basada en recursos](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) de la clave cuentan con los permisos pertinentes.

Después de crear el destino y actualizar el rol de ejecución de la función, añada la cola de mensajes fallidos a la función. Puede configurar varias funciones para enviar eventos al mismo destino.

------
#### [ Console ]

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija una función.

1. Elija **Configuración** y, a continuación, elija **Invocación asíncrona**.

1. En **Asynchronous invocation (Invocación asincrónica)**, elija **Edit (Editar)**.

1. Establezca **Servicio de cola de mensajes fallidos** en **Amazon SQS** o **Amazon SNS**.

1. Elija la cola o el tema de destino.

1. Seleccione **Save**.

------
#### [ AWS CLI ]

Para configurar una cola de mensajes fallidos con la AWS CLI, utilice el comando [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html).

```
aws lambda update-function-configuration \
  --function-name my-function \
  --dead-letter-config TargetArn=arn:aws:sns:us-east-1:123456789012:my-topic
```

------

Lambda envía el evento a la cola de mensajes fallidos tal y como está, con información adicional en atributos. Puede utilizar esta información para identificar el error que la función devuelve o correlacionar el evento con los registros o un rastro de AWS X-Ray.

**Atributos de mensajes de cola de mensajes fallidos**
+ **RequestID** (cadena): el ID de la solicitud de invocación. Los ID de las solicitudes aparecen en los registros de la función. También puede usar el X-Ray SDK para registrar el ID de solicitud en un atributo del rastro. A continuación, puede buscar rastros por ID de solicitud en la consola de X-Ray.
+ **ErrorCode** (número): el código de estado de HTTP.
+ **ErrorMessage** (cadena): el primer 1 KB del mensaje de error.

Si Lambda no puede enviar un mensaje a la cola de mensajes fallidos, elimina el evento y emite la métrica [DeadLetterErrors](monitoring-metrics-types.md). Esto puede ocurrir debido a la falta de permisos o si el tamaño total del mensaje supera el límite de la cola o tema de destino. Por ejemplo, supongamos que una notificación de Amazon SNS con un cuerpo cercano a 1 MB activa una función que genera un error. En ese caso, los datos del evento que Amazon SNS agrega, junto con los atributos agregados por Lambda, pueden hacer que el mensaje supere el tamaño máximo permitido en la cola de mensajes fallidos.

Si está utilizando Amazon SQS como fuente de eventos, configure una cola de mensajes fallidos en la propia cola de Amazon SQS y no en la función de Lambda. Para obtener más información, consulte [Uso de Lambda con Amazon SQS](with-sqs.md).

# Invocación de funciones duraderas de Lambda
<a name="durable-invocation"></a>

Las funciones duraderas de Lambda se pueden invocar con los mismos métodos que las funciones predeterminadas de Lambda, pero con consideraciones importantes para las ejecuciones de larga duración. En esta sección, se describen los patrones de invocación, la administración de ejecuciones y las prácticas recomendadas para las funciones duraderas.

## Límites de invocaciones sincrónicas
<a name="synchronous-invocation-limits"></a>

Las invocaciones sincrónicas de funciones de Lambda duraderas están limitadas a 15 minutos, igual que las funciones de Lambda predeterminadas. Si la función duradera necesita ejecutarse durante más de 15 minutos, debe invocarse de forma asíncrona.

**Cuándo utilizar la invocación sincrónica:** utilícela para funciones duraderas que se completen en 15 minutos y cuando necesite resultados inmediatos, como flujos de trabajo de aprobación rápidos o tareas breves de procesamiento de datos.

## Invocación asíncrona para flujos de trabajo de larga duración
<a name="asynchronous-invocation"></a>

Para funciones duraderas que pueden durar más de 15 minutos, utilice la invocación asíncrona. Esto permite que la función siga ejecutándose mientras el cliente recibe un reconocimiento inmediato.

------
#### [ TypeScript ]

```
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

const client = new LambdaClient({});

// Asynchronous invocation
const command = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "Event", // Asynchronous
  Payload: JSON.stringify({ orderId: "12345" })
});

await client.send(command);
```

------
#### [ Python ]

```
import boto3
import json

client = boto3.client('lambda')

# Asynchronous invocation
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='Event',  # Asynchronous
    Payload=json.dumps({'order_id': '12345'})
)
```

------

## API de administración de ejecución
<a name="execution-management-apis"></a>

Lambda proporciona API para administrar y supervisar las ejecuciones de funciones duraderas, lo que incluye enumerar las ejecuciones, obtener el estado de las ejecuciones y detener las ejecuciones en ejecución.

------
#### [ TypeScript ]

```
// Get execution status
const statusCommand = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "RequestResponse",
  Payload: JSON.stringify({ 
    action: "getStatus", 
    executionId: "exec-123" 
  })
});

const result = await client.send(statusCommand);
```

------
#### [ Python ]

```
# Get execution status
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='RequestResponse',
    Payload=json.dumps({
        'action': 'get_status',
        'execution_id': 'exec-123'
    })
)
```

------

# Cómo procesa Lambda registros de orígenes de eventos basados en secuencias y colas
<a name="invocation-eventsourcemapping"></a>

Una *asignación de orígenes de eventos* es un recurso de Lambda que lee elementos de servicios basados en secuencias y colas e invoca una función con lotes de registros. Dentro de la asignación de orígenes de eventos , los recursos denominados *sondeos de eventos* sondean activamente nuevos mensajes e invocan funciones. De forma predeterminada, Lambda escala automáticamente los sondeos de eventos, pero para determinados tipos de orígenes de eventos, puede usar el [modo aprovisionado](#invocation-eventsourcemapping-provisioned-mode) para controlar el número mínimo y máximo de sondeos de eventos dedicados la asignación de orígenes de eventos.

Los siguientes servicios utilizan asignaciones de orígenes de eventos para invocar las funciones de Lambda:
+ [Amazon DocumentDB (con compatibilidad con MongoDB) (Amazon DocumentDB)](with-documentdb.md)
+ [Amazon DynamoDB](with-ddb.md)
+ [Amazon Kinesis](with-kinesis.md)
+ [Amazon MQ](with-mq.md)
+ [Amazon Managed Streaming for Apache Kafka (Amazon MSK)](with-msk.md)
+ [Apache Kafka autoadministrado](with-kafka.md)
+ [Amazon Simple Queue Service (Amazon SQS)](with-sqs.md)

**aviso**  
Las asignaciones de orígenes de eventos de Lambda procesan cada evento al menos una vez, y puede producirse un procesamiento duplicado de registros. Para evitar posibles problemas relacionados con la duplicación de eventos, le recomendamos encarecidamente que haga que el código de la función sea idempotente. Para obtener más información, consulte [¿Cómo puedo hacer que mi función de Lambda sea idempotente?](https://repost.aws/knowledge-center/lambda-function-idempotent) en el Centro de conocimientos de AWS.

## En qué se diferencian las asignaciones de orígenes de eventos de los desencadenadores directos
<a name="eventsourcemapping-trigger-difference"></a>

Algunos Servicios de AWS pueden invocar directamente las funciones de Lambda mediante *desencadenadores*. Estos servicios envían eventos a Lambda y la función se invoca inmediatamente cuando se produce el evento especificado. Los desencadenadores son adecuados para eventos discretos y para el procesamiento en tiempo real. Al [crear un desencadenador mediante la consola de Lambda](lambda-services.md#lambda-invocation-trigger), esta interactúa con el servicio de AWS correspondiente para configurar la notificación de eventos en ese servicio. En realidad, el servicio que genera los eventos es el que almacena y administra el desencadenador, no Lambda. Estos son algunos ejemplos de servicios que utilizan desencadenadores para invocar funciones de Lambda:
+ **Amazon Simple Storage Service (Amazon S3)**: invoca una función cuando se crea, elimina o modifica un objeto en un bucket. Para obtener más información, consulte [Tutorial: Uso de un desencadenador de Amazon S3 para invocar una función de Lambda](with-s3-example.md).
+ **Amazon Simple Notification Service (Amazon SNS):** invoca una función cuando se publica un mensaje en un tema de SNS. Para obtener más información, consulte [Tutorial: Uso de AWS Lambda con Amazon Simple Notification Service](with-sns-example.md).
+ **Amazon API Gateway:** invoca una función cuando se realiza una solicitud de la API a un punto de conexión específico. Para obtener más información, consulte [Invocación de una función de Lambda mediante un punto de conexión de Amazon API Gateway](services-apigateway.md).

Las asignaciones de orígenes de eventos son recursos de Lambda creados y administrados dentro del servicio Lambda. Las asignaciones de orígenes de eventos están diseñados para procesar grandes volúmenes de datos o mensajes de streaming procedentes de colas. Procesar los registros de una secuencia o una cola por lotes es más eficiente que procesar los registros de forma individual. 

## Comportamiento de procesamiento por lotes
<a name="invocation-eventsourcemapping-batching"></a>

De forma predeterminada, una asignación de origen de eventos agrupa los registros en una sola carga que Lambda envía a su función. Para ajustar el comportamiento de procesamiento por lotes, puede configurar una ventana de procesamiento por lotes ([MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)) y un tamaño del lote ([BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BatchSize)). Un periodo de procesamiento por lotes es la cantidad de tiempo máxima para recopilar registros en una sola carga. El tamaño del lote es el número máximo de registros de un solo lote. Lambda invoca su función cuando se cumple uno de los tres criterios siguientes:
+ **El plazo de procesamiento por lotes alcanza su valor máximo.** El comportamiento predeterminado del plazo de procesamiento por lotes varía en función del origen de eventos específico.
  + **Para los orígenes de eventos de Kinesis, DynamoDB y Amazon SQS:** el plazo de procesamiento por lotes predeterminado es de 0 segundos. Esto significa que Lambda invoca su función tan pronto como los registros estén disponibles. Para establecer un plazo de procesamiento por lotes, configure `MaximumBatchingWindowInSeconds`. Puede establecer este parámetro en cualquier valor entre 0 y 300 segundos, en incrementos de 1 segundo. Si configura un plazo de procesamiento por lotes, el siguiente plazo comienza tan pronto como se completa la invocación de la función anterior.
  + **En el caso de los orígenes de eventos de Amazon MSK, Apache Kafka autoadministrado, Amazon MQ y Amazon DocumentDB:** el periodo de procesamiento por lotes predeterminado es de 500 ms. Puede configurar `MaximumBatchingWindowInSeconds` como cualquier valor entre 0 segundos y 300 segundos, en incrementos de segundos. En el modo aprovisionado para las asignaciones de orígenes de eventos de Kafka, al configurar una ventana de procesamiento por lotes, la siguiente ventana comienza tan pronto como se completa el lote anterior. En el modo no aprovisionado para las asignaciones de orígenes de eventos de Kafka, al configurar una ventana de procesamiento por lotes, la siguiente ventana comienza tan pronto como se completa la invocación de la función anterior. Para minimizar la latencia al utilizar las asignaciones de orígenes de eventos de Kafka en el modo aprovisionado, establezca `MaximumBatchingWindowInSeconds` en 0. Esta configuración garantiza que Lambda comenzará a procesar el siguiente lote inmediatamente después de completar la invocación de la función actual. Para obtener información adicional sobre el procesamiento de baja latencia, consulte [Apache Kafka de baja latencia](with-kafka-low-latency.md).
  + **En el caso de los orígenes de eventos de Amazon MQ y Amazon DocumentDB:** la ventana de procesamiento por lotes predeterminada es de 500 ms. Puede configurar `MaximumBatchingWindowInSeconds` como cualquier valor entre 0 segundos y 300 segundos, en incrementos de segundos. Un plazo de procesamiento por lotes comienza en cuanto llega el primer registro.
**nota**  
Como solo puede cambiar `MaximumBatchingWindowInSeconds` en incrementos de segundos, no puede volver al plazo de procesamiento por lotes predeterminado de 500 ms después de haberlo cambiado. Para restaurar el plazo de procesamiento por lotes predeterminado, debe crear una nueva asignación de origen de eventos.
+ **Se cumple el tamaño del lote.** El tamaño mínimo del lote es 1. El tamaño predeterminado y máximo del lote depende del origen de eventos. Para obtener más información sobre estos valores, consulte la especificación [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize) para la operación de la API de `CreateEventSourceMapping`.
+ **El tamaño de la carga alcanza los [6 MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).** Este límite no se puede modificar.

En el siguiente diagrama se ilustran estas tres condiciones. Supongamos que un plazo de procesamiento por lotes comienza a los `t = 7` segundos. En el primer escenario, el plazo de procesamiento por lotes alcanza su máximo de 40 segundos a los `t = 47` segundos después de acumular 5 registros. En el segundo escenario, el tamaño del lote llega a 10 antes de que venza el plazo de procesamiento por lotes, por lo que el plazo de procesamiento por lotes finaliza antes de tiempo. En el tercer escenario, se alcanza el tamaño máximo de la carga antes de que venza el plazo de procesamiento por lotes, por lo que el plazo de procesamiento por lotes finaliza antes de tiempo.

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/batching-window.png)


Recomendamos que pruebe con diferentes tamaños de lote y de registro para que la frecuencia de sondeo de cada origen de eventos se ajuste a la velocidad con la que la función es capaz de completar su tarea. El parámetro [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) de `BatchSize` controla el número máximo de registros que se pueden enviar a la función en cada invocación. A menudo, un tamaño de lote mayor puede absorber de forma más eficiente el tráfico adicional asociado a un conjunto de registros mayor, mejorando el desempeño.

Lambda no espera a que se complete una [extensión](lambda-extensions.md) configurada antes de enviar el siguiente lote para su procesamiento. En otras palabras, las extensiones pueden seguir ejecutándose mientras Lambda procesa el siguiente lote de registros. Esto puede provocar problemas de limitación si infringe alguno de los ajustes o límites de [simultaneidad](lambda-concurrency.md) de la cuenta. Para detectar si se trata de un posible problema, supervise sus funciones y compruebe si ve [métricas de simultaneidad](monitoring-concurrency.md#general-concurrency-metrics) más elevadas de lo esperado para la asignación de orígenes de eventos. Debido a los tiempos cortos entre invocaciones, Lambda puede informar brevemente un uso de simultaneidad superior al número de particiones. Esto puede ser cierto incluso para las funciones de Lambda sin extensiones.

De forma predeterminada, si su función devuelve un error, la asignación de origen de eventos vuelve a procesar todo el lote hasta que la función se complete correctamente o los elementos del lote venzan. Para garantizar el procesamiento en orden, la asignación de origen de eventos mantiene en pausa el procesamiento de la partición afectada hasta que se resuelve el error. Para los orígenes de flujos (DynamoDB y Kinesis), puede configurar la cantidad máxima de reintentos que Lambda puede realizar cuando la función devuelva un error. Los errores del servicio o las limitaciones que se producen cuando el lote no llega a la función no se tienen en cuenta para la cantidad de reintentos. También puede configurar la asignación de orígenes de eventos para enviar un registro de invocación a un [destino](invocation-async-retain-records.md#invocation-async-destinations) cuando descarta un lote de eventos.

## Modo aprovisionado
<a name="invocation-eventsourcemapping-provisioned-mode"></a>

La asignación de orígenes de eventos de Lambda utiliza sondeos de eventos para sondear el origen de eventos en busca de nuevos mensajes. De forma predeterminada, Lambda administra el escalado automático de estos sondeadores en función del volumen de los mensajes. Cuando el tráfico de mensajes aumenta, Lambda aumenta automáticamente el número de sondeos de eventos para gestionar la carga y los reduce cuando el tráfico disminuye.

En el modo aprovisionado, puede refinar el rendimiento de la asignación de orígenes de eventos si define límites mínimos y máximos para los recursos de sondeo específicos que permanecen listos para gestionar los patrones de tráfico esperados. Estos recursos se escalan automáticamente 3 veces más rápido para gestionar picos repentinos en el tráfico de eventos y proporcionan una capacidad 16 veces mayor para procesar millones de eventos. Esto lo ayuda a crear cargas de trabajo impulsadas por eventos con una alta capacidad de respuesta y requisitos de rendimiento estrictos.

En Lambda, un sondeador de eventos es una unidad de cómputo con capacidades de rendimiento que varían según el tipo de origen del evento. En el caso de Amazon MSK y Apache Kafka autoadministrado, cada sondeador de eventos puede gestionar hasta 5 MB/s de rendimiento o hasta 5 invocaciones simultáneas. Por ejemplo, si el origen de eventos produce una carga útil media de 1 MB y la duración media de la función es de 1 segundo, un único sondeador de eventos de Kafka puede admitir un rendimiento de 5 MB/s y 5 invocaciones simultáneas de Lambda (si se supone que no haya transformación de la carga útil). En el caso de Amazon SQS, cada sondeador de eventos puede gestionar hasta 1 MB/s de rendimiento o hasta 10 invocaciones simultáneas. El uso del modo aprovisionado incurre en costos adicionales en función del uso de sondeadores de eventos. Para obtener más información sobre precios, consulta [precios de AWS Lambda](https://aws.amazon.com/lambda/pricing/).

El modo aprovisionado solo es compatible con orígenes de eventos de Amazon MSK, Apache Kafka autoadministrado y Amazon SQS. Si bien la configuración de simultaneidad permite controlar la escala de su función, el modo aprovisionado permite controlar el rendimiento de la asignación de orígenes de eventos. Para garantizar el máximo rendimiento, puede que tenga que establecer ambos ajustes de forma independiente.

El modo aprovisionado es ideal para aplicaciones en tiempo real que requieren una latencia constante para el procesamiento de eventos, como las empresas de servicios financieros que procesan fuentes de datos de mercado, las plataformas de comercio electrónico que ofrecen recomendaciones personalizadas en tiempo real y las empresas de juegos que administran las interacciones de los jugadores en directo.

Cada sondeador de eventos admite una capacidad de rendimiento diferente:
+ En el caso de Amazon MSK y Apache Kafka autoadministrado: hasta 5 MB/s de rendimiento o hasta 5 invocaciones simultáneas.
+ Para Amazon SQS: hasta 1 MB/s de rendimiento o hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de SQS por segundo.

Para las asignaciones de orígenes de eventos de Amazon SQS, puede establecer el número mínimo de sondeadores entre 2 y 200, con un valor predeterminado de 2, y el número máximo entre 2 y 2000, con un valor predeterminado de 200. Lambda escala el número de sondeadores de eventos entre el mínimo y el máximo configurados, y suma rápidamente hasta 1000 concurrencias por minuto para proporcionar un procesamiento coherente de baja latencia de sus eventos.

Para las asignaciones de orígenes de eventos de Kafka, puede establecer el número mínimo de sondeadores entre 1 y 200, con un valor predeterminado de 1, y el número máximo entre 1 y 2000, con un valor predeterminado de 200. Lambda escala el número de sondeadores de eventos entre el mínimo y el máximo configurados en función de la acumulación de eventos en el tema para proporcionar un procesamiento de baja latencia de sus eventos.

Tenga en cuenta que, en el caso de los orígenes de eventos de Amazon SQS, la configuración de concurrencia máxima no se puede utilizar con el modo aprovisionado. Cuando utiliza el modo aprovisionado, controla la concurrencia mediante la configuración del número máximo de sondeadores de eventos.

Para obtener información sobre cómo configurar el modo de aprovisionamiento, consulte las secciones siguientes:
+ [Configuración del modo aprovisionado para las asignación de orígenes de eventos de Amazon MSK](kafka-scaling-modes.md)
+ [Configuración del modo aprovisionado para asignación de orígenes de eventos de Apache Kafka autoadministrados](kafka-scaling-modes.md#kafka-provisioned-mode)
+ [Uso del modo aprovisionado con las asignaciones de orígenes de eventos de Amazon SQS](with-sqs.md#sqs-provisioned-mode)

Para minimizar la latencia en el modo aprovisionado, configure `MaximumBatchingWindowInSeconds` en 0. Esta configuración garantiza que Lambda comenzará a procesar el siguiente lote inmediatamente después de completar la invocación de la función actual. Para obtener información adicional sobre el procesamiento de baja latencia, consulte [Apache Kafka de baja latencia](with-kafka-low-latency.md).

Tras configurar el modo aprovisionado, puede observar el uso de los sondeos de eventos para su carga de trabajo supervisando la métrica `ProvisionedPollers`. Para obtener más información, consulte [Métricas de asignación de orígenes de eventos](monitoring-metrics-types.md#event-source-mapping-metrics).

## API de asignación de orígenes de eventos
<a name="event-source-mapping-api"></a>

Para administrar un origen de eventos con la [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) o un [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/), puede utilizar las siguientes operaciones de la API:
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

# Uso de etiquetas en asignaciones de orígenes de eventos
<a name="tags-esm"></a>

Puede etiquetar asignaciones de orígenes de eventos para organizar y administrar sus recursos. Las etiquetas son pares de clave-valor de formato libre que se asocian a los recursos y que son compatibles con todos los Servicios de AWS. Para obtener más información sobre los casos de uso de las etiquetas, consulte [Estrategias de etiquetado habituales](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies) en la *Guía del editor de etiquetas y recursos de etiquetado de AWS*. 

Las asignaciones de orígenes de eventos están asociadas a funciones, que pueden tener sus propias etiquetas. Las asignaciones de orígenes de eventos no heredan automáticamente las etiquetas de las funciones. Puede utilizar la API de AWS Lambda para ver y actualizar etiquetas. También puede ver y actualizar las etiquetas mientras administra una asignación de orígenes de eventos específica en la consola de Lambda, incluidas las que utilizan el modo aprovisionado de Amazon SQS.

## Permisos necesarios para trabajar con etiquetas
<a name="esm-tags-required-permissions"></a>

Para permitir que una identidad de AWS Identity and Access Management (IAM) (usuario, grupo o rol) lea o establezca etiquetas en un recurso, conceda los permisos correspondientes:
+ **lambda:ListTags**: cuando un recurso tiene etiquetas, conceda este permiso a cualquier persona que necesite llamar a `ListTags` en este. En el caso de las funciones etiquetadas, este permiso también es necesario para `GetFunction`.
+ **lambda:TagResource**: conceda este permiso a cualquier persona que necesite llamar a `TagResource` o efectuar una etiqueta en la creación.

Si lo desea, considere conceder el permiso **lambda:UntagResource** y permitir las llamadas `UntagResource` al recurso.

Para obtener más información, consulte [Políticas de IAM basadas en identidad para Lambda](access-control-identity-based.md).

## Uso de etiquetas con la consola de Lambda
<a name="tags-esm-console"></a>

Puede utilizar la consola de Lambda para crear asignaciones de orígenes de eventos que tengan etiquetas, añadir etiquetas a las asignaciones de orígenes de eventos existentes y filtrar las asignaciones de orígenes de eventos por etiqueta, incluso aquellas configuradas en el modo aprovisionado de Amazon SQS.

Cuando agrega un desencadenador para los servicios basados en colas y transmisiones compatibles con la consola de Lambda, Lambda crea una asignación de orígenes de eventos de forma automática. Para obtener más información acerca de estos orígenes de eventos, consulte [Cómo procesa Lambda registros de orígenes de eventos basados en secuencias y colas](invocation-eventsourcemapping.md). Para crear una asignación de orígenes de eventos en la consola, necesitará los siguientes requisitos previos:
+ Una función de .
+ Un origen de eventos de un servicio afectado.

Puede agregar las etiquetas como parte de la misma interfaz de usuario que utiliza para crear o actualizar los desencadenadores.

**Adición de una etiqueta al crear una asignación de orígenes de eventos**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de su función.

1. En **Descripción general de la función**, elija **Agregar desencadenador**.

1. En **Configuración del desencadenador**, en la lista desplegable, elija el nombre del servicio del que proviene el origen de eventos.

1. Proporcione la configuración principal del origen de eventos. Para obtener más información sobre la configuración del origen de eventos, consulte la sección del servicio relacionado en [Invocar Lambda con eventos de otros servicios de AWS](lambda-services.md).

1. En **Configuración de la asignación de orígenes de eventos**, seleccione **Configuración adicional**.

1. En **Etiquetas**, elija **Agregar nueva etiqueta**.

1. En el campo **Clave**, ingrese la clave de la etiqueta. Para obtener información sobre las restricciones de etiquetado, consulte [Límites y requisitos de denominación de etiquetas](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices) en la *Guía del editor de etiquetas y recursos de etiquetado de AWS*.

1. Elija **Agregar**.

**Adición de etiquetas a una asignación de orígenes de eventos existente**

1. Abra [Asignaciones de orígenes de eventos](https://console.aws.amazon.com/lambda/home#/event-source-mappings) en la consola de Lambda.

1. En la lista de recursos, elija el **UUID** de la asignación de orígenes de eventos correspondiente a su **función** y el **ARN del origen de eventos**.

1. En la lista de pestañas situada debajo del **panel de configuración general**, elija **Etiquetas**.

1. Elija **Manage tags** (Administrar etiquetas).

1. Elija **Add new tag** (Agregar nueva etiqueta).

1. En el campo **Clave**, ingrese la clave de la etiqueta. Para obtener información sobre las restricciones de etiquetado, consulte [Límites y requisitos de denominación de etiquetas](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices) en la *Guía del editor de etiquetas y recursos de etiquetado de AWS*.

1. Seleccione **Save**.

**Filtrado de asignaciones de orígenes de eventos por etiqueta**

1. Abra [Asignaciones de orígenes de eventos](https://console.aws.amazon.com/lambda/home#/event-source-mappings) en la consola de Lambda.

1. Seleccione la barra de búsqueda.

1. En la lista desplegable, seleccione la clave de etiqueta situada debajo del subtítulo **Etiquetas**.

1. Seleccione **Usar: "etiqueta-nombre"** para ver todas las asignaciones de orígenes de eventos etiquetadas con esta clave o elija un **operador** para filtrar aún más por valor.

1. Seleccione el valor de la etiqueta para filtrarla por una combinación de clave y valor de la etiqueta.

El cuadro de búsqueda también permite buscar claves de etiqueta. Escriba el nombre de una clave para encontrarla en la lista.

## Uso de etiquetas con la AWS CLI
<a name="tags-esm-cli"></a>

Puede agregar y eliminar etiquetas en los recursos de Lambda existentes, incluidas las asignaciones de orígenes de eventos, con la API de Lambda. También puede agregar etiquetas al crear una asignación de orígenes de eventos, lo que le permite mantener un recurso etiquetado durante todo su ciclo de vida.

### Actualización de etiquetas con las API de etiquetas de Lambda
<a name="tags-esm-api-config"></a>

Puede agregar y eliminar etiquetas para los recursos de Lambda compatibles mediante las operaciones de API [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) y [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html).

También puede llamar a estas operaciones mediante la AWS CLI. Para agregar etiquetas a un recurso existente, utilice el comando `tag-resource`. En este ejemplo se agregan dos etiquetas, una con la clave *Department* y otra con la clave *CostCenter*.

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

Para eliminar etiquetas, utilice el comando `untag-resource`. En este ejemplo, se elimina la etiqueta con la clave *Department*.

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### Adición de etiquetas al crear una asignación de orígenes de eventos
<a name="tags-esm-on-create"></a>

Para crear una nueva asignación de orígenes de eventos de Lambda, utilice la operación de la API [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html). Especifique el parámetro `Tags`. Puede llamar a esta operación con el comando `create-event-source-mapping` de la AWS CLI y la opción `--tags`. Para obtener más información sobre el comando de la CLI, consulte [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) en la *Referencia de comandos de la AWS CLI*.

Antes de usar el parámetro `Tags` con `CreateEventSourceMapping`, asegúrese de que su rol tenga permiso para etiquetar los recursos junto con los permisos habituales necesarios para esta operación. Para obtener más información sobre permisos de etiquetado, consulte [Permisos necesarios para trabajar con etiquetas](#esm-tags-required-permissions).

### Visualización de etiquetas con las API de etiquetas de Lambda
<a name="tags-esm-api-view"></a>

Para ver las etiquetas que se aplican a un recurso de Lambda específico, utilice la operación de la API `ListTags`. Para obtener más información, consulte [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html).

Puede llamar a esta operación con el comando `list-tags` de la AWS CLI si proporciona un ARN (nombre de recurso de Amazon).

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### Filtrado de recursos por etiqueta
<a name="tags-esm-filtering"></a>

Puede utilizar la operación de la API de AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) para filtrar los recursos por etiquetas. La operación `GetResources` recibe hasta 10 filtros y cada uno contiene una clave de etiqueta y hasta 10 valores de etiqueta. Usted proporciona `GetResources` con un `ResourceType` para filtrar por tipos de recurso específicos.

Puede llamar a esta operación mediante el comando `get-resources` de la AWS CLI. Para ver ejemplos de uso de `get-resources`, consulte [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples) en la *Referencia de comandos de la AWS CLI*. 

# Controle qué eventos envía Lambda a la función
<a name="invocation-eventfiltering"></a>

Puede utilizar el filtrado de eventos para controlar qué registros de un flujo o una cola envía Lambda a su función. Por ejemplo, puede agregar un filtro para que la función solo procese los mensajes de Amazon SQS que contengan ciertos parámetros de datos. El filtrado de eventos solo funciona con determinadas asignaciones de orígenes de eventos. Puede agregar filtros a las asignaciones de orígenes de eventos de los siguientes Servicios de AWS:
+ Amazon DynamoDB
+ Amazon Kinesis Data Streams
+ Amazon MQ
+ Amazon Managed Streaming for Apache Kafka (Amazon MSK)
+ Apache Kafka autoadministrado
+ Amazon Simple Queue Service (Amazon SQS)

Para obtener información específica sobre el filtrado con orígenes de eventos específicos, consulte [Uso de filtros con diferentes Servicios de AWS](#filtering-by-service). Lambda no es compatible con el filtrado de eventos para Amazon DocumentDB.

De manera predeterminada, puede definir hasta cinco filtros diferentes para una única asignación de orígenes de eventos. Los filtros se unen de forma lógica. Si un registro del origen de eventos cumple con uno o más de sus filtros, Lambda incluye el registro en el siguiente evento que envíe a su función. Si no se cumple con ninguno de los filtros, Lambda descarta el registro.

**nota**  
Si necesita definir más de cinco filtros para un origen de eventos, puede solicitar un aumento de cuota de hasta 10 filtros para cada origen de eventos. Si intenta agregar más filtros de los que permite su cuota actual, Lambda devolverá un error al intentar crear el origen de eventos.

**Topics**
+ [

## Conceptos básicos del filtrado de eventos
](#filtering-basics)
+ [

## Gestión de registros que no cumplen con los criterios de filtro
](#filtering-criteria-not-met)
+ [

## Sintaxis de la regla de filtro
](#filtering-syntax)
+ [

## Adjuntar criterios de filtro a una asignación de origen de eventos (consola)
](#filtering-console)
+ [

## Adjuntar criterios de filtro a una asignación de origen de eventos (AWS CLI)
](#filtering-cli)
+ [

## Adjuntar criterios de filtro a una asignación de origen de eventos (AWS SAM)
](#filtering-sam)
+ [

## Cifrado de los criterios de filtro
](#filter-criteria-encryption)
+ [

## Uso de filtros con diferentes Servicios de AWS
](#filtering-by-service)

## Conceptos básicos del filtrado de eventos
<a name="filtering-basics"></a>

Un objeto de criterios de filtro (`FilterCriteria`) es una estructura que consta de una lista de filtros (`Filters`). Cada filtro es una estructura que define un patrón de filtrado de eventos (`Pattern`). Un patrón es una representación de cadenas de una regla de filtro de JSON. La estructura de un objeto `FilterCriteria` es la siguiente:

```
{
   "Filters": [
        {
            "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}"
        }
    ]
}
```

Para mayor claridad, este es el valor del `Pattern` del filtro ampliado en JSON no cifrado.

```
{
    "Metadata1": [ rule1 ],
    "data": {
        "Data1": [ rule2 ]
    }
}
```

El patrón de filtro puede incluir propiedades de metadatos, propiedades de datos o ambas. Los parámetros de metadatos disponibles y el formato de los parámetros de datos varían según el Servicio de AWS que actúe como origen del evento. Por ejemplo, supongamos que su asignación de orígenes de eventos recibe el siguiente registro de una cola de Amazon SQS:

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\\n \"City\": \"Seattle\",\\n \"State\": \"WA\",\\n \"Temperature\": \"46\"\\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
    "awsRegion": "us-east-2"
}
```
+ Las **propiedades de metadatos** son los campos que contienen información sobre el evento que creó el registro. En el registro de Amazon SQS de ejemplo, las propiedades de metadatos incluyen campos como `messageID`, `eventSourceArn` y `awsRegion`.
+ Las **propiedades de datos** son los campos del registro que contienen los datos de su flujo o cola. En el evento de Amazon SQS de ejemplo, la clave del campo de datos es `body` y las propiedades de datos son los campos `City`, `State` y `Temperature`.

Los diferentes tipos de orígenes de eventos utilizan diferentes valores de clave para sus campos de datos. Para filtrar las propiedades de datos, asegúrese de utilizar la clave correcta en el patrón del filtro. Para obtener una lista de las claves de filtrado de datos y ver ejemplos de patrones de filtro para cada uno de los Servicio de AWS compatibles, consulte [Uso de filtros con diferentes Servicios de AWS](#filtering-by-service).

El filtrado de eventos puede gestionar el filtrado JSON multinivel. Por ejemplo, fíjese en el siguiente fragmento de un registro de un flujo de DynamoDB:

```
"dynamodb": {
    "Keys": {
        "ID": {
            "S": "ABCD"
        }
        "Number": {
            "N": "1234"
    },
    ...
}
```

Supongamos que desea procesar solo los registros en los que el valor de la clave de clasificación `Number` sea 4567. En este caso, el objeto `FilterCriteria` sería similar al siguiente:

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }"
        }
    ]
}
```

Para mayor claridad, este es el valor del `Pattern` del filtro ampliado en JSON no cifrado. 

```
{
    "dynamodb": {
        "Keys": {
            "Number": {
                "N": [ "4567" ]
                }
            }
        }
}
```

## Gestión de registros que no cumplen con los criterios de filtro
<a name="filtering-criteria-not-met"></a>

La forma en que Lambda gestiona los registros que no cumplen con los criterios del filtrado depende del origen del evento.
+ En **Amazon SQS**, si un mensaje no cumple con los criterios de filtro, Lambda lo elimina automáticamente de la cola. No tiene que eliminar manualmente estos mensajes en Amazon SQS.
+ En **Kinesis** y **DynamoDB**, después de que los criterios de filtro evalúan un registro, el iterador de flujos supera este registro. Si el registro no cumple los criterios de filtro, no tiene que eliminarlo manualmente del origen de eventos. Tras el periodo de retención, Kinesis y DynamoDB eliminan automáticamente estos registros antiguos. Si quiere que los registros se eliminen antes, consulte [Changing the Data Retention Period](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html) (Cambiar el periodo de retención de datos).
+ En el caso de los mensajes de **Amazon MSK**, **Apache Kafka autoadministrado** y **Amazon MQ**, Lambda elimina los mensajes que no coinciden con todos los campos incluidos en el filtro. Para Amazon MSK y Apache Kafka autoadministrado, Lambda compila los desplazamientos de los mensajes coincidentes y no coincidentes después de invocar la función de forma correcta. En el caso de Amazon MQ, Lambda reconoce los mensajes coincidentes después de invocar la función de forma correcta y reconoce los mensajes no coincidentes al filtrarlos.

## Sintaxis de la regla de filtro
<a name="filtering-syntax"></a>

Para las reglas de filtro, Lambda es compatible con las reglas de Amazon EventBridge y utiliza la misma sintaxis que EventBridge. Para obtener más información, consulte [Patrones de eventos de Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html) en la *Guía del usuario de Amazon EventBridge*.

A continuación, se muestra un resumen de todos los operadores de comparación disponibles para el filtrado de eventos de Lambda.


| Operador de comparación | Ejemplo | Sintaxis de reglas | 
| --- | --- | --- | 
|  Nulo  |  El valor de UserID (ID de usuario) es nulo  |  “UserID”: [null]  | 
|  Vacío  |  LastName (Apellido) está vacío  |  “LastName”: [“”]  | 
|  Igual a  |  El valor de Name (Nombre) es “Alice”  |  “Name”: [“Alice”]  | 
|  Es igual a (omitir mayúsculas y minúsculas)  |  El valor de Name (Nombre) es “Alice”  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  Y  |  El valor de Location (Ubicación) es “New York” y el de Day (Día) es “Monday”  |  “Location”: [“New York”], “Day”: [“Monday”]  | 
|  O  |  El valor de PaymentType (Tipo de pago) es “Credit” (Crédito) o “Debit” (Débito)  |  “PaymentType”: [“Credit”, “Debit”]  | 
|  O (varios campos)  |  El valor de Location (Ubicación) es “New York” o el de Day (Día) es “Monday”.  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  No  |  El valor de Weather (Tiempo) es cualquier valor menos “Raining” (Lluvia)  |  “Weather”: [\$1“anything-but”: [“Raining”]\$1]  | 
|  Valor numérico (igual a)  |  El valor de Price (Precio) es 100  |  “Price”: [\$1“numeric”: [“=”, 100]\$1]  | 
|  Valor numérico (rango)  |  El valor de Price (Precio) es superior a 10 e inferior o igual a 20  |  “Price”: [\$1“numeric”: [“>”, 10, “<=”, 20]\$1]  | 
|  Existe  |  ProductName (Nombre de producto) existe  |  “ProductName”: [\$1“exists”: true\$1]  | 
|  No existe  |  El valor de ProductName (Nombre de producto) no existe  |  “ProductName”: [\$1“exists”: false\$1]  | 
|  Comienza por  |  El valor de Region (Región) se encuentra en US (EE. UU.)  |  “Region”: [\$1“prefix”: “us-”\$1]  | 
|  Acaba con  |  FileName termina con la extensión .png.  |  "FileName": [ \$1 "suffix": ".png" \$1 ]   | 

**nota**  
Al igual que EventBridge, para las cadenas, Lambda usa coincidencia exacta (carácter a carácter) sin necesidad de cambio de mayúsculas y minúsculas ni cualquier otra normalización de cadenas. Para los números, Lambda también usa la representación de cadenas. Por ejemplo, 300, 300.0 y 3.0e2 no se consideran iguales.

Tenga en cuenta que el operador Exists solo funciona en los nodos hoja del origen de eventos JSON. No coincide con nodos intermedios. Por ejemplo, con el siguiente JSON, el patrón de filtro `{ "person": { "address": [ { "exists": true } ] } }"` no encontraría ninguna coincidencia porque `"address"` es un nodo intermedio.

```
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}
```

## Adjuntar criterios de filtro a una asignación de origen de eventos (consola)
<a name="filtering-console"></a>

Siga estos pasos para crear una nueva asignación de origen de eventos con criterios de filtro mediante la consola de Lambda.

**Para crear una nueva asignación de origen de eventos con criterios de filtro (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función para la que se creará una asignación de origen de eventos.

1. En **Descripción general de la función**, elija **Agregar desencadenador**.

1. En **Trigger configuration** (Configuración del desencadenador), elija un tipo de desencadenador compatible con el filtrado de eventos. Para obtener una lista de los servicios compatibles, consulte la lista que aparece al principio de esta página.

1. Amplíe **Configuración adicional**.

1. En **Filter criteria** (Criterios de filtro), seleccione **Add** (Agregar), y luego defina e ingrese los filtros. Por ejemplo, puede ingresar lo siguiente.

   ```
   { "Metadata" : [ 1, 2 ] }
   ```

   De este modo, Lambda solo procesa los registros en los que el campo `Metadata` es igual a 1 o 2. Puede volver a seleccionar **Agregar** para agregar más filtros hasta la cantidad máxima permitida.

1. Cuando haya terminado de agregar filtros, elija **Guardar**.

Al ingresar criterios de filtro mediante la consola, solo ingresa el patrón de filtro y no necesita ingresar la clave `Pattern` ni las comillas de escape. En el paso 6 de las instrucciones anteriores, `{ "Metadata" : [ 1, 2 ] }` corresponde a los siguientes `FilterCriteria`.

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

Después de crear la asignación de origen de eventos en la consola, puede ver los `FilterCriteria` con formato en los detalles del desencadenador. Para obtener más ejemplos de cómo crear filtros de eventos con la consola, consulte [Uso de filtros con diferentes Servicios de AWS](#filtering-by-service).

## Adjuntar criterios de filtro a una asignación de origen de eventos (AWS CLI)
<a name="filtering-cli"></a>

Supongamos que quiere que una asignación de origen de eventos tenga los siguientes `FilterCriteria`:

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

Para crear una nueva asignación de orígenes de eventos con estos criterios de filtro mediante la AWS Command Line Interface (AWS CLI), ejecute el siguiente comando.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

El comando [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) crea una nueva asignación de orígenes de eventos de Amazon SQS para la función `my-function` con los `FilterCriteria` especificados.

Para agregar estos criterios de filtro a una asignación de orígenes de eventos existente, ejecute el siguiente comando.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

Tenga en cuenta que, para actualizar una asignación de origen de eventos, necesita su UUID. Puede obtener el UUID con una llamada a [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html). Lambda también devuelve el UUID en la respuesta de la CLI [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html).

Para eliminar los criterios de filtro de un origen de eventos, puede ejecutar el comando [update-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/update-event-source-mapping.html) con un objeto de `FilterCriteria` vacío.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria "{}"
```

Para obtener más ejemplos de cómo crear filtros de eventos con la AWS CLI, consulte [Uso de filtros con diferentes Servicios de AWS](#filtering-by-service).

## Adjuntar criterios de filtro a una asignación de origen de eventos (AWS SAM)
<a name="filtering-sam"></a>

 Supongamos que desea configurar un origen de eventos en AWS SAM para utilizar los siguientes criterios de filtro: 

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

 Para agregar estos criterios de filtro a su asignación de orígenes de eventos, inserte el siguiente fragmento en la plantilla YAML de su origen de eventos.

```
FilterCriteria: 
  Filters: 
    - Pattern: '{"Metadata": [1, 2]}'
```

 Para obtener más información sobre cómo crear y configurar una plantilla AWS SAM para una asignación de orígenes de eventos, consulte la sección [EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html) de la Guía para desarrolladores de AWS SAM. Para obtener más ejemplos de cómo crear filtros de eventos con AWS SAM, consulte [Uso de filtros con diferentes Servicios de AWS](#filtering-by-service). 

## Cifrado de los criterios de filtro
<a name="filter-criteria-encryption"></a>

De forma predeterminada, Lambda no cifra el objeto de criterios de filtro. En los casos de uso en los que pueda incluir información confidencial en el objeto de criterios de filtro, puede utilizar su propia [clave de KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) para cifrarlo.

Tras cifrar el objeto de criterios de filtro, puede ver su versión de texto sin formato mediante una llamada a la API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html). Debe tener permisos `kms:Decrypt` para poder ver correctamente los criterios de filtro en texto sin formato.

**nota**  
Si el objeto de criterios de filtro está cifrado, Lambda oculta el valor del campo `FilterCriteria` en la respuesta a las llamadas a [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html). En su lugar, este campo se muestra como `null`. Para ver el valor real de `FilterCriteria`, use la API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html).  
Para ver el valor descifrado de `FilterCriteria` en la consola, asegúrese de que su rol de IAM contenga permisos para [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html).

Puede especificar su propia clave de KMS mediante la consola, la API, la CLI o CloudFormation.

**Cifrado de los criterios de filtro con una clave de KMS propiedad del cliente (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija **Add trigger (Añadir disparador)**. Si ya tiene un desencadenador, seleccione la pestaña **Configuración** y, a continuación, seleccione **Desencadenadores**. Seleccione el desencadenador existente y, a continuación, elija **Editar**.

1. Seleccione la casilla de verificación situada junto a **Cifrar con una clave de KMS administrada por el cliente**.

1. En **Elegir una clave de cifrado de KMS administrada por el cliente**, seleccione una clave habilitada existente o cree una clave nueva. En función de la operación, necesitará algunos de los permisos siguientes (o todos): `kms:DescribeKey`, `kms:GenerateDataKey` y `kms:Decrypt`. Use la política de claves de KMS para conceder estos permisos.

Si utiliza su propia clave de KMS, en la [política de claves](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) deben permitirse las siguientes operaciones de la API:
+ `kms:Decrypt`: debe otorgarse a la entidad principal de servicio regional de Lambda (`lambda.AWS_region.amazonaws.com`). Permite a Lambda descifrar los datos con esta clave de KMS.
  + Para evitar un [problema de suplente confuso entre servicios](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html), la política de claves usa la clave de condición global [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn). El valor correcto de la clave `aws:SourceArn` es el ARN del recurso de asignación de orígenes de eventos, por lo que solo puede agregarlo a su política si conoce su ARN. Lambda también reenvía las claves `aws:lambda:FunctionArn` y `aws:lambda:EventSourceArn` y sus correspondientes valores en el [contexto de cifrado](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) al hacer una solicitud de descifrado a KMS. Estos valores deben coincidir con las condiciones especificadas en la política de claves para que la solicitud de descifrado se complete correctamente. No es necesario incluir EventSourceArn para los orígenes de eventos de Kafka autoadministrados, ya que no tienen EventSourceArn.
+ `kms:Decrypt`: también se debe conceder a la entidad principal que pretenda utilizar la clave para ver los criterios de filtro de texto sin formato en las llamadas a las API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) o [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html).
+ `kms:DescribeKey`: proporciona los detalles de la clave administrada por el cliente para permitir que la entidad principal especificada use la clave.
+ `kms:GenerateDataKey`: proporciona permisos para que Lambda genere una clave de datos para cifrar los criterios de filtro, en nombre de la entidad principal especificada ([cifrado de sobre](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)).

Puede utilizar AWS CloudTrail para hacer un seguimiento de las solicitudes de AWS KMS que Lambda hace en su nombre. Para ver ejemplos de eventos de CloudTrail, consulte [Supervisión de las claves de cifrado para Lambda](security-encryption-at-rest.md#encryption-key-monitoring).

También recomendamos usar la clave de condición [https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) para limitar el uso de la clave de KMS únicamente a las solicitudes de Lambda. El valor de esta clave es la entidad principal de servicio regional de Lambda (`lambda.AWS_region.amazonaws.com`). A continuación se incluye un ejemplo de política de claves que concede todos los permisos pertinentes:

**Example AWS KMSPolítica de claves de**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-key-policy-1",
    "Statement": [
        {
            "Sid": "Allow Lambda to decrypt using the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals" : {
                    "aws:SourceArn": [
                        "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:<esm_uuid>"
                    ]
                },
                "StringEquals": {
                    "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function",
                    "kms:EncryptionContext:aws:lambda:EventSourceArn": "arn:aws:sqs:us-east-1:123456789012:test-queue"
                }
            }
        },
        {
            "Sid": "Allow actions by an AWS account on the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key to specific roles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals" : {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com"
                }
            }
        }
    ]
}
```

Para usar su propia clave de KMS para cifrar los criterios de filtro, también puede usar el siguiente comando de la AWS CLI [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html). Especifique el ARN de la clave de KMS con la marca `--kms-key-arn`.

```
aws lambda create-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

Si ya tiene una asignación de orígenes de eventos, utilice el comando [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) de la AWS CLI en su lugar. Especifique el ARN de la clave de KMS con la marca `--kms-key-arn`.

```
aws lambda update-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

Esta operación sobrescribe cualquier clave de KMS que se haya especificado anteriormente. Si especifica la marca `--kms-key-arn` junto con un argumento vacío, Lambda deja de usar la clave de KMS para cifrar los criterios de filtro. En su lugar, Lambda vuelve a utilizar de forma predeterminada una clave propiedad de Amazon.

Para especificar su propia clave de KMS en una plantilla de CloudFormation, utilice la propiedad `KMSKeyArn` del tipo de recurso `AWS::Lambda::EventSourceMapping`. Por ejemplo, puede insertar el siguiente fragmento en la plantilla YAML de su origen de eventos.

```
MyEventSourceMapping:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    ...
    FilterCriteria:
      Filters:
        - Pattern: '{"a": [1, 2]}'
    KMSKeyArn: "arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599"
    ...
```

Para poder ver sus criterios de filtro cifrados en texto plano en una llamada a las API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) o [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html), debe tener permisos `kms:Decrypt`.

Desde el 6 de agosto de 2024, el campo `FilterCriteria` ya no aparece en los registros de AWS CloudTrail de las llamadas a las API [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html), [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) y [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) si su función no usa el filtrado de eventos. Si su función usa el filtrado de eventos, el campo `FilterCriteria` aparece vacío (`{}`). Puede seguir viendo los criterios de filtro en texto sin formato en la respuesta a las llamadas a la API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) si tiene permisos `kms:Decrypt` para la clave de KMS correcta.

### Ejemplo de entrada de registro de CloudTrail para las llamadas a Create/Update/DeleteEventSourceMapping
<a name="filter-criteria-encryption-cloudtrail"></a>

En el siguiente ejemplo de entrada de registro de AWS CloudTrail para una llamada a CreateEventSourceMapping, `FilterCriteria` aparece vacío (`{}`) porque la función utiliza el filtrado de eventos. Este es el caso incluso si el objeto `FilterCriteria` contiene criterios de filtro válidos que la función esté utilizando activamente. Si la función no utiliza el filtrado de eventos, CloudTrail no mostrará el campo `FilterCriteria` en las entradas de registro.

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA123456789EXAMPLE:userid1",
        "arn": "arn:aws:sts::123456789012:assumed-role/Example/example-role",
        "accountId": "123456789012",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA987654321EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/User1",
                "accountId": "123456789012",
                "userName": "User1"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-05-09T20:35:01Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-05-09T21:05:41Z",
    "eventSource": "lambda.amazonaws.com",
    "eventName": "CreateEventSourceMapping20150331",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "functionName": "example-function",
        "enabled": true,
        "batchSize": 10,
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "scalingConfig": {},
        "maximumBatchingWindowInSeconds": 0,
        "sourceAccessConfigurations": []
    },
    "responseElements": {
        "uUID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
        "batchSize": 10,
        "maximumBatchingWindowInSeconds": 0,
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:example-function",
        "lastModified": "May 9, 2024, 9:05:41 PM",
        "state": "Creating",
        "stateTransitionReason": "USER_INITIATED",
        "functionResponseTypes": [],
        "eventSourceMappingArn": "arn:aws:lambda:us-east-2:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLEbbbbb"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

## Uso de filtros con diferentes Servicios de AWS
<a name="filtering-by-service"></a>

Los diferentes tipos de orígenes de eventos utilizan diferentes valores de clave para sus campos de datos. Para filtrar las propiedades de datos, asegúrese de utilizar la clave correcta en el patrón del filtro. En la siguiente tabla se muestran las claves de filtrado para cada Servicio de AWS compatible.


| Servicio de AWS | Clave de filtrado | 
| --- | --- | 
| DynamoDB | dynamodb | 
| Kinesis | data | 
| Amazon MQ | data | 
| Amazon MSK | value | 
| Apache Kafka autoadministrado | value | 
| Amazon SQS | body | 

En las siguientes secciones se ofrecen ejemplos de patrones de filtro para diferentes tipos de orígenes de eventos. También proporcionan definiciones de los formatos de datos entrantes compatibles y los formatos de cuerpo de los patrones de filtro para cada servicio compatible.
+ [Uso del filtrado de eventos con una fuente de eventos de DynamoDB](with-ddb-filtering.md)
+ [Uso del filtrado de eventos con una fuente de eventos de Kinesis](with-kinesis-filtering.md)
+ [Filtrar eventos de una fuente de eventos de Amazon MQ](with-mq-filtering.md)
+ [Filtrado de eventos de Amazon MSK y de fuentes de eventos autoadministrados de Apache Kafka](kafka-filtering.md)
+ [Uso del filtrado de eventos con una fuente de eventos de Amazon SQS](with-sqs-filtering.md)

# Probar la función de Lambda con la consola
<a name="testing-functions"></a>

Puede probar la función Lambda en la consola invocando la función con un evento de prueba. Un *evento de prueba* es una entrada JSON a su función. Si la función no requiere una entrada, el evento puede ser un documento vacío `({})`.

Cuando ejecuta una prueba en la consola, Lambda invoca su función de forma sincrónica con el evento de prueba. El tiempo de ejecución de la función convierte el JSON del evento en un objeto y lo pasa al método de controlador de su código para su procesamiento.

**Crear un evento de prueba**  
Antes de poder realizar la prueba en la consola, debe crear un evento de prueba privado o que se pueda compartir.

## Invocación de funciones con eventos de prueba
<a name="invoke-with-event"></a>

**Para probar una función**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función que desea probar.

1. Elija la pestaña **Test** (Prueba).

1. En **Evento de prueba**, elija **Crear evento nuevo** o **Editar evento guardado** y, a continuación, elija el evento guardado que desea utilizar.

1. Si lo desea, elija una **plantilla** para el JSON del evento.

1. Seleccione **Probar**

1. En **Execution result** (Resultado de ejecución), expanda **Details** (Detalles) para ver los resultados.

Para invocar la función sin guardar el evento de prueba, seleccione **Test** (Probar) antes de guardar. Así se crea un evento de prueba sin guardar que Lambda solo conservará durante la sesión.

Para los tiempos de ejecución de Node.js, Python y Ruby, también puede acceder a los eventos de prueba guardados y no guardados existentes en la pestaña **Código**. Utilice la sección **EVENTOS DE PRUEBAS** para crear, editar y ejecutar pruebas.

## Creación de eventos de prueba privados
<a name="creating-private-events"></a>

Los eventos de prueba privados solo están disponibles para el creador y no requieren permisos adicionales para utilizarlos. Puede crear hasta 10 eventos de prueba privados por función.

**Si desea crear un evento de prueba**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función que desea probar.

1. Elija la pestaña **Test** (Prueba).

1. En **Test event** (Evento de prueba), haga lo siguiente:

   1. Elija una **plantilla**

   1. Introduzca un **nombre** para el evento de prueba.

   1. En el cuadro de entrada de texto, introduzca el evento de prueba JSON.

   1. En **Event sharing settings** (Configuración de uso compartido de eventos), elija **Private** (Privado).

1. Seleccione **Save changes (Guardar cambios)**.

Para los tiempos de ejecución de Node.js, Python y Ruby, también puede crear los eventos de prueba en la pestaña **Código**. Utilice la sección **EVENTOS DE PRUEBAS** para crear, editar y ejecutar pruebas.

## Creación de eventos de prueba compartibles
<a name="creating-shareable-events"></a>

Los eventos de prueba compartibles son aquellos que puede compartir con otros usuarios en la misma cuenta de AWS. Puede editar los eventos de prueba compartibles de otros usuarios e invocar su función con ellos.

Lambda guarda eventos de prueba compartibles como esquemas en un [registro de esquemas de Amazon EventBridge (CloudWatch Events)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-schema-registry.html) llamado `lambda-testevent-schemas`. Dado que Lambda utiliza este registro para almacenar y llamar a los eventos de prueba compartibles que cree, le recomendamos que no edite este registro ni cree uno mediante el nombre `lambda-testevent-schemas`.

Para ver, compartir y editar eventos de prueba compartibles, debe tener permisos para todas las siguientes [operaciones de API de registro de esquemas de EventBridge (CloudWatch Events](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/operations.html):
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema)

Tenga en cuenta que guardar las ediciones realizadas a un evento de prueba que se puede compartir sobrescribe ese evento.

Si no puede crear, editar o ver eventos de prueba compartibles, compruebe que su cuenta tiene los permisos necesarios para estas operaciones. Si tiene los permisos necesarios pero aún no puede acceder a eventos de prueba compartibles, compruebe si hay [Políticas basadas en recursos](access-control-resource-based.md) que podrían limitar el acceso al registro de EventBridge (CloudWatch Events).

**Para crear un evento de prueba compartible**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función que desea probar.

1. Elija la pestaña **Test** (Prueba).

1. En **Test event** (Evento de prueba), haga lo siguiente:

   1. Elija una **plantilla**

   1. Introduzca un **nombre** para el evento de prueba.

   1. En el cuadro de entrada de texto, introduzca el evento de prueba JSON.

   1. En **Event sharing settings** (Configuración de uso compartido de eventos), elija **Shareable** (Compartible).

1. Seleccione **Save changes (Guardar cambios)**.

**Utilice eventos de prueba que se puedan compartir con AWS Serverless Application Model.**  
Se puede utilizar AWS SAM para invocar eventos de prueba que se pueden compartir. Consulte [https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html) en la [Guía de desarrolladores de AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html).

## Eliminación de esquemas de eventos de prueba compartibles
<a name="deleting-test-schemas"></a>

Al eliminar eventos de prueba compartibles, Lambda los elimina del registro de `lambda-testevent-schemas`. Si elimina el último evento de prueba compartible del registro, Lambda lo elimina.

Si elimina la función, Lambda no elimina ningún esquema de eventos de prueba compartibles asociados. Debe limpiar estos recursos manualmente desde la [consola EventBridge (CloudWatch Events)](https://console.aws.amazon.com/events).

# Estados de función de Lambda
<a name="functions-states"></a>

Lambda incluye un campo de [Estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) en la configuración de la función para indicar cuando su función está lista. `State` proporciona información sobre el estado actual de la función e incluso si se puede invocar de forma correcta. Los estados de función no cambian el comportamiento de las invocaciones ni la forma en que la suya ejecuta el código.

**nota**  
Las definiciones de estado de las funciones difieren ligeramente para las funciones de [SnapStart](snapstart.md). Para obtener más información, consulte [Lambda SnapStart y estados de la función](snapstart-activate.md#snapstart-function-states).

En muchos casos, una tabla de DynamoDB es una forma ideal de retener el estado entre las invocaciones, ya que proporciona acceso a los datos de baja latencia y se puede escalar con el servicio Lambda. También puede almacenar datos en [Amazon EFS para Lambda](https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/) si utiliza este servicio, lo que proporciona un acceso de baja latencia al almacenamiento del sistema de archivos.

Los estados de función incluyen:
+ `Pending`: después de que Lambda cree la función, establece el estado en pendiente. Mientras está en estado pendiente, Lambda intenta crear o configurar recursos para la función, como recursos de VPC o EFS. Lambda no invoca una función mientras está en estado pendiente. Las invocaciones u otras acciones de API que actúen en la función producirán errores.
+ `Active`: la función pasa al estado activo después de que Lambda complete la configuración y el aprovisionamiento de recursos. Las funciones solo se pueden invocar correctamente mientras están activas.
+ `Failed`: indica que la configuración o el aprovisionamiento de recursos ha detectado un error. Cuando se produce un error en la creación de una función, Lambda establece el estado de la función como fallido y usted debe eliminarla y volver a crearla.
+ `Inactive`: una función se vuelve inactiva cuando ha estado inactiva el tiempo suficiente para que Lambda reclame los recursos externos que se configuraron para ella. Cuando intenta invocar una función que está inactiva, la invocación produce un error y Lambda establece la función en estado pendiente hasta que se vuelvan a crear sus recursos. Si Lambda no vuelve a crear los recursos, la función vuelve al estado inactivo. Es posible que tenga que resolver cualquier error y volver a implementar la función para restaurarla al estado activo.

Si utiliza flujos de trabajo de automatización basados ​​en SDK o llama directamente a las API de servicio de Lambda, asegúrese de verificar que la función esté activa antes de la invocación. Para hacerlo, utilice la acción de la API de Lambda [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) o configure un esperador mediante el [AWS SDK for Java 2.0](https://github.com/aws/aws-sdk-java-v2).

```
aws lambda get-function --function-name my-function --query 'Configuration.[State, LastUpdateStatus]'
```

Debería ver los siguientes datos de salida:

```
[
 "Active",
 "Successful" 
]
```

Se produce un error en las siguientes operaciones mientras la creación de la función está pendiente:
+ [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

## Estados de función durante las actualizaciones
<a name="functions-states-updating"></a>

Lambda tiene dos operaciones para actualizar las funciones:
+ [UpdateFunctionCode:](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html) actualiza el paquete de implementación de la función
+ [UpdateFunctionConfiguration:](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) actualiza la configuración de la función

Lambda usa el atributo [LastUpdateStatus](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionConfiguration.html#lambda-Type-FunctionConfiguration-LastUpdateStatus) para realizar un seguimiento del progreso de estas operaciones de actualización. Mientras hay una actualización en curso (cuándo `"LastUpdateStatus": "InProgress"`):
+ El [estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) de la función sigue siendo `Active`.
+ Las invocaciones siguen utilizando el código y la configuración anteriores de la función hasta que se complete la actualización.
+ Las siguientes operaciones fallan:
  + [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
  + [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
  + [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
  + [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)

Cuando se produce un error en una actualización (cuando `"LastUpdateStatus": "Failed"`):
+ El [estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) de la función sigue siendo `Active`.
+ Las invocaciones siguen utilizando el código y la configuración anteriores de la función.

**Example Respuesta GetFunctionConfiguration**  
El siguiente ejemplo es el resultado de la solicitud [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) en una función que se está actualizando.  

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
    "Runtime": "nodejs24.x",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-071f712345678e7c8",
            "subnet-07fd123456788a036",
            "subnet-0804f77612345cacf"
        ],
        "SecurityGroupIds": [
            "sg-085912345678492fb"
        ],
        "VpcId": "vpc-08e1234569e011e83"
    },
    "State": "Active",
    "LastUpdateStatus": "InProgress",
    ...
}
```

# Comprender el comportamiento de reintento en Lambda
<a name="invocation-retries"></a>

Al invocar una función de forma directa, se determina la estrategia para tratar los errores relacionados al código de la función. Lambda no reintenta de forma automática este tipo de errores en su nombre. Para reintentar, puede volver a invocar la función de forma manual y enviar el evento fallido a una cola para depurar o ignorar el error. El código de la función puede haberse ejecutado en su totalidad, en parte o no haberse ejecutado. Si vuelve a intentarlo, asegúrese de que el código de la función pueda gestionar el mismo evento varias veces sin generar transacciones duplicados u otros efectos colaterales no deseados.

Al invocar una función indirectamente, que debe tener en cuenta el comportamiento de reintento del invocador y cualquier servicio que la solicitud encuentra en el proceso. Esto incluye los siguientes escenarios.
+ **Invocación asíncrona**: Lambda reintenta los errores de funciones dos veces. Si la función no tiene capacidad suficiente para gestionar todas las solicitudes entrantes, los eventos podrían esperar en la cola durante horas para su envío a la función. Puede configurar una cola de mensajes fallidos en la función para capturar eventos que no se hubieran procesado correctamente. Para obtener más información, consulte [Cómo agregar una cola de mensajes fallidos](invocation-async-retain-records.md#invocation-dlq).
+ **Mapeos de fuente de eventos**: los mapeos de fuentes de eventos que leen desde flujos reintentan el lote de elementos completo. Los errores repetidos bloquean el procesamiento del fragmento afectado hasta que se resuelve el error o los elementos caduquen. Para detectar fragmentos estancados, puede monitorizar la métrica [antigüedad del iterador](monitoring-metrics.md).

  Para mapeos de orígenes de eventos que leen de una cola, debe determinar el período de tiempo entre los reintentos y el destino de los eventos fallidos configurando el tiempo de espera de visibilidad y la política de redireccionamiento en la cola de origen. Para obtener más información, consulte [Cómo procesa Lambda registros de orígenes de eventos basados en secuencias y colas](invocation-eventsourcemapping.md) y los temas específicos del servicio en [Invocar Lambda con eventos de otros servicios de AWS](lambda-services.md).
+ **Servicios de AWS**: los servicios de AWS pueden invocar la función de forma [sincrónica](invocation-sync.md) o asincrónica. Para la invocación síncrona, el servicio decide si volver a intentarlo. Por ejemplo, las operaciones por lotes de Amazon S3 reintentan la operación si la función Lambda devuelve un código de respuesta `TemporaryFailure`. Los servicios que solicitan proxy de un usuario o cliente ascendente pueden tener una estrategia de reintento o pueden transmitir la respuesta de error de vuelta al solicitante. Por ejemplo, API Gateway siempre retransmite la respuesta de error de vuelta al solicitante. 

  Para una invocación asíncrona, la lógica de reintento es la misma, independientemente del origen de invocación. De forma predeterminada, Lambda vuelve a intentar una invocación asíncrona fallida hasta dos veces. Para obtener más información, consulte [Cómo Lambda administra los errores y los reintentos mediante la invocación asíncrona](invocation-async-error-handling.md).
+ **Otras cuentas y clientes**: al conceder acceso a otras cuentas, puede utilizar [políticas basadas en recursos](access-control-resource-based.md) para restringir los servicios o recursos que pueden configurar para invocar la función. Para proteger su función de sobrecargas, considere la posibilidad de colocar una capa de API delante de su función con [Amazon API Gateway](services-apigateway.md).

Para ayudarle a abordar errores en aplicaciones de Lambda, Lambda se integra con servicios como Amazon CloudWatch y AWS X-Ray. Puede utilizar una combinación de registros, métricas, alarmas y seguimiento de para detectar e identificar rápidamente problemas en el código de la función, la API u otros recursos que admiten la aplicación. Para obtener más información, consulte [Supervisión, depuración y solución de problemas de funciones de Lambda](lambda-monitoring.md).

# Utilice la detección de bucles recursivos de Lambda para evitar bucles infinitos
<a name="invocation-recursion"></a>

Cuando configura una función de Lambda para que se envíe al mismo servicio o recurso que invoca la función, es posible que se cree un bucle recursivo infinito. Por ejemplo, una función de Lambda puede escribir un mensaje en una cola de Amazon Simple Queue Service (Amazon SQS) y, a continuación, invocar la misma función. Esta invocación hace que la función escriba otro mensaje en la cola, que a su vez vuelve a invocar la función.

Los bucles recursivos involuntarios pueden hacer que se facturen cargos inesperados en su Cuenta de AWS. Los bucles también pueden hacer que Lambda [escale](lambda-concurrency.md) y utilice toda la simultaneidad disponible en su cuenta. Para ayudar a reducir el impacto de los bucles involuntarios, Lambda detecta ciertos tipos de bucles recursivos poco después de que se produzcan. De forma predeterminada, cuando Lambda detecta un bucle recursivo, detiene la invocación de la función y se lo notifica. Si su diseño utiliza patrones recursivos de forma intencionada, puede cambiar la configuración predeterminada de una función para que se pueda invocar de forma recursiva. Para obtener más información, consulte [Permiso para que una función de Lambda se ejecute en un bucle recursivo](#invocation-recursion-disable).

**Topics**
+ [

## Descripción de la detección de bucles recursivos
](#invocation-recursion-concepts)
+ [

## Servicios de AWS y SDK admitidos
](#invocation-recursion-supported)
+ [

## Notificaciones de bucle recursivo
](#invocation-recursion-monitoring)
+ [

## Cómo responder a las notificaciones de detección de bucles recursivos
](#invocation-recursion-responding)
+ [

## Permiso para que una función de Lambda se ejecute en un bucle recursivo
](#invocation-recursion-disable)
+ [

## Regiones en las que se admite la detección de bucles recursivos de Lambda
](#invocation-recursion-regions)

## Descripción de la detección de bucles recursivos
<a name="invocation-recursion-concepts"></a>

La detección de bucles recursivos de Lambda funciona mediante el seguimiento de eventos. Lambda es un servicio de computación basado en eventos que ejecuta el código de una función cuando se producen ciertos eventos. Por ejemplo, cuando se agrega un elemento a una cola de Amazon SQS o a un tema de Amazon Simple Notification Service (Amazon SNS). Lambda pasa los eventos a la función como objetos JSON, que contienen información sobre el cambio en el estado del sistema. Cuando un evento hace que la función se ejecute, esto se denomina *invocación.*

Para detectar bucles recursivos, Lambda usa encabezados de seguimiento de [AWS X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html). Cuando los [Servicios de AWS que admiten la detección de bucles recursivos](#invocation-recursion-supportedservices) envían eventos a Lambda, esos eventos se anotan automáticamente con metadatos. Cuando la función de Lambda escribe uno de estos eventos en otro Servicio de AWS que admite una [versión compatible de un SDK de AWS](#invocation-recursion-supportedsdks), se actualizan los metadatos. Los metadatos actualizados incluyen un recuento del número de veces que el evento ha invocado la función.

**nota**  
No es necesario habilitar el seguimiento activo de X-Ray para que esta característica funcione. La detección de bucles recursivos está activada de forma predeterminada para todos los clientes de AWS. El uso de la característica es gratuito.

Una *cadena de solicitudes* es una secuencia de invocaciones de Lambda provocada por el mismo evento desencadenante. Por ejemplo, imagine que una cola de Amazon SQS invoca su función de Lambda. A continuación, la función de Lambda envía el evento procesado a la misma cola de Amazon SQS, que vuelve a invocar la función. En este ejemplo, cada invocación de la función se encuentra en la misma cadena de solicitudes.

Si su función se invoca aproximadamente 16 veces en la misma cadena de solicitudes, Lambda detiene automáticamente la siguiente invocación de la función en esa cadena de solicitudes y se lo notifica. Si la función está configurada con varios desencadenadores, las invocaciones de otros desencadenadores no se verán afectadas.

**nota**  
Incluso cuando la configuración `maxReceiveCount` de la política de redireccionamiento de la cola de origen es superior a 16, la protección contra la recursión de Lambda no impide que Amazon SQS vuelva a intentar el mensaje después de detectar y finalizar un bucle recursivo. Cuando Lambda detecta un bucle recursivo y descarta las invocaciones posteriores, devuelve un `RecursiveInvocationException` a la asignación de orígenes de eventos. Esto aumenta el valor `receiveCount` del mensaje. Lambda sigue reintentando el mensaje y sigue bloqueando las invocaciones de funciones hasta que Amazon SQS determine que `maxReceiveCount` se ha superado y envía el mensaje a la cola de mensajes fallidos configurada.

Si tiene un [destino en caso de error](invocation-async-retain-records.md#invocation-async-destinations) o [una cola de mensajes fallidos](invocation-async-retain-records.md#invocation-dlq) configurados para su función, Lambda también envía el evento desde la invocación detenida a su destino o cola de mensajes fallidos. Cuando configure un destino o una cola de mensajes fallidos para su función, asegúrese de no usar un desencadenador de eventos o una asignación de orígenes de eventos que también use su función. Si envía eventos al mismo recurso que invoca su función, puede crear otro bucle recursivo y este, a su vez, también se terminará. Si opta por no activar la detección del bucle recursivo, este bucle no se terminará.

## Servicios de AWS y SDK admitidos
<a name="invocation-recursion-supported"></a>

Lambda solo puede detectar bucles recursivos que incluyan ciertos Servicios de AWS admitidos. Para que se detecten bucles recursivos, la función también debe utilizar uno de los AWS SDK compatibles.

### Servicios de AWS admitidos
<a name="invocation-recursion-supportedservices"></a>

Por el momento, Lambda detecta bucles recursivos entre sus funciones, Amazon SQS, Amazon S3 y Amazon SNS. Lambda también detecta bucles compuestos únicamente por funciones de Lambda, que pueden invocarse entre sí de forma sincrónica o asíncrona. En los siguientes diagramas, se muestran algunos ejemplos de bucles que Lambda puede detectar:

![\[Diagramas de bucles recursivos entre una función de Lambda, Amazon SNS, Amazon S3 y una cola de Amazon SQS.\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/RunawayWorkloadDetected_v3.png)


Por el momento, Lambda no puede detectar ni detener otro Servicio de AWS, como Amazon DynamoDB, cuando este forma parte del bucle.

Dado que, por ahora, Lambda solo detecta bucles recursivos que incluyan Amazon SQS, Amazon S3 y Amazon SNS, es posible que los bucles que incluyan otros Servicios de AWS puedan provocar un uso no deseado de las funciones de Lambda.

Para evitar que se le facturen cargos inesperados en su Cuenta de AWS, le recomendamos que configure las [alarmas de Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) para que le avisen sobre patrones de uso inusuales. Por ejemplo, puede configurar CloudWatch para que le notifique sobre picos en la simultaneidad o las invocaciones de las funciones de Lambda. También puede configurar una [alarma de facturación](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) para que le avise cuando el gasto en su cuenta supere el límite que especifique. También puede utilizar [AWS Cost Anomaly Detection](https://docs.aws.amazon.com/cost-management/latest/userguide/manage-ad.html) para recibir notificaciones sobre patrones de facturación inusuales.

### AWS SDK admitidos
<a name="invocation-recursion-supportedsdks"></a>

Para que Lambda detecte bucles recursivos, la función debe usar una de las siguientes versiones del SDK o una versión superior:


| Tiempo de ejecución | Versión mínima requerida del AWS SDK | 
| --- | --- | 
|  Node.js  |  2.1147.0 (SDK versión 2) 3.105.0 (SDK versión 3)  | 
|  Python  |  1.24.46 (boto3) 1.27.46 (botocore)  | 
|  Java 8 y Java 11  |  2.17.135  | 
|  Java 17  |  2.20.81  | 
|  Java 21  |  2.21.24  | 
|  .NET  |  3.7.293.0  | 
|  Ruby  |  3.134.0  | 
|  PHP  |  3.232.0  | 
|  Go  |  V2 SDK 1.57.0  | 

Algunos tiempos de ejecución de Lambda, como Python y Node.js, incluyen una versión del AWS SDK. Si la versión del SDK incluida en el tiempo de ejecución de la función es inferior al mínimo requerido, puede agregar una versión compatible del SDK al paquete de despliegue de la función. También puede agregar una versión compatible del SDK a la función mediante una [capa de Lambda](chapter-layers.md). Para obtener una lista de los SDK incluidos en cada tiempo de ejecución de Lambda, consulte  [Tiempos de ejecución de Lambda](lambda-runtimes.md).

## Notificaciones de bucle recursivo
<a name="invocation-recursion-monitoring"></a>

Cuando Lambda detiene un bucle recursivo, recibirá notificaciones por medio de [Panel de estado](https://aws.amazon.com/premiumsupport/technology/aws-health-dashboard/) y a través del correo electrónico. También puede usar las métricas de CloudWatch para supervisar la cantidad de invocaciones recursivas que ha detenido Lambda.

### Panel de estadoNotificaciones de
<a name="invocation-recursion-phd"></a>

Cuando Lambda detiene una invocación recursiva, Panel de estado muestra una notificación en la página **Estado de su cuenta**, en [Problemas abiertos y recientes](https://health.aws.amazon.com/health/home#/account/dashboard/open-issues). Tenga en cuenta que pueden pasar hasta tres horas y media después de que Lambda detenga una invocación recursiva antes de que se muestre esta notificación. Para obtener más información sobre cómo ver los eventos de la cuenta en Panel de estado, consulte [Introducción al Panel de AWS Health: el estado de su cuenta](https://docs.aws.amazon.com/health/latest/ug/getting-started-health-dashboard.html) en la *Guía del usuario de AWS Health*.

### Alertas por correo electrónico
<a name="invocation-recursion-email"></a>

Cuando Lambda detiene por primera vez una invocación recursiva de su función, le envía una alerta por correo electrónico. Lambda envía un máximo de un correo electrónico cada 24 horas para cada función de su Cuenta de AWS. Después de que Lambda envíe una notificación por correo electrónico, no recibirá más correos electrónicos para esa función hasta dentro de 24 horas, incluso si Lambda detiene nuevas invocaciones recursivas de la función. Tenga en cuenta que pueden pasar hasta tres horas y media después de que Lambda detenga una invocación recursiva antes de que reciba esta alerta por correo electrónico.

Lambda envía alertas por correo electrónico sobre bucles recursivos al contacto de cuenta principal de su Cuenta de AWS y al contacto de operaciones alternativas. Para obtener información sobre cómo ver o actualizar las direcciones de correo electrónico de su cuenta, consulte [Actualización de la información de contacto](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact.html) en la *Referencia general de AWS*.

### Métricas de Amazon CloudWatch
<a name="invocation-recursion-cloudwatch"></a>

La [métrica de CloudWatch](monitoring-metrics-types.md) `RecursiveInvocationsDropped` registra el número de invocaciones de funciones que Lambda ha detenido porque la función se ha invocado más de 16 veces aproximadamente en una sola cadena de solicitudes. Lambda emite esta métrica tan pronto como detiene una invocación recursiva. Para ver esta métrica, siga las instrucciones de [Visualización de métricas en la consola de CloudWatch](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html#monitoring-metrics-console) y elija la métrica `RecursiveInvocationsDropped`.

## Cómo responder a las notificaciones de detección de bucles recursivos
<a name="invocation-recursion-responding"></a>

Cuando el mismo evento desencadenante invoca la función más de 16 veces aproximadamente, Lambda detiene la siguiente invocación de la función para que ese evento rompa el bucle recursivo. Para evitar que vuelva a aparecer un bucle recursivo que Lambda ha roto, haga lo siguiente: 
+ Reduzca la [simultaneidad](lambda-concurrency.md) disponible de la función a cero, lo que limita todas las invocaciones futuras.
+ Elimine o deshabilite el desencadenador o la asignación de orígenes de eventos que invoca su función.
+ Identifique y corrija los defectos del código que devuelven los eventos al recurso de AWS que invoca la función. Un origen común de defectos se produce cuando se utilizan variables para definir el origen y el destino de los eventos de una función. Compruebe que no está usando el mismo valor para ambas variables.

Además, si el origen de eventos de la función de Lambda es una cola de Amazon SQS, considere la posibilidad de [configurar una cola de mensajes fallidos](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html) en la cola de origen.

**nota**  
Asegúrese de configurar la cola de mensajes fallidos en la cola de origen y no en la función de Lambda. La cola de mensajes fallidos que configure en una función se utiliza para la [cola de invocación asíncrona](invocation-async.md) de la función, no para las colas de origen de eventos.

Si el origen del evento es un tema de Amazon SNS, considere agregar un [destino en caso de error](invocation-async-retain-records.md#invocation-async-destinations) para su función.

**Para reducir a cero la simultaneidad disponible de la función (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de su función.

1. Elija **Limitar**.

1. En el cuadro de diálogo **Limitar la función**, seleccione **Confirmar**.

**Para eliminar un desencadenador o una asignación de orígenes de eventos de la función (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de su función.

1. Elija la pestaña **Configuración** y, a continuación, seleccione **Desencadenadores**.

1. En **Desencadenadores**, seleccione el desencadenador o la asignación de orígenes de eventos que desee eliminar y, a continuación, seleccione **Eliminar**.

1. En el cuadro de diálogo **Eliminar desencadenadores**, seleccione **Eliminar**.

**Para deshabilitar una asignación de orígenes de eventos de la función (AWS CLI)**

1. Para encontrar el UUID de la asignación de orígenes de eventos que desea deshabilitar, ejecute el comando de AWS Command Line Interface (AWS CLI) [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/list-event-source-mappings.html).

   ```
   aws lambda list-event-source-mappings
   ```

1. Para deshabilitar la asignación de orígenes de eventos, ejecute el siguiente comando de AWS CLI [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html).

   ```
   aws lambda update-event-source-mapping --function-name MyFunction \
   --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled
   ```

## Permiso para que una función de Lambda se ejecute en un bucle recursivo
<a name="invocation-recursion-disable"></a>

Si su diseño utiliza un bucle recursivo de forma intencionada, puede configurar una función de Lambda para que se pueda invocar de forma recursiva. Recomendamos que evite el uso de bucles recursivos en su diseño. Los errores de implementación pueden provocar invocaciones recursivas con toda la simultaneidad disponible de la Cuenta de AWS y hacer que se facturen cargos imprevistos a su cuenta.

**importante**  
Si utiliza bucles recursivos, trátelos con precaución. Implemente las medidas de protección recomendadas para minimizar los riesgos de errores de implementación. Para obtener más información sobre las prácticas recomendadas para usar patrones recursivos, consulte [Recursive patterns that cause run-away Lambda functions](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) en Serverless Land.

Puede configurar funciones para permitir bucles recursivos mediante la consola de Lambda, la AWS Command Line Interface (AWS CLI) y la API [PutFunctionRecursionConfig](https://docs.aws.amazon.com//lambda/latest/api/API_PutFunctionRecursionConfig.html). También puede configurar el parámetro de detección de bucles recursivos de una función en AWS SAM y CloudFormation. 

De forma predeterminada, Lambda detecta y termina los bucles recursivos. A menos que su diseño utilice bucles recursivos de forma intencionada, le recomendamos que no cambie la configuración predeterminada de sus funciones.

Tenga en cuenta que cuando configura una función para permitir bucles recursivos, no se emite la [métrica de CloudWatch](monitoring-metrics-types.md#invocation-metrics) `RecursiveInvocationsDropped` .

------
#### [ Console ]

**Permiso para que una función se ejecute en un bucle recursivo (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de su función para abrir la página de detalles correspondiente.

1. Seleccione la pestaña **Configuración** y, a continuación, seleccione **Detección de simultaneidad y recursión**.

1. Junto a **Detección de bucles recursivos**, elija **Editar**.

1. Seleccione **Permitir bucles recursivos**.

1. Seleccione **Save**.

------
#### [ AWS CLI ]

Puede usar la API [PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) para permitir que su función se invoque en un bucle recursivo. Especifique `Allow` para el parámetro de bucle recursivo. Por ejemplo, puede llamar a esta API con el comando `put-function-recursion-config` de la AWS CLI:

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow
```

------

Puede volver a cambiar la configuración de la función a la configuración predeterminada para que Lambda termine los bucles recursivos cuando los detecte. Edite la configuración de la función mediante la consola de Lambda o la AWS CLI.

------
#### [ Console ]

**Configuración de una función para que los bucles recursivos se terminen (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de su función para abrir la página de detalles correspondiente.

1. Seleccione la pestaña **Configuración** y, a continuación, seleccione **Detección de simultaneidad y recursión**.

1. Junto a **Detección de bucles recursivos**, elija **Editar**.

1. Seleccione **Terminar bucles recursivos**.

1. Seleccione **Save**.

------
#### [ AWS CLI ]

Puede usar la API [PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) para configurar la función de modo que Lambda termine los bucles recursivos cuando los detecte. Especifique `Terminate` para el parámetro de bucle recursivo. Por ejemplo, puede llamar a esta API con el comando `put-function-recursion-config` de la AWS CLI:

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate
```

------

## Regiones en las que se admite la detección de bucles recursivos de Lambda
<a name="invocation-recursion-regions"></a>

La detección de bucles recursivos Lambda está disponible en todas las [regiones comerciales](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region), excepto en México (centro).

# Creación y administración de URL de funciones de Lambda
<a name="urls-configuration"></a>

Una URL de función es un punto de conexión HTTP(S) dedicado para la función de Lambda. Puede crear y configurar una URL de función a través de la consola de Lambda o la API de Lambda.

**sugerencia**  
Lambda ofrece dos formas de invocar la función a través de un punto de conexión HTTP: URL de función y Amazon API Gateway. Si no está seguro de cuál es el mejor método para el caso, consulte [Selección de un método para invocar una función de Lambda mediante una solicitud HTTP](furls-http-invoke-decision.md).

Al crear una URL de función, Lambda genera automáticamente un punto de conexión de URL único para usted. Una vez que crea una URL de función, el punto de conexión de la URL nunca cambia. Los puntos de conexión de la URL de función tienen el siguiente formato:

```
https://<url-id>.lambda-url.<region>.on.aws
```

**nota**  
Las URL de función no se admiten en las siguientes Regiones de AWS: Asia-Pacífico (Hyderabad) (`ap-south-2`), Asia-Pacífico (Melbourne) (`ap-southeast-4`), Asia-Pacífico (Malasia) (`ap-southeast-5`), Asia Pacífico (Nueva Zelanda) (`ap-southeast-6`), Asia Pacífico (Tailandia) (`ap-southeast-7`) Asia-Pacífico (Taipéi) (`ap-east-2`), Oeste de Canadá (Calgary) (`ca-west-1`), Europa (España) (`eu-south-2`), Europa (Zúrich) (`eu-central-2`), Israel (Tel Aviv) (`il-central-1`) y Medio Oriente (EAU) (`me-central-1`).

Las URL de funciones están habilitadas para doble pila y son compatibles con IPv4 e IPv6. Después de configurar una URL de función para su función, puede invocar la función a través de su punto de conexión HTTP(S) mediante un navegador web, curl, Postman o cualquier cliente HTTP.

**nota**  
Puede acceder a la URL de la función solo a través de la Internet pública. Si bien las funciones de Lambda son compatibles con AWS PrivateLink, las URL de las funciones no lo son.

Las URL de funciones de Lambda utilizan [políticas basadas en recursos](access-control-resource-based.md) para la seguridad y el control de acceso. Las URL de funciones también admiten opciones de configuración de uso compartido de recursos entre orígenes (CORS).

Puede aplicar las URL de las funciones a cualquier alias de la función o a la versión `$LATEST` de la función no publicada. No se puede agregar una URL de función a ninguna otra versión de la función.

La siguiente sección muestra cómo crear y administrar una URL de función mediante la consola de Lambda, la AWS CLI y la plantilla de CloudFormation.

**Topics**
+ [

## Creación de una URL de función (consola)
](#create-url-console)
+ [

## Creación de una URL de función (AWS CLI)
](#create-url-cli)
+ [

## Adición de una URL de función a una plantilla de CloudFormation
](#urls-cfn)
+ [

## Compartir recursos entre orígenes (CORS)
](#urls-cors)
+ [

## URL de funciones de limitación
](#urls-throttling)
+ [

## Desactivación de URL de funciones
](#urls-deactivating)
+ [

## Eliminación de URL de función
](#w2aac39c81c53)
+ [

# Control de acceso a las URL de las funciones de Lambda
](urls-auth.md)
+ [

# Invocación de URL de funciones de Lambda
](urls-invocation.md)
+ [

# Supervisión de las URL de funciones de Lambda
](urls-monitoring.md)
+ [

# Selección de un método para invocar una función de Lambda mediante una solicitud HTTP
](furls-http-invoke-decision.md)
+ [

# Tutorial: Creación de un punto de conexión de webhook mediante la URL de una función de Lambda
](urls-webhook-tutorial.md)

## Creación de una URL de función (consola)
<a name="create-url-console"></a>

Siga estos pasos para crear una URL de función mediante la consola.

### Para crear una URL de función para una función existente
<a name="create-url-existing-function"></a>

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función para la que desea crear la URL de función.

1. Elija la pestaña **Configuration** (Configuración) y, a continuación, elija **Function URL** (URL de función).

1. Elija **Create function URL** (Crear URL de función).

1. Para el **Auth type** (Tipo de autenticación), elija **AWS\$1IAM** o **NONE** (NINGUNO). Para obtener más información sobre la autenticación de URL de función, consulte [Control de acceso](urls-auth.md).

1. (Opcional) Seleccione **Configure cross-origin resource sharing (CORS)** (Configuración de uso compartido de recursos entre orígenes [CORS]) y, a continuación, configure los ajustes de CORS para la URL de función. Para obtener más información acerca de CORS, consulte [Compartir recursos entre orígenes (CORS)](#urls-cors).

1. Seleccione **Save**.

Esto crea una URL de función para la versión `$LATEST` no publicada de la función. La URL de función aparece en la sección **Function overview** (Información general de la función) de la consola.

### Para crear una URL de función para un alias existente
<a name="create-url-existing-alias"></a>

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función con el alias para el que desea crear la URL de función.

1. Elija la pestaña **Aliases** (Alias) y, a continuación, elija el nombre del alias para el que desea crear la URL de función.

1. Elija la pestaña **Configuration** (Configuración) y, a continuación, elija **URL de función** (URL de función).

1. Elija **Create function URL** (Crear URL de función).

1. Para el **Auth type** (Tipo de autenticación), elija **AWS\$1IAM** o **NONE** (NINGUNO). Para obtener más información sobre la autenticación de URL de función, consulte [Control de acceso](urls-auth.md).

1. (Opcional) Seleccione **Configure cross-origin resource sharing (CORS)** (Configuración de uso compartido de recursos entre orígenes [CORS]) y, a continuación, configure los ajustes de CORS para la URL de función. Para obtener más información acerca de CORS, consulte [Compartir recursos entre orígenes (CORS)](#urls-cors).

1. Seleccione **Save**.

Esto crea una URL de función para el alias de la función. La URL de función aparece en la sección **Información general de la función** para su alias.

### Para crear una nueva función con una URL de función
<a name="create-url-new-function"></a>

**Para crear una nueva función con una URL de función (consola)**

1. Abra la página de [Functions](https://console.aws.amazon.com/lambda/home#/functions) (Funciones) en la consola de Lambda.

1. Elija **Create function (Crear función)**.

1. Bajo **Basic information (Información básica)**, haga lo siguiente:

   1. En **Function name** (Nombre de la función), ingrese un nombre para la función, como **my-function**.

   1. En **Tiempo de ejecución**, elija el tiempo de ejecución del lenguaje que prefiera, como **Node.js 24**.

   1. En **Architecture** (Arquitectura), elija **x86\$164** o **arm64**.

   1. Expanda **Permissions** (Permisos) y, a continuación, elija si desea crear un nuevo rol de ejecución o utilizar uno existente.

1. Expanda **Advanced settings** (Configuración avanzada) y, a continuación, seleccione **Function URL** (URL de función).

1. Para el **Auth type** (Tipo de autenticación), elija **AWS\$1IAM** o **NONE** (NINGUNO). Para obtener más información sobre la autenticación de URL de función, consulte [Control de acceso](urls-auth.md).

1. (Opcional) Seleccione **Configure cross-origin resource sharing (CORS)** (Configuración de uso compartido de recursos entre orígenes [CORS]). Al seleccionar esta opción durante la creación de la función, la URL de función permite solicitudes de todos los orígenes de forma predeterminada. Puede editar la configuración de CORS de la URL de función después de crear la función. Para obtener más información acerca de CORS, consulte [Compartir recursos entre orígenes (CORS)](#urls-cors).

1. Seleccione **Creación de función**.

Esto crea una nueva función con una URL de función para la versión `$LATEST` no publicada de la función. La URL de función aparece en la sección **Function overview** (Información general de la función) de la consola.

## Creación de una URL de función (AWS CLI)
<a name="create-url-cli"></a>

Para crear una URL de función para una función de Lambda existente mediante la AWS Command Line Interface (AWS CLI), ejecute el siguiente comando:

```
aws lambda create-function-url-config \
    --function-name my-function \
    --qualifier prod \ // optional
    --auth-type AWS_IAM
    --cors-config {AllowOrigins="https://example.com"} // optional
```

Esto añade una URL de función al calificador **prod** para la función **my-function**. Para obtener más información acerca de estos parámetros de configuración, consulte [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html) en la referencia de la API.

**nota**  
Para crear una URL de función mediante la AWS CLI, la función ya debe existir.

## Adición de una URL de función a una plantilla de CloudFormation
<a name="urls-cfn"></a>

Para agregar un recurso de `AWS::Lambda::Url` a su plantilla de CloudFormation, utilice la siguiente sintaxis:

### JSON
<a name="urls-cfn-json"></a>

```
{
  "Type" : "AWS::Lambda::Url",
  "Properties" : {
      "AuthType" : String,
      "Cors" : Cors,
      "Qualifier" : String,
      "TargetFunctionArn" : String
    }
}
```

### YAML
<a name="urls-cfn-yaml"></a>

```
Type: AWS::Lambda::Url
Properties: 
  AuthType: String
  Cors: 
    Cors
  Qualifier: String
  TargetFunctionArn: String
```

### Parameters
<a name="urls-cfn-params"></a>
+ (Obligatorio) `AuthType`: define el tipo de autenticación de la URL de función. Los valores posibles son `AWS_IAM` o `NONE`. Para restringir el acceso solo a los usuarios autenticados, establézcalo en `AWS_IAM`. Para omitir la autenticación de IAM y permitir que cualquier usuario realice solicitudes a su función, establézcalo en `NONE`.
+ (Opcional) `Cors`: define la [configuración de CORS](#urls-cors) para la URL de función. Para agregar `Cors` al recurso de `AWS::Lambda::Url` en CloudFormation, utilice la siguiente sintaxis.

    
**Example AWS::Lambda::Url.Cors (JSON)**  

  ```
  {
    "AllowCredentials" : Boolean,
    "AllowHeaders" : [ String, ... ],
    "AllowMethods" : [ String, ... ],
    "AllowOrigins" : [ String, ... ],
    "ExposeHeaders" : [ String, ... ],
    "MaxAge" : Integer
  }
  ```  
**Example AWS::Lambda::Url.Cors (YAML)**  

  ```
    AllowCredentials: Boolean
    AllowHeaders: 
      - String
    AllowMethods: 
      - String
    AllowOrigins: 
      - String
    ExposeHeaders: 
      - String
    MaxAge: Integer
  ```
+ (Opcional) `Qualifier`: el nombre del alias.
+ (Obligatorio) `TargetFunctionArn`: el nombre o nombre de recurso de Amazon (ARN) de la función de Lambda. Los formatos de nombre válidos incluyen los siguientes:
  + **Nombre de la función** – `my-function`
  + **ARN de la función** – `arn:aws:lambda:us-west-2:123456789012:function:my-function`
  + **ARN parcial** – `123456789012:function:my-function`

## Compartir recursos entre orígenes (CORS)
<a name="urls-cors"></a>

Para definir cómo los distintos orígenes pueden acceder a la URL de función, utilice el [uso compartido de recursos entre orígenes (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). Recomendamos configurar CORS si tiene la intención de llamar a la URL de función desde otro dominio. Lambda es compatible con los siguientes encabezados CORS para las URL de funciones.


| Encabezado CORS | Propiedad de configuración de CORS | Valores de ejemplo | 
| --- | --- | --- | 
|  [ Access-Control-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)  |  `AllowOrigins`  |  `*` (permitir todos los orígenes) `https://www.example.com` `http://localhost:60905`  | 
|  [ Access-Control-Allow-Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods)  |  `AllowMethods`  |  `GET`, `POST`, `DELETE`, `*`  | 
|  [ Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)  |  `AllowHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers)  |  `ExposeHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Allow-Credentials](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials)  |  `AllowCredentials`  |  `TRUE`  | 
|  [ Access-Control-Max-Age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age)  |  `MaxAge`  |  `5` (predeterminado), `300`  | 

Al configurar CORS para una URL de función mediante la consola de Lambda o la AWS CLI, Lambda agrega automáticamente los encabezados CORS a todas las respuestas a través de la URL de función. También puede agregar manualmente encabezados CORS a la respuesta de la función. Si hay encabezados contradictorios, el comportamiento esperado depende del tipo de solicitud:
+ Para las solicitudes de verificación previa, como las solicitudes OPTIONS, prevalecen los encabezados CORS configurados en la URL de función. Lambda devuelve solo estos encabezados CORS en la respuesta.
+ Para las solicitudes que no son de verificación previa, como las solicitudes GET o POST, Lambda devuelve tanto los encabezados CORS configurados en la URL de función como los encabezados CORS devueltos por la función. Esto puede provocar encabezados CORS duplicados en la respuesta. Es posible que vea un error como el siguiente: `The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed`.

En general, se recomienda configurar todos los ajustes de CORS en la URL de función, en lugar de enviar los encabezados CORS manualmente en la respuesta de la función.

## URL de funciones de limitación
<a name="urls-throttling"></a>

La limitación limita la velocidad a la que la función procesa las solicitudes. Esto resulta útil en muchas situaciones, como evitar que la función sobrecargue los recursos descendentes o gestionar un aumento repentino de las solicitudes.

Puede limitar la tasa de solicitudes que procesa la función de Lambda a través de una URL de función configurando la simultaneidad reservada. La simultaneidad reservada limita el número de invocaciones simultáneas máximas para la función. La tasa máxima de solicitudes por segundo (RPS) de la función equivale a 10 veces la simultaneidad reservada configurada. Por ejemplo, si configura la función con una simultaneidad reservada de 100, el RPS máximo es de 1000.

Cada vez que la simultaneidad de la función supera la simultaneidad reservada, la URL de función devuelve un código de estado HTTP `429`. Si la función recibe una solicitud que supera 10 veces el máximo de RPS en función de la simultaneidad reservada configurada, también recibirá un error HTTP `429`. Para obtener más información acerca de la simultaneidad reservada, consulte [Configurar la simultaneidad reservada para una función](configuration-concurrency.md).

## Desactivación de URL de funciones
<a name="urls-deactivating"></a>

En caso de emergencia, es posible que quiera rechazar todo el tráfico a la URL de función. Para desactivar la URL de función, establezca la simultaneidad reservada en cero. Esto limita todas las solicitudes a la URL de función, lo que da como resultado respuestas de estado HTTP `429`. Para reactivar la URL de función, elimine la configuración de simultaneidad reservada o establezca la configuración en un importe superior a cero.

## Eliminación de URL de función
<a name="w2aac39c81c53"></a>

Al eliminar una URL de función, no se la puede recuperar. La creación de una nueva URL de función dará como resultado una dirección URL diferente.

**nota**  
Si elimina una URL de función con el tipo de autenticación `NONE`, Lambda no elimina de forma automática la política basada en recursos asociada. Si desea eliminar esta política, debe hacerlo de forma manual.

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función.

1. Elija la pestaña **Configuration** (Configuración) y, a continuación, elija **Function URL** (URL de función).

1. Elija **Eliminar**.

1. Escriba la palabra *delete* (eliminar) en el campo para confirmar la eliminación.

1. Elija **Eliminar**.

**nota**  
Al eliminar una función que tiene una URL de función, Lambda la elimina de forma asíncrona. Si crea inmediatamente una función nueva con el mismo nombre en la misma cuenta, es posible que la URL de la función original se asigne a la nueva función en lugar de eliminarse.

# Control de acceso a las URL de las funciones de Lambda
<a name="urls-auth"></a>

**nota**  
A partir de octubre de 2025, las nuevas URL de función requerirán ambos permisos, `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`.

Puede controlar el acceso a las URL de funciones de Lambda mediante el parámetro [AuthType](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html#lambda-CreateFunctionUrlConfig-request-AuthType) combinado con [políticas basadas en recursos](access-control-resource-based.md) adjuntas a la función específica. La configuración de estos dos componentes determina quién puede invocar o realizar otras acciones administrativas en la URL de función.

El parámetro `AuthType` determina cómo Lambda autentica o autoriza las solicitudes a la URL de función. Al configurar la URL de función, debe especificar una de las siguientes opciones de `AuthType`:
+ `AWS_IAM`: Lambda utiliza AWS Identity and Access Management (IAM) para autenticar y autorizar solicitudes basadas en la política de identidad de la entidad principal de IAM y la política basada en recursos de la función. Elija esta opción si desea que solo los usuarios y roles autenticados invoquen su función a través de la URL de función.
+ `NONE`: Lambda no realiza ninguna autenticación antes de invocar la función. Sin embargo, la política basada en recursos de la función siempre está vigente y debe conceder acceso público para que la URL de función pueda recibir solicitudes. Elija esta opción para permitir el acceso público y no autenticado a la URL de función.

Para obtener más información sobre la seguridad, puede utilizar AWS Identity and Access Management Access Analyzer para obtener un análisis exhaustivo del acceso externo a la URL de función. IAM Access Analyzer también supervisa los permisos nuevos o actualizados en las funciones de Lambda para ayudarle a identificar los permisos que otorgan acceso público y entre cuentas. Puede utilizar IAM Access Analyzer sin cargo. Para comenzar a utilizar IAM Access Analyzer, consulte [Uso de AWS IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html).

Esta página contiene ejemplos de políticas basadas en recursos para ambos tipos de autenticación y cómo crear estas políticas mediante la operación de la API [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) o la consola de Lambda. Para obtener información acerca de cómo invocar la URL de función después de configurar los permisos, consulte [Invocación de URL de funciones de Lambda](urls-invocation.md).

**Topics**
+ [

## Uso del tipo de autenticación `AWS_IAM`
](#urls-auth-iam)
+ [

## Uso del tipo de autenticación `NONE`
](#urls-auth-none)
+ [

## Gobierno y control de acceso
](#urls-governance)

## Uso del tipo de autenticación `AWS_IAM`
<a name="urls-auth-iam"></a>

Si elige el tipo de autenticación `AWS_IAM`, los usuarios que necesiten invocar la URL de función de Lambda deben tener el permiso `lambda:InvokeFunctionUrl` y también el permiso `lambda:InvokeFunction`. Según quién realice la solicitud de invocación, es posible que deba conceder este permiso mediante una [política basada en recursos](access-control-resource-based.md).

Si la entidad principal que realiza la solicitud está en la misma Cuenta de AWS que la URL de función, entonces la entidad principal debe tener **o bien** los permisos `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction` en su [política basada en identidad](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html), **o** permisos concedidos en la política basada en recursos de la función. En otras palabras, una política basada en recursos es opcional si el usuario ya tiene permisos `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction` en su política basada en identidad. La evaluación de políticas sigue las reglas descritas en la [lógica de evaluación de políticas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html).

Si la entidad principal que realiza la solicitud se encuentra en una cuenta diferente, la entidad principal debe tener **tanto** una política basada en identidad que le otorgue permisos `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction` **como** permisos concedidos en una política basada en recursos sobre la función que intenta invocar. La evaluación de políticas sigue las reglas descritas en [Cómo determinar si una solicitud se permite o se deniega entre cuentas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account).

La siguiente política basada en recursos permite al rol `example` en la Cuenta de AWS `444455556666` invocar la URL de función asociada a la función `my-function`. La clave de contexto [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) restringe la acción `lambda:InvokeFunction` a las llamadas de la URL de función. Esto significa que la entidad principal debe usar la URL de función para invocar la función. Si no incluye `lambda:InvokedViaFunctionUrl`, la entidad principal puede invocar su función mediante otros métodos de invocación, además de la URL de función.

**Example : política entre cuentas basada en recursos**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "AWS_IAM"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

Puede crear esta política basada en recursos a través de la consola siguiendo estos pasos:

**Para conceder permisos de invocación de URL a otra cuenta (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de la función para la que desea conceder permisos de invocación de la URL.

1. Elija la pestaña **Configuration** (Configuración) y, a continuación, elija **Permissions** (Permisos).

1. En **Resource-based policy** (Política basada en recursos), elija **Add permissions** (Agregar permisos).

1. Elija **Function URL** (URL de función).

1. En **Auth type** (Tipo de autenticación), elija **AWS\$1IAM**.

1. Introduzca un **identificador de estado de cuenta** para su declaración de póliza.

1. En **Entidad principal**, ingrese el ID de cuenta o el nombre de recurso de Amazon (ARN) del usuario o rol al que desea conceder permisos. Por ejemplo: **444455556666**.

1. Seleccione **Save**.

Como alternativa, puede crear esta instrucción de política mediante los comandos [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) AWS Command Line Interface (AWS CLI). Al usar la AWS CLI, debe agregar los estados de cuenta `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction` los estados por separado. Por ejemplo:

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal 444455556666 \
  --function-url-auth-type AWS_IAM
```

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal 444455556666 \
  --invoked-via-function-url
```

## Uso del tipo de autenticación `NONE`
<a name="urls-auth-none"></a>

**importante**  
Cuando el tipo de autenticación de la URL de función es `NONE` y tiene una [política basada en recursos](access-control-resource-based.md) que concede acceso público, cualquier usuario no autenticado con la URL de función puede invocar la función.

En algunos casos, es posible que desee que la URL de función sea pública. Por ejemplo, es posible que desee atender solicitudes realizadas directamente desde un navegador web. Para permitir el acceso público a la URL de función, elija el tipo de autenticación `NONE`.

Si elige el tipo de autenticación `NONE`, Lambda no utilizará IAM para autenticar las solicitudes a la URL de función. Sin embargo, su función debe tener una política basada en recursos que permita `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`. Al crear una URL de función con tipo de autenticación `NONE` a través de la consola o AWS Serverless Application Model (AWS SAM), Lambda crea automáticamente la política basada en recursos por usted. Si utiliza la AWS CLI, AWS CloudFormation o la API de Lambda directamente, debe [agregar la política usted](#policy-cli).

Le recomendamos que incluya la clave de contexto [lambda:InvokedViaFunctionUrlL](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) en sus políticas basadas en recursos cuando utilice el tipo de autenticación `NONE`. Esta clave de contexto garantiza que la función solo se pueda invocar a través de la URL de función y no a través de otros métodos de invocación.

Tenga en cuenta lo siguientes sobre esta política:
+ Todas las entidades pueden llamar `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`. Esto significa que cualquier persona que tenga la URL de función puede invocarla.
+ El valor de la clave de condición `lambda:FunctionUrlAuthType` es `NONE`. Esto significa que la instrucción de política solo permite el acceso cuando el tipo de autenticación de la URL de función también es `NONE`.
+ La condición `lambda:InvokedViaFunctionUrl` garantiza que la función solo se pueda invocar a través de la URL de función y no a través de otros métodos de invocación.

**Example : política predeterminada basada en recursos para el tipo de autenticación NONE**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FunctionURLAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "NONE"
        }
      }
    },
    {
      "Sid": "FunctionURLInvokeAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

**Crear la política basada en recursos con AWS CLI**  
A menos que utilice la consola o AWS SAM para crear una URL de función con un tipo de autenticación `NONE`, debe agregar usted mismo la política basada en recursos. Utilice los siguientes comandos para crear declaraciones para los permisos `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`. Cada declaración debe añadirse en un comando independiente.

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal * \
  --function-url-auth-type NONE
```

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal * \
  --invoked-via-function-url
```

**nota**  
Si elimina una URL de función con el tipo de autenticación `NONE`, Lambda no elimina de forma automática la política basada en recursos asociada. Si desea eliminar esta política, debe hacerlo de forma manual.

Si la política basada en recursos de una función no concede permisos `lambda:invokeFunctionUrl` y `lambda:InvokeFunction`, los usuarios obtendrán un código de error 403 Forbidden (Prohibido) cuando intenten invocar la URL de función, incluso si la URL de función utiliza el tipo de autenticación . Esto ocurrirá incluso si la URL de función utiliza el tipo de autenticación `NONE`.

## Gobierno y control de acceso
<a name="urls-governance"></a>

Además de los permisos de invocación de la URL de función, también puede controlar el acceso a las acciones utilizadas para configurar las URL de funciones. Lambda es compatible con las siguientes acciones de política de IAM para las URL de funciones:
+ `lambda:InvokeFunctionUrl`: invocar una función de Lambda mediante la URL de función.
+ `lambda:CreateFunctionUrlConfig` – crear una URL de función y configurar su `AuthType`.
+ `lambda:UpdateFunctionUrlConfig` – actualizar una configuración de URL de función y su `AuthType`.
+ `lambda:GetFunctionUrlConfig`: ver los detalles de una URL de función.
+ `lambda:ListFunctionUrlConfigs`: enumerar las configuraciones de la URL de función.
+ `lambda:DeleteFunctionUrlConfig`: eliminar una URL de función.

Para permitir o denegar el acceso de otras entidades de AWS a la URL de función, incluya estas acciones en las políticas de IAM. Por ejemplo, la siguiente política concede permisos al rol `example` en la Cuenta de AWS `444455556666` para actualizar la URL de función para la función **my-function** en la cuenta `123456789012`.

**Example política de URL de función entre cuentas**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action": "lambda:UpdateFunctionUrlConfig",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function"
        }
    ]
}
```

### Claves de condición
<a name="urls-condition-keys"></a>

Para obtener un control de acceso detallado sobre las URL de funciones, utilice claves de contexto de condición. Lambda es compatible con las siguientes claves de contexto para las URL de funciones.
+ `lambda:FunctionUrlAuthType`: define un valor de enumeración que describe el tipo de autenticación que utiliza la URL de función. El valor puede ser `AWS_IAM` o `NONE`.
+ `lambda:InvokedViaFunctionUrl`: restringe la acción `lambda:InvokeFunction` a las llamadas realizadas a través de la URL de función. Esto garantiza que la función solo se pueda invocar a través de la URL de función y no a través de otros métodos de invocación. Para ver ejemplos de políticas basadas en recursos que utilizan la clave de contexto `lambda:InvokedViaFunctionUrl`, consulte los ejemplos de [Uso del tipo de autenticación `AWS_IAM`](#urls-auth-iam) y [Uso del tipo de autenticación `NONE`](#urls-auth-none).

Puede utilizar estas claves de contexto en las políticas asociadas a la función. Por ejemplo, es posible que desee restringir quién puede realizar cambios de configuración en las URL de funciones. Para denegar todas las solicitudes `UpdateFunctionUrlConfig` a cualquier función con tipo de autenticación de URL `NONE`, puede definir la siguiente política:

**Example política de URL de función con denegación explícita**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action":[
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
```

Para conceder permisos al rol `example` en la Cuenta de AWS `444455556666` para hacer solicitudes `CreateFunctionUrlConfig` y `UpdateFunctionUrlConfig` en funciones con tipo de autenticación de URL `AWS_IAM`, puede definir la siguiente política:

**Example política de URL de función con permiso explícito**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

También puede utilizar esta clave de condición en una [política de control de servicios](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCP). Utilice las SCP para administrar los permisos en toda una organización en AWS Organizations. Por ejemplo, para denegar a los usuarios la creación o actualización de URL de funciones que utilicen un tipo de autenticación distinto a `AWS_IAM`, utilice la siguiente política de control de servicios:

**Example SCP de URL de función con denegación explícita**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:*",
            "Condition": {
                "StringNotEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

# Invocación de URL de funciones de Lambda
<a name="urls-invocation"></a>

Una URL de función es un punto de conexión HTTP(S) dedicado para la función de Lambda. Puede crear y configurar una URL de función a través de la consola de Lambda o la API de Lambda.

**sugerencia**  
Lambda ofrece dos formas de invocar la función a través de un punto de conexión HTTP: URL de función y Amazon API Gateway. Si no está seguro de cuál es el mejor método para el caso, consulte [Selección de un método para invocar una función de Lambda mediante una solicitud HTTP](furls-http-invoke-decision.md).

Al crear una URL de función, Lambda genera automáticamente un punto de conexión de URL único para usted. Una vez que crea una URL de función, el punto de conexión de la URL nunca cambia. Los puntos de conexión de la URL de función tienen el siguiente formato:

```
https://<url-id>.lambda-url.<region>.on.aws
```

**nota**  
Las URL de función no se admiten en las siguientes Regiones de AWS: Asia-Pacífico (Hyderabad) (`ap-south-2`), Asia-Pacífico (Melbourne) (`ap-southeast-4`), Asia-Pacífico (Malasia) (`ap-southeast-5`), Asia Pacífico (Nueva Zelanda) (`ap-southeast-6`), Asia Pacífico (Tailandia) (`ap-southeast-7`) Asia-Pacífico (Taipéi) (`ap-east-2`), Oeste de Canadá (Calgary) (`ca-west-1`), Europa (España) (`eu-south-2`), Europa (Zúrich) (`eu-central-2`), Israel (Tel Aviv) (`il-central-1`) y Medio Oriente (EAU) (`me-central-1`).

Las URL de funciones están habilitadas para doble pila y son compatibles con IPv4 e IPv6. Después de configurar la URL de función, puede invocar la función a través de su punto de conexión HTTP(S) mediante un navegador web, curl, Postman o cualquier cliente HTTP. Para invocar una URL de función, debe tener permisos `lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`. Para obtener más información, consulte [Control de acceso](urls-auth.md).

**Topics**
+ [

## Conceptos básicos de invocación de URL de funciones
](#urls-invocation-basics)
+ [

## Cargas de solicitud y respuesta
](#urls-payloads)

## Conceptos básicos de invocación de URL de funciones
<a name="urls-invocation-basics"></a>

Si la URL de función utiliza el tipo de autenticación `AWS_IAM`, debe firmar cada solicitud HTTP utilizando [AWS Signature Version 4 (SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). Herramientas tales como [Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2) ofrecen formas integradas de firmar sus solicitudes con SigV4.

Si no utiliza una herramienta para firmar solicitudes HTTP en la URL de función, debe firmar manualmente cada solicitud mediante SigV4. Cuando la URL de función recibe una solicitud, Lambda también calcula la firma SigV4. Lambda procesa la solicitud solo si las firmas coinciden. Para obtener instrucciones sobre cómo firmar de manera manual las solicitudes con SigV4, consulte [Firmar solicitudes de AWS con Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html) en la *Guía de Referencia general de Amazon Web Services*.

Si la URL de función utiliza el tipo de autenticación `NONE`, no es necesario que firme las solicitudes con SigV4. Puede invocar la función mediante un navegador web, curl, Postman o cualquier cliente HTTP.

Para probar solicitudes `GET` simples a su función, utilice un navegador web. Por ejemplo, si la URL de función es `https://abcdefg.lambda-url.us-east-1.on.aws`, y toma un parámetro de cadena `message`, la URL de la solicitud podría tener un aspecto similar al siguiente:

```
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
```

Para probar otras solicitudes HTTP, como una solicitud `POST`, puede utilizar una herramienta como curl. Por ejemplo, si desea incluir algunos datos JSON en una solicitud `POST` a la URL de función, puede utilizar el siguiente comando curl:

```
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## Cargas de solicitud y respuesta
<a name="urls-payloads"></a>

Cuando un cliente llama a la URL de función, Lambda asigna la solicitud a un objeto de evento antes de pasarla a la función. A continuación, la respuesta de la función se asigna a una respuesta HTTP que Lambda envía de vuelta al cliente a través de la URL de función.

Los formatos de eventos de solicitud y respuesta siguen el mismo esquema que la [versión de formato de carga 2.0 de Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).

### Formato de carga de solicitud
<a name="urls-request-payload"></a>

La carga de una solicitud tiene la siguiente estructura:

```
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "header1": "value1",
    "header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "<urlid>",
    "authentication": null,
    "authorizer": {
        "iam": {
                "accessKey": "AKIA...",
                "accountId": "111122223333",
                "callerId": "AIDA...",
                "cognitoIdentity": null,
                "principalOrgId": null,
                "userArn": "arn:aws:iam::111122223333:user/example-user",
                "userId": "AIDA..."
        }
    },
    "domainName": "<url-id>.lambda-url.us-west-2.on.aws",
    "domainPrefix": "<url-id>",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "123.123.123.123",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  },
  "body": "Hello from client!",
  "pathParameters": null,
  "isBase64Encoded": false,
  "stageVariables": null
}
```


| Parámetro | Descripción | Ejemplo | 
| --- | --- | --- | 
|  `version`  |  La versión de formato de carga de este evento. Actualmente, las URL de funciones de Lambda son compatibles con la [versión de formato de carga 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).  |  `2.0`  | 
|  `routeKey`  |  Las URL de funciones no utilizan este parámetro. Lambda establece `$default` como marcador de posición.  |  `$default`  | 
|  `rawPath`  |  Ruta de acceso de la solicitud. Por ejemplo, si la URL de solicitud es `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`, el valor de la ruta sin procesar es `/example/test/demo`.  |  `/example/test/demo`  | 
|  `rawQueryString`  |  La cadena sin procesar que contiene los parámetros de cadena de consulta de la solicitud. Los caracteres admitidos incluyen `a-z`, `A-Z`, `0-9`, `.`, `_`, `-`, `%`, `&`, `=` y `+`.  |  `"?parameter1=value1&parameter2=value2"`  | 
|  `cookies`  |  Una matriz que contiene todas las cookies enviadas como parte de la solicitud.  |  `["Cookie_1=Value_1", "Cookie_2=Value_2"]`  | 
|  `headers`  |  La lista de encabezados de solicitud, presentada como pares clave-valor.  |  `{"header1": "value1", "header2": "value2"}`  | 
|  `queryStringParameters`  |  Los parámetros de consulta de la solicitud. Por ejemplo, si la URL de solicitud es `https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane`, el valor `queryStringParameters` es un objeto JSON con una clave de `name` y un valor de `Jane`.  |  `{"name": "Jane"}`  | 
|  `requestContext`  |  Un objeto que contiene información adicional sobre la solicitud, como el `requestId`, el momento de la solicitud y la identidad del intermediario si se autoriza a través de AWS Identity and Access Management (IAM).  |   | 
|  `requestContext.accountId`  |  El ID de Cuenta de AWS del propietario de la función.  |  `"123456789012"`  | 
|  `requestContext.apiId`  |  El ID de la URL de función.  |  `"33anwqw8fj"`  | 
|  `requestContext.authentication`  |  Las URL de funciones no utilizan este parámetro. Lambda establece esto como `null`.  |  `null`  | 
|  `requestContext.authorizer`  |  Un objeto que contiene información sobre la identidad del intermediario, si la URL de función utiliza el tipo de autenticación `AWS_IAM`. De lo contrario, Lambda establece esto como `null`.  |   | 
|  `requestContext.authorizer.iam.accessKey`  |  La clave de acceso de la identidad del intermediario.  |  `"AKIAIOSFODNN7EXAMPLE"`  | 
|  `requestContext.authorizer.iam.accountId`  |  El ID de identidad de Cuenta de AWS del intermediario.  |  `"111122223333"`  | 
|  `requestContext.authorizer.iam.callerId`  |  El ID (ID de usuario) del intermediario.  |  `"AIDACKCEVSQ6C2EXAMPLE"`  | 
|  `requestContext.authorizer.iam.cognitoIdentity`  |  Las URL de funciones no utilizan este parámetro. Lambda establece esto como `null` o lo excluye de JSON.  |  `null`  | 
|  `requestContext.authorizer.iam.principalOrgId`  |  El ID de la entidad principal de la organización asociado a la identidad del intermediario.  |  `"AIDACKCEVSQORGEXAMPLE"`  | 
|  `requestContext.authorizer.iam.userArn`  |  El nombre de recurso de Amazon (ARN) del usuario de la identidad del intermediario.  |  `"arn:aws:iam::111122223333:user/example-user"`  | 
|  `requestContext.authorizer.iam.userId`  |  El ID de usuario de la identidad del intermediario.  |  `"AIDACOSFODNN7EXAMPLE2"`  | 
|  `requestContext.domainName`  |  El nombre de dominio de la URL de función.  |  `"<url-id>.lambda-url.us-west-2.on.aws"`  | 
|  `requestContext.domainPrefix`  |  El prefijo de dominio de la URL de función.  |  `"<url-id>"`  | 
|  `requestContext.http`  |  Un objeto que contiene detalles sobre la solicitud HTTP.  |   | 
|  `requestContext.http.method`  |  El método HTTP utilizado en esta solicitud. Los valores válidos son `GET`, `POST`, `PUT`, `HEAD`, `OPTIONS`, `PATCH` y `DELETE`.  |  `GET`  | 
|  `requestContext.http.path`  |  Ruta de acceso de la solicitud. Por ejemplo, si la URL de solicitud es `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`, el valor de la ruta es `/example/test/demo`.  |  `/example/test/demo`  | 
|  `requestContext.http.protocol`  |  El protocolo de la solicitud.  |  `HTTP/1.1`  | 
|  `requestContext.http.sourceIp`  |  La dirección IP de origen de la conexión TCP inmediata que realiza la solicitud.  |  `123.123.123.123`  | 
|  `requestContext.http.userAgent`  |  El valor del encabezado de solicitud usuario-agente.  |  `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0`  | 
|  `requestContext.requestId`  |  El ID de la solicitud de invocación. Puede utilizar este ID para realizar un seguimiento de los registros de invocación relacionados con la función.  |  `e1506fd5-9e7b-434f-bd42-4f8fa224b599`  | 
|  `requestContext.routeKey`  |  Las URL de funciones no utilizan este parámetro. Lambda establece `$default` como marcador de posición.  |  `$default`  | 
|  `requestContext.stage`  |  Las URL de funciones no utilizan este parámetro. Lambda establece `$default` como marcador de posición.  |  `$default`  | 
|  `requestContext.time`  |  La marca de tiempo de la solicitud.  |  `"07/Sep/2021:22:50:22 +0000"`  | 
|  `requestContext.timeEpoch`  |  La marca de tiempo de la solicitud, en fecha de inicio Unix.  |  `"1631055022677"`  | 
|  `body`  |  El cuerpo de la solicitud. Si el tipo de contenido de la solicitud es binario, el cuerpo está codificado en base64.  |  `{"key1": "value1", "key2": "value2"}`  | 
|  `pathParameters`  |  Las URL de funciones no utilizan este parámetro. Lambda establece esto como `null` o lo excluye de JSON.  |  `null`  | 
|  `isBase64Encoded`  |  `TRUE` si el cuerpo es una carga binaria y está codificado en base64. `FALSE` en caso contrario.  |  `FALSE`  | 
|  `stageVariables`  |  Las URL de funciones no utilizan este parámetro. Lambda establece esto como `null` o lo excluye de JSON.  |  `null`  | 

### Formato de carga de respuesta
<a name="urls-response-payload"></a>

Cuando la función devuelve una respuesta, Lambda analiza la respuesta y la convierte en una respuesta HTTP. Las cargas de respuesta de la función tienen el siguiente formato:

```
{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}
```

Lambda le infiere el formato de respuesta. Si la función devuelve JSON válido y no devuelve un `statusCode`, Lambda asume lo siguiente:
+ `statusCode` is `200`.
**nota**  
Los `statusCode` válidos están dentro del rango de 100 a 599.
+ `content-type` is `application/json`.
+ `body` es la respuesta de la función.
+ `isBase64Encoded` is `false`.

En los ejemplos siguientes se muestra cómo se asigna la salida de la función de Lambda a la carga de respuesta y cómo se asigna la carga de respuesta a la respuesta HTTP final. Cuando el cliente invoca la URL de función, ve la respuesta HTTP.

**Ejemplo de salida para una respuesta de cadena**


| Salida de función de Lambda | Salida de respuesta interpretada | Respuesta HTTP (lo que ve el cliente) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**Ejemplo de salida para una respuesta JSON**


| Salida de función de Lambda | Salida de respuesta interpretada | Respuesta HTTP (lo que ve el cliente) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**Ejemplo de salida para una respuesta personalizada**


| Salida de función de Lambda | Salida de respuesta interpretada | Respuesta HTTP (lo que ve el cliente) | 
| --- | --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

### Cookies
<a name="urls-cookies"></a>

Para devolver las cookies de su función, no agregue encabezados `set-cookie` manualmente. En su lugar, incluya las cookies en su objeto de carga de respuesta. Lambda interpreta esto automáticamente y las agrega como encabezados `set-cookie` de la respuesta HTTP, como en el siguiente ejemplo.


| Salida de función de Lambda | Respuesta HTTP (lo que ve el cliente) | 
| --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "cookies": [<br />        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",<br />        "Cookie_2=Value2; Max-Age=78000"<br />    ],<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br />set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT<br />set-cookie: Cookie_2=Value2; Max-Age=78000<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

# Supervisión de las URL de funciones de Lambda
<a name="urls-monitoring"></a>

Puede utilizar AWS CloudTrail y Amazon CloudWatch para supervisar las URL de funciones.

**Topics**
+ [

## Supervisión de las URL de funciones con CloudTrail
](#urls-cloudtrail)
+ [

## Métricas de CloudWatch para las URL de funciones
](#urls-cloudwatch)

## Supervisión de las URL de funciones con CloudTrail
<a name="urls-cloudtrail"></a>

Para las URL de funciones, Lambda admite automáticamente el registro de las siguientes operaciones de API como eventos en archivos de registros de CloudTrail:
+ [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)
+ [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)
+ [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html)
+ [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html)
+ [ListFunctionUrlConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionUrlConfigs.html)

Cada entrada de registro contiene información sobre la identidad del intermediario, cuándo se realizó la solicitud y otros detalles. Puede ver todos los eventos de los últimos 90 días consultando el **historial de eventos** de CloudTrail. Para retener registros pasados 90 días, puede crear una traza.

De forma predeterminada, CloudTrail no registra solicitudes `InvokeFunctionUrl`, que se consideran eventos de datos. Sin embargo, puede activar el registro de eventos de datos en CloudTrail. Para obtener más información, consulte [Registro de eventos de datos para registros de seguimiento](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) en la *Guía del usuario de AWS CloudTrail*.

## Métricas de CloudWatch para las URL de funciones
<a name="urls-cloudwatch"></a>

Lambda envía métricas agregadas sobre las solicitudes de URL de funciones a CloudWatch. Con estas métricas, puede supervisar las URL de funciones, crear paneles y configurar alarmas en la consola de CloudWatch.

Las URL de funciones son compatibles con las siguientes métricas de invocación. Recomendamos ver estas métricas con la estadística `Sum`
+ `UrlRequestCount`: el número de solicitudes realizadas a esta URL de función.
+ `Url4xxCount`: el número de solicitudes que devolvió un código de estado HTTP 4XX. Los códigos de la serie 4XX indican errores del lado del cliente, como solicitudes erróneas.
+ `Url5xxCount`: el número de solicitudes que devolvió un código de estado HTTP 5XX. Los códigos de la serie 5XX indican errores del lado del servidor, como errores de función y tiempos de espera.

Las URL de funciones también son compatibles con la siguiente métrica de rendimiento. Recomendamos ver esta métrica con las estadísticas `Average` o `Max`.
+ `UrlRequestLatency`: el tiempo transcurrido entre el que la URL de función recibe una solicitud y el momento en que la URL de función devuelve una respuesta.

Cada una de estas métricas de invocación y rendimiento es compatible con las siguientes dimensiones:
+ `FunctionName`: visualiza métricas agregadas para las URL de las funciones asignadas a la versión `$LATEST` no publicada o a cualquiera de los alias de la función. Por ejemplo, `hello-world-function`.
+ `Resource`: visualiza métricas para una URL de función específica. Esto se define mediante el nombre de una función, junto con la versión `$LATEST` no publicada o uno de los alias de la función. Por ejemplo, `hello-world-function:$LATEST`.
+ `ExecutedVersion`: visualiza métricas para una URL de función específica en función de la versión ejecutada. Puede utilizar esta dimensión principalmente para realizar un seguimiento de la URL de función asignada a la versión `$LATEST` no publicada.

# Selección de un método para invocar una función de Lambda mediante una solicitud HTTP
<a name="furls-http-invoke-decision"></a>

En muchos casos de uso habituales de Lambda, se debe invocar una función mediante una solicitud HTTP. Por ejemplo, tal vez desee que una aplicación web invoque su función mediante una solicitud del navegador. Las funciones de Lambda también se pueden utilizar para crear API de REST completas, gestionar las interacciones de los usuarios de las aplicaciones móviles, procesar datos de servicios externos mediante llamadas HTTP o crear webhooks personalizados.

En las siguientes secciones, se explican cuáles son sus opciones para invocar a Lambda a través de HTTP y se proporciona información que ayudará a que tome la decisión correcta para su caso de uso concreto.

## ¿Cuáles son sus opciones a la hora de seleccionar un método para invocar una HTTP?
<a name="w2aac39c81c73b9"></a>

Lambda ofrece dos métodos principales para invocar una función mediante una solicitud HTTP: las [URL de función](urls-configuration.md) y [API Gateway](services-apigateway.md). Las diferencias clave entre estas dos opciones son las siguientes:
+ **Las URL de función de Lambda** proporcionan un punto de conexión HTTP simple y directo para una función de Lambda. Están optimizadas para ofrecer simplicidad y rentabilidad y ofrecen la ruta más rápida para exponer una función de Lambda a través de HTTP.
+ **API Gateway** es un servicio más avanzado para crear una API con todas las características. API Gateway está optimizado para crear y administrar una API de producción a escala y ofrece herramientas integrales para la seguridad, el monitoreo y la administración del tráfico.

## Recomendaciones si ya conoce sus requisitos
<a name="w2aac39c81c73c11"></a>

Si ya tiene claros sus requisitos, estas son nuestras recomendaciones básicas:

Recomendamos las **[URL de función](urls-configuration.md)** para aplicaciones sencillas o para la creación de prototipos cuando solo necesite métodos básicos de autenticación y gestión de solicitudes y respuestas y siempre que desee reducir al mínimo los costos y la complejidad.

**[API Gateway](services-apigateway.md)** es una mejor opción para aplicaciones de producción a gran escala o para los casos en los que se necesitan características más avanzadas, como la compatibilidad con la [descripción de OpenAPI](https://www.openapis.org/), una variedad de opciones de autenticación, nombres de dominio personalizados o una gestión rica de solicitudes y respuestas, que incluye la limitación, el almacenamiento en caché y la transformación de solicitudes y respuestas.

## Aspectos que deben tenerse en cuenta al seleccionar un método para invocar una función de Lambda
<a name="w2aac39c81c73c13"></a>

Al seleccionar entre las URL de función y API Gateway, deben tener en cuenta los siguientes factores:
+ Sus necesidades de autenticación, por ejemplo, si necesita OAuth o Amazon Cognito para autenticar a los usuarios
+ Sus requisitos de escalado y la complejidad de la API que desea implementar
+ Si necesita características avanzadas, como la validación de solicitudes y el formato de las solicitudes o respuestas
+ Sus requisitos de monitoreo
+ Sus objetivos de costos

Al comprender estos factores, puede seleccionar la opción que mejor equilibre sus requisitos de seguridad, complejidad y costo.

En la siguiente información, se comparan las principales diferencias entre las dos opciones.

### Autenticación
<a name="w2aac39c81c73c13c11b1"></a>
+ **Las URL de función** proporcionan opciones de autenticación básicas mediante AWS Identity and Access Management (IAM). Puede configurar sus puntos de conexión para que sean públicos (sin autenticación) o para que requieran la autenticación de IAM. Con la autenticación de IAM, puede utilizar credenciales de AWS estándar o roles de IAM para controlar el acceso. Si bien es fácil de configurar, este enfoque ofrece opciones limitadas en comparación con otros métodos de autenticación.
+ **API Gateway** proporciona acceso a una gama más completa de opciones de autenticación. Además de la autenticación de IAM, puede utilizar [autorizadores de Lambda](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (lógica de autenticación personalizada), grupos de usuarios de [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) y flujos de OAuth2.0. Esta flexibilidad permite implementar esquemas de autenticación complejos, que incluyen proveedores de autenticación de terceros, autenticación basada en tokens y autenticación multifactorial.

### Gestión de solicitudes y respuestas
<a name="w2aac39c81c73c13c11b3"></a>
+ **Las URL de función** proporcionan una gestión básica de solicitudes y respuestas HTTP. Son compatibles con los métodos HTTP estándar e incluyen soporte integrado de uso compartido de recursos entre orígenes (CORS). Si bien pueden gestionar las cargas útiles de JSON y los parámetros de consulta de forma natural, no ofrecen capacidades de transformación o validación de solicitudes. La gestión de las respuestas es igual de sencillo: el cliente recibe la respuesta de la función de Lambda exactamente como Lambda la devuelve.
+ **API Gateway** ofrece capacidades sofisticadas de gestión de solicitudes y respuestas. Puede definir validadores de solicitudes, transformar las solicitudes y las respuestas mediante la asignación de plantillas, la configuración de encabezados de solicitudes y respuestas y la implementación el almacenamiento en caché de las respuestas. API Gateway también es compatible con las cargas útiles binarias y los nombres de dominio personalizados y puede modificar las respuestas antes de que lleguen al cliente. Puede configurar modelos para la validación y transformación de solicitudes y respuestas mediante el esquema JSON.

### Escalado
<a name="w2aac39c81c73c13c11b5"></a>
+ **Las URL de función** se escalan directamente con los límites de simultaneidad de la función de Lambda y gestionan los picos de tráfico al escalar la función hasta el límite máximo de simultaneidad configurado. Una vez alcanzado ese límite, Lambda responde a las solicitudes adicionales con respuestas HTTP 429. No hay un mecanismo de colas integrado, por lo que la gestión del escalado depende totalmente de la configuración de la función de Lambda. De forma predeterminada, las funciones de Lambda tienen un límite de 1000 ejecuciones simultáneas por Región de AWS.
+ **API Gateway** proporciona capacidades de escalado adicionales además del escalado propio de Lambda. Incluye controles integrados de limitación y cola de solicitudes, lo que permite administrar los picos de tráfico con mayor facilidad. De forma predeterminada, API Gateway puede gestionar hasta 10 000 solicitudes por segundo por región, con una capacidad de ampliación de 5000 solicitudes por segundo. También proporciona herramientas para limitar las solicitudes en diferentes niveles (API, fase o método) a fin de proteger el backend.

### Supervisión
<a name="w2aac39c81c73c13c11b7"></a>
+ **Las URL de función** ofrecen un monitoreo básico a través de las métricas de Amazon CloudWatch, que incluyen el recuento de solicitudes, la latencia y las tasas de error. Obtiene acceso a métricas y registros estándar de Lambda, que muestran las solicitudes sin procesar que llegan a su función. Si bien esto proporciona una visibilidad operativa esencial, las métricas se centran principalmente en la ejecución de las funciones.
+ **API Gateway** proporciona capacidades de monitoreo integrales que incluyen métricas detalladas, registro y opciones de rastreo. Puede supervisar las llamadas a la API, la latencia, las tasas de error y las tasas de aciertos y errores de la caché a través de CloudWatch. API Gateway también se integra con AWS X-Ray para el rastreo distribuido y proporciona formatos de registro personalizables.

### Coste
<a name="w2aac39c81c73c13c11b9"></a>
+ **Las URL de función** siguen el modelo de precios estándar de Lambda: solo paga por las invocaciones de funciones y el tiempo de cálculo. No hay recargos adicionales para el punto de conexión URL en sí. Esto lo convierte en una opción rentable para API simples o aplicaciones de bajo tráfico si no necesita las características adicionales de la API Gateway.
+ **API Gateway** ofrece un [nivel gratuito](https://aws.amazon.com/api-gateway/pricing/#Free_Tier) que incluye un millón de llamadas a la API recibidas para las API de REST y un millón de llamadas a la API recibidas para las API de HTTP. Después de esto, API Gateway cobra por las llamadas a la API, la transferencia de datos y el almacenamiento en caché (si están habilitados). Consulte la [página de precios](https://aws.amazon.com/api-gateway/pricing/) de API Gateway para conocer los costos de su propio caso práctico.

### Otras características
<a name="w2aac39c81c73c13c11c11"></a>
+ **Las URL de función** están diseñadas para ofrecer simplicidad e integración directa con Lambda. Son compatibles con los puntos de conexión HTTP y HTTPS, ofrecen soporte CORS integrado y proporcionan puntos de conexión de doble pila (IPv4 e IPv6). Si bien carecen de características avanzadas, destacan en situaciones en las que se necesita una forma rápida y sencilla de exponer las funciones de Lambda a través de HTTP.
+ **API Gateway** incluye numerosas características adicionales, como el control de versiones de las API, la administración de etapas, las claves de API para los planes de uso, la documentación de las API a través de Swagger/OpenAPI, las API de WebSocket, las API privadas dentro de una VPC y la integración de WAF para mayor seguridad. También es compatible con las implementaciones canarias, las integraciones simuladas para pruebas y la integración con otros Servicios de AWS más allá de Lambda.

## Selección de un método para invocar una función de Lambda
<a name="w2aac39c81c73c15"></a>

Ahora que ha leído los criterios para seleccionar entre las URL de función de Lambda y API Gateway y las principales diferencias entre ellas, puede seleccionar la opción que mejor se adapte a sus necesidades y utilizar los siguientes recursos para empezar a utilizarla.

------
#### [ Function URLs ]

**Comience a utilizar las URL de función con los siguientes recursos**
+ Siga el tutorial [Crear de una función de Lambda con una URL de función](urls-webhook-tutorial.md)
+ Obtenga más información sobre las URL de función en el capítulo [Creación y administración de URL de funciones de Lambda](urls-configuration.md) de esta guía
+ Pruebe el tutorial guiado integrado en la consola: **Crear una aplicación web sencilla** de la siguiente manera:

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Abra el panel de ayuda al elegir el icono de la esquina superior derecha de la pantalla.  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/console_help_screenshot.png)

1. Seleccione **Tutoriales**.

1. En **Crear una aplicación web sencilla**, seleccione **Iniciar el tutorial**.

------
#### [ API Gateway ]

**Comience a utilizar Lambda y API Gateway con los siguientes recursos**
+ Siga el tutorial [Uso de Lambda con API Gateway](services-apigateway-tutorial.md) para crear una API de REST integrada con una función de Lambda de backend.
+ Obtenga más información sobre los distintos tipos de API que ofrece API Gateway en las siguientes secciones de la *guía para desarrolladores de Amazon API Gateway*:
  + [API de REST de API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API de HTTP de API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API de WebSocket de API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ Pruebe uno o varios de los ejemplos de la sección de [tutoriales y talleres](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) de la *Guía para desarrolladores de Amazon API Gateway*.

------

# Tutorial: Creación de un punto de conexión de webhook mediante la URL de una función de Lambda
<a name="urls-webhook-tutorial"></a>

En este tutorial, creará la URL de una función de Lambda para implementar un punto de conexión de webhook. Un webhook es una comunicación ligera y basada en eventos que envía automáticamente datos entre aplicaciones mediante HTTP. Puede usar un webhook para recibir actualizaciones inmediatas sobre los eventos que ocurren en otro sistema, como cuando un nuevo cliente se registra en un sitio web, se procesa un pago o se carga un archivo.

Con Lambda, los webhooks se pueden implementar mediante URL de funciones de Lambda o API Gateway. Las URL de funciones son una buena opción para los webhooks sencillos que no requieren características como la autorización avanzada o la validación de solicitudes.

**sugerencia**  
Si no está seguro de cuál es el mejor método para su caso específico, consulte [Selección de un método para invocar una función de Lambda mediante una solicitud HTTP](furls-http-invoke-decision.md).

## Requisitos previos
<a name="urls-webhook-tutorial-prereqs"></a>

Para completar este tutorial, debe tener Python (versión 3.8 o posterior) o Node.js (versión 18 o posterior) instalados en su máquina local.

Para probar el punto de conexión mediante una solicitud HTTP, el tutorial utiliza [curl](https://curl.se/), una herramienta de línea de comandos que puede utilizar para transferir datos mediante varios protocolos de red. Consulte la [Documentación de curl](https://curl.se/docs/install.html) para obtener información sobre cómo instalar la herramienta si aún no la tiene.

## Crear la función de Lambda
<a name="urls-webhook-tutorial-function"></a>

Primero cree la función de Lambda que se ejecuta cuando se envía una solicitud HTTP a su punto de conexión de webhook. En este ejemplo, la aplicación remitente envía una actualización cada vez que se envía un pago e indica en el cuerpo de la solicitud HTTP si el pago se ha realizado correctamente. La función de Lambda analiza la solicitud y actúa de acuerdo con el estado del pago. En este ejemplo, el código solo imprime el ID del pedido para el pago, pero en una aplicación real, puede añadir el pedido a una base de datos o enviar una notificación.

La función también implementa el método de autenticación más común utilizado para los webhooks, la autenticación de mensajes basada en hash (HMAC). Con este método, tanto las aplicaciones de envío como las de recepción comparten una clave secreta. La aplicación de envío utiliza un algoritmo de hash para generar una firma única utilizando esta clave junto con el contenido del mensaje, e incluye la firma en la solicitud de webhook como un encabezado HTTP. Luego, la aplicación receptora repite este paso, genera la firma con la clave secreta y compara el valor resultante con la firma enviada en el encabezado de la solicitud. Si el resultado coincide, la solicitud se considera legítima. 

Cree la función mediante la consola de Lambda con el tiempo de ejecución de Python o Node.js.

------
#### [ Python ]

**Crear la función de Lambda**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Cree una función básica “Hello world” de la siguiente manera:

   1. Elija **Crear función**.

   1. Seleccione **Crear desde cero**.

   1. En **Nombre de la función**, introduzca **myLambdaWebhook**.

   1. En **Tiempo de ejecución**, seleccione **python 3.14**.

   1. Seleccione **Creación de función**.

1. En el panel **Código fuente**, sustituya el código existente al copiar y pegar lo siguiente:

   ```
   import json
   import hmac
   import hashlib
   import os
   
   def lambda_handler(event, context):
       
       # Get the webhook secret from environment variables
       webhook_secret = os.environ['WEBHOOK_SECRET']
       
       # Verify the webhook signature
       if not verify_signature(event, webhook_secret):
           return {
               'statusCode': 401,
               'body': json.dumps({'error': 'Invalid signature'})
           }
       
       try:
           # Parse the webhook payload
           payload = json.loads(event['body'])
           
           # Handle different event types
           event_type = payload.get('type')
           
           if event_type == 'payment.success':
               # Handle successful payment
               order_id = payload.get('orderId')
               print(f"Processing successful payment for order {order_id}")
               
               # Add your business logic here
               # For example, update database, send notifications, etc.
               
           elif event_type == 'payment.failed':
               # Handle failed payment
               order_id = payload.get('orderId')
               print(f"Processing failed payment for order {order_id}")
               
               # Add your business logic here
               
           else:
               print(f"Received unhandled event type: {event_type}")
           
           # Return success response
           return {
               'statusCode': 200,
               'body': json.dumps({'received': True})
           }
           
       except json.JSONDecodeError:
           return {
               'statusCode': 400,
               'body': json.dumps({'error': 'Invalid JSON payload'})
           }
       except Exception as e:
           print(f"Error processing webhook: {e}")
           return {
               'statusCode': 500,
               'body': json.dumps({'error': 'Internal server error'})
           }
   
   def verify_signature(event, webhook_secret):
       """
       Verify the webhook signature using HMAC
       """
       try:
           # Get the signature from headers
           signature = event['headers'].get('x-webhook-signature')
   
           if not signature:
               print("Error: Missing webhook signature in headers")
               return False
           
           # Get the raw body (return an empty string if the body key doesn't exist)
           body = event.get('body', '')
           
           # Create HMAC using the secret key
           expected_signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
           
           # Compare the expected signature with the received signature to authenticate the message
           is_valid = hmac.compare_digest(signature, expected_signature)
           if not is_valid:
               print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}")
               return False
               
           return True
       except Exception as e:
           print(f"Error verifying signature: {e}")
           return False
   ```

1. En la sección **IMPLEMENTAR**, elija **Implementar** para actualizar el código de la función.

------
#### [ Node.js ]

**Crear la función de Lambda**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Cree una función básica “Hello world” de la siguiente manera:

   1. Seleccione **Creación de función**.

   1. Seleccione **Crear desde cero**.

   1. En **Nombre de la función**, introduzca **myLambdaWebhook**.

   1. En **Tiempo de ejecución**, seleccione **nodejs24.x**.

   1. Seleccione **Creación de función**.

1. En el panel **Código fuente**, sustituya el código existente al copiar y pegar lo siguiente:

   ```
   import crypto from 'crypto';
   
   export const handler = async (event, context) => {
       // Get the webhook secret from environment variables
       const webhookSecret = process.env.WEBHOOK_SECRET;
   
       // Verify the webhook signature
       if (!verifySignature(event, webhookSecret)) {
           return {
               statusCode: 401,
               body: JSON.stringify({ error: 'Invalid signature' })
           };
       }
   
       try {
           // Parse the webhook payload
           const payload = JSON.parse(event.body);
   
           // Handle different event types
           const eventType = payload.type;
   
           switch (eventType) {
               case 'payment.success': {
                   // Handle successful payment
                   const orderId = payload.orderId;
                   console.log(`Processing successful payment for order ${orderId}`);
   
                   // Add your business logic here
                   // For example, update database, send notifications, etc.
                   break;
               }
   
               case 'payment.failed': {
                   // Handle failed payment
                   const orderId = payload.orderId;
                   console.log(`Processing failed payment for order ${orderId}`);
   
                   // Add your business logic here
                   break;
               }
   
               default:
                   console.log(`Received unhandled event type: ${eventType}`);
           }
   
           // Return success response
           return {
               statusCode: 200,
               body: JSON.stringify({ received: true })
           };
   
       } catch (error) {
           if (error instanceof SyntaxError) {
               // Handle JSON parsing errors
               return {
                   statusCode: 400,
                   body: JSON.stringify({ error: 'Invalid JSON payload' })
               };
           }
   
           // Handle all other errors
           console.error('Error processing webhook:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({ error: 'Internal server error' })
           };
       }
   };
   
   // Verify the webhook signature using HMAC
   
   const verifySignature = (event, webhookSecret) => {
       try {
           // Get the signature from headers
           const signature = event.headers['x-webhook-signature'];
     
           if (!signature) {
               console.log('No signature found in headers:', event.headers);
               return false;
           }
     
           // Get the raw body (return an empty string if the body key doesn't exist)
           const body = event.body || '';
     
           // Create HMAC using the secret key
           const hmac = crypto.createHmac('sha256', webhookSecret);
           const expectedSignature = hmac.update(body).digest('hex');
     
           // Compare expected and received signatures
           const isValid = signature === expectedSignature;
           if (!isValid) {
               console.log(`Invalid signature. Received: ${signature}, Expected: ${expectedSignature}`);
               return false;
           }
           
           return true;
       } catch (error) {
           console.error('Error during signature verification:', error);
           return false;
       }
     };
   ```

1. En la sección **IMPLEMENTAR**, elija **Implementar** para actualizar el código de la función.

------

## Crear la clave secreta
<a name="urls-webhook-tutorial-key"></a>

Para que la función de Lambda autentique la solicitud de webhook, utiliza una clave secreta que comparte con la aplicación que realiza la llamada. En este ejemplo, la clave se almacena en una variable del entorno. En aplicaciones de producción, no incluya información confidencial como contraseñas en el código de la función. En su lugar, [cree un secreto de AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) y, a continuación, [utilice la extensión de Lambda AWS Parameters and Secrets](with-secrets-manager.md) para recuperar las credenciales en su función de Lambda.

**Crear y almacenar la clave secreta del webhook**

1. Genere una cadena larga y aleatoria utilizando un generador de números aleatorios criptográficamente seguro. Puede usar los siguientes fragmentos de código en Python o Node.js para generar e imprimir un secreto de 32 caracteres, o usar el método que prefiera.

------
#### [ Python ]

**Example código para generar un secreto**  

   ```
   import secrets
   webhook_secret = secrets.token_urlsafe(32)
   print(webhook_secret)
   ```

------
#### [ Node.js ]

**Example código para generar un secreto (formato de módulo ES)**  

   ```
   import crypto from 'crypto';
   let webhookSecret = crypto.randomBytes(32).toString('base64');
   console.log(webhookSecret)
   ```

------

1. Guarde la cadena generada como una variable de entorno para su función de la siguiente manera:

   1. En la sección **Configuración** de su función, seleccione **Variables de entorno**.

   1. Seleccione **Editar**.

   1. Elija **Add environment variable** (Añadir variable de entorno).

   1. En **Clave**, ingrese **WEBHOOK\$1SECRET**, y en **Valor**, ingrese el secreto que generó en el paso anterior.

   1. Seleccione **Save**.

Tome nota de este secreto ahora, ya que tendrá que usarlo más adelante en el tutorial para probar la función.

## Crear el punto de conexión de la URL de función
<a name="urls-webhook-tutorial-furl"></a>

Cree un punto de conexión de webhook mediante la URL de una función de Lambda. Dado que utiliza el tipo de autenticación `NONE` para crear un punto de conexión con acceso público, cualquier persona que disponga de la URL puede invocar su función. Para obtener más información sobre cómo controlar el acceso a las URL de las funciones, consulte [Control de acceso a las URL de las funciones de Lambda](urls-auth.md). Si necesita opciones de autenticación más avanzadas para su webhook, considere usar API Gateway.

**Crear el punto de conexión de la URL de función**

1. En la pestaña **Configuración** de su función, seleccione **URL de función**.

1. Elija **Create function URL** (Crear URL de función).

1. Para el **Tipo de autenticación**, seleccione **NINGUNO**.

1. Seleccione **Save**.

El punto de conexión de la URL de función que acaba de crear aparece en el panel **URL de función**. Copie el punto de conexión para usarlo más adelante en el tutorial.

## Probar la función en la consola
<a name="urls-webhook-tutorial-test-console"></a>

Antes de utilizar una solicitud HTTP para invocar la función mediante el punto de conexión de la URL, pruébela en la consola para confirmar que el código funciona según lo previsto.

Para verificar la función en la consola, primero debe calcular la firma de un webhook utilizando el secreto que generó anteriormente en el tutorial con la siguiente carga útil de JSON de prueba:

```
{
    "type": "payment.success", 
    "orderId": "1234",
    "amount": "99.99"
}
```

Use uno de los siguientes ejemplos de código de Python o Node.js para calcular la firma del webhook con su propio secreto.

------
#### [ Python ]

**Calcular la firma del webhook**

1. Guarde el siguiente código en un archivo denominado `calculate_signature.py`. Reemplace el secreto del webhook en el código por su propio valor.

   ```
   import secrets
   import hmac
   import json
   import hashlib
   
   webhook_secret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   
   body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"})
   
   signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
   
   print(signature)
   ```

1. Calcule la firma mediante la ejecución del siguiente comando desde el directorio donde haya guardado el código. Copie la firma que genera el código.

   ```
   python calculate_signature.py
   ```

------
#### [ Node.js ]

**Calcular la firma del webhook**

1. Guarde el siguiente código en un archivo denominado `calculate_signature.mjs`. Reemplace el secreto del webhook en el código por su propio valor.

   ```
   import crypto from 'crypto';
   
   const webhookSecret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   const body = "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}";
   
   let hmac = crypto.createHmac('sha256', webhookSecret);
   let signature = hmac.update(body).digest('hex');
   
   console.log(signature);
   ```

1. Calcule la firma mediante la ejecución del siguiente comando desde el directorio donde haya guardado el código. Copie la firma que genera el código.

   ```
   node calculate_signature.mjs
   ```

------

Ahora puede probar el código de función mediante una solicitud HTTP de prueba en la consola.

**Probar la función en la consola**

1. Seleccione la pestaña **Código** para su función.

1. En la sección **EVENTOS DE PRUEBA**, elija **Crear nuevo evento de prueba**.

1. Para **Event name (Nombre de evento)**, escriba **myEvent**.

1. En el panel **Evento JSON**, sustituya el código JSON existente al copiar y pegar lo siguiente. Reemplace la firma del webhook por el valor que calculó en el paso anterior.

   ```
   {
     "headers": {
       "Content-Type": "application/json",
       "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a"
     },
     "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}"
   }
   ```

1. Seleccione **Save**.

1. Elija **Invoke (Invocar)**.

   Debería ver una salida similar a esta:

------
#### [ Python ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\": true}"
   }
   
   Function Logs:
   START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST
   Processing successful payment for order 1234
   END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6
   REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6	Duration: 1.55 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 36 MB	Init Duration: 136.32 ms
   ```

------
#### [ Node.js ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\":true}"
   }
   
   Function Logs:
   START RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 Version: $LATEST
   2025-01-10T18:05:42.062Z	e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	INFO	Processing successful payment for order 1234
   END RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   REPORT RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	Duration: 60.10 ms	Billed Duration: 61 ms	Memory Size: 128 MB	Max Memory Used: 72 MB	Init Duration: 174.46 ms
   
   Request ID: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   ```

------

## Probar la función mediante una solicitud HTTP
<a name="urls-webhook-tutorial-test-curl"></a>

Use la herramienta de línea de comandos curl para probar su punto de conexión de webhook.

**Probar la función mediante solicitudes HTTP**

1. En un programa de terminal o intérprete de comandos, ejecute el siguiente comando curl. Sustituya la URL por el valor del punto de conexión de la URL de función y sustituya la firma del webhook por la firma que calculó con su propia clave secreta.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   Debería ver los siguientes datos de salida:

   ```
   {"received": true}
   ```

1. Inspeccione los registros de CloudWatch de su función para confirmar que analizó la carga útil correctamente de la siguiente manera:

   1. En la consola de Amazon CloudWatch, abra la página [Grupos de registro](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups).

   1. Seleccione el grupo de registro de la función (`/aws/lambda/myLambdaWebhook`).

   1. Seleccione el flujo de registros más reciente.

      Debería ver una salida similar a la siguiente en los registros de su función:

------
#### [ Python ]

      ```
      Processing successful payment for order 1234
      ```

------
#### [ Node.js ]

      ```
      2025-01-10T18:05:42.062Z e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 INFO Processing successful payment for order 1234
      ```

------

1. Ejecute el siguiente comando curl para confirmar que el código detecta una firma no válida. Sustituya la URL por el punto de conexión de su propia URL de función.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: abcdefg" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   Debería ver los siguientes datos de salida:

   ```
   {"error": "Invalid signature"}
   ```

## Eliminación de sus recursos
<a name="urls-webhook-tutorial-cleanup"></a>

A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su Cuenta de AWS.

**Cómo eliminar la función de Lambda**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función que ha creado.

1. Elija **Acciones**, **Eliminar**.

1. Escriba **confirm** en el campo de entrada de texto y elija **Delete**(Eliminar).

Cuando creó una función de Lambda en la consola, Lambda también creó un [rol de ejecución](lambda-intro-execution-role.md) para la función.

**Cómo eliminar el rol de ejecución**

1. Abra la página [Roles](https://console.aws.amazon.com/iam/home#/roles) en la consola de IAM.

1. Seleccione el rol de ejecución que creó Lambda. El rol tiene el formato de nombre `myLambdaWebhook-role-<random string>`.

1. Elija **Eliminar**.

1. Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija **Delete** (Eliminar).