

# Uso de Lambda con Amazon SQS
<a name="with-sqs"></a>

**nota**  
Si desea enviar datos a un destino que no sea una función de Lambda o enriquecer los datos antes de enviarlos, consulte [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html) (Canalizaciones de Amazon EventBridge).

Puede utilizar una función de Lambda para procesar mensajes en una cola de Amazon Simple Queue Service (Amazon SQS). Las [asignaciones de orígenes de eventos](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html) de Lambda son compatibles con [las colas estándar](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) y [las colas de primero en entrar, primero en salir (FIFO)](invocation-eventsourcemapping.md). También puede usar el modo aprovisionado para asignar recursos de sondeo dedicados a las asignaciones de orígenes de eventos de Amazon SQS. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS, aunque pueden estar en [diferentes Cuentas de AWS](with-sqs-cross-account-example.md).

Cuando se procesan mensajes de Amazon SQS, se debe implementar una lógica de respuesta por lotes parcial para evitar que se intente reprocesar los mensajes ya procesados correctamente cuando algunos mensajes de un lote fallan. La [utilidad de procesador por lotes](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) de Powertools para AWS Lambda simplifica esta implementación al gestionar de manera automática la lógica de respuesta parcial por lotes, lo que reduce el tiempo de desarrollo y mejora la fiabilidad.

**Topics**
+ [Descripción del comportamiento de sondeo y procesamiento por lotes para las asignaciones de orígenes de eventos de Amazon SQS](#sqs-polling-behavior)
+ [Uso del modo aprovisionado con las asignaciones de orígenes de eventos de Amazon SQS](#sqs-provisioned-mode)
+ [Configuración del modo aprovisionado para las asignación de orígenes de eventos de Amazon SQS](#sqs-configuring-provisioned-mode)
+ [Ejemplo de evento de mensaje en cola estándar](#example-standard-queue-message-event)
+ [Ejemplo de evento de mensajes de cola FIFO](#sample-fifo-queues-message-event)
+ [Creación y configuración de una asignación de orígenes de eventos de Amazon SQS](services-sqs-configure.md)
+ [Configuración del comportamiento de escalado para las asignaciones de orígenes de eventos de SQS](services-sqs-scaling.md)
+ [Gestión de errores para un origen de eventos de SQS en Lambda](services-sqs-errorhandling.md)
+ [Parámetros de Lambda para las asignaciones de origen de eventos de Amazon SQS](services-sqs-parameters.md)
+ [Uso del filtrado de eventos con una fuente de eventos de Amazon SQS](with-sqs-filtering.md)
+ [Tutorial: Uso de Lambda con Amazon SQS](with-sqs-example.md)
+ [Tutorial: Uso de una cola entre cuentas de Amazon SQS como un origen de eventos](with-sqs-cross-account-example.md)

## Descripción del comportamiento de sondeo y procesamiento por lotes para las asignaciones de orígenes de eventos de Amazon SQS
<a name="sqs-polling-behavior"></a>

Con las asignaciones de orígener de eventos de Amazon SQS, Lambda sondea la cola e invoca su función [sincrónicamente](invocation-sync.md) con un evento. Cada evento puede contener un lote de varios mensajes de la cola. Lambda recibe estos eventos lote por lote e invoca su función una vez por lote. Cuando la función procesa correctamente un lote, Lambda elimina sus mensajes de la cola.

Cuando Lambda lee un lote, los mensajes se mantienen en la cola, pero se ocultan durante el [tiempo de espera de visibilidad](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) de la cola. Cuando la función procesa correctamente todos los mensajes en el lote, Lambda elimina sus mensajes de la cola. De forma predeterminada, si la función detecta un error al procesar un lote, todos los mensajes de ese lote se vuelven a ver en la cola después de que expire el tiempo de visibilidad. Por este motivo, el código de su función debe ser capaz de procesar el mismo mensaje varias veces sin efectos secundarios no deseados.

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

Para evitar que Lambda procese un mensaje varias veces, puede configurar la asignación de orígenes de eventos para incluir los [errores de los elementos del lote](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) en la respuesta de la función, o puede utilizar la acción [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html) de la API para eliminar los mensajes de la cola a medida que la función de Lambda los procese correctamente.

Para obtener más información sobre los parámetros de configuración que Lambda admite para asignaciones de orígenes de eventos de SQS, consulte [Creación de una asignación de orígenes de eventos](services-sqs-configure.md#events-sqs-eventsource).

## Uso del modo aprovisionado con las asignaciones de orígenes de eventos de Amazon SQS
<a name="sqs-provisioned-mode"></a>

Para las cargas de trabajo en las que necesite afinar el rendimiento de su asignación de orígenes de eventos, puede utilizar el modo aprovisionado. En el modo aprovisionado, usted define los límites mínimos y máximos para la cantidad de sondeos de eventos aprovisionados. Estos sondeos de eventos aprovisionados están dedicados a la asignación de orígenes de eventos y pueden gestionar los picos de mensajes inesperados mediante un ajuste de escalado automático adaptable. La asignación de orígenes de eventos de Amazon SQS configurada con el modo aprovisionado se escala 3 veces más rápido (hasta 1000 invocaciones simultáneas por minuto) y admite una concurrencia 16 veces mayor (hasta 20 000 invocaciones simultáneas) que la capacidad de asignación de orígenes de eventos predeterminada de Amazon SQS. Le recomendamos que utilice el modo aprovisionado para las cargas de trabajo impulsadas por eventos de Amazon SQS que tengan requisitos de rendimiento estrictos, 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. El uso del modo aprovisionado conlleva costos adicionales. Para obtener más información sobre precios, consulte [Precios de AWS Lambda](https://aws.amazon.com/lambda/pricing/).

Cada sondeador de eventos en modo aprovisionado puede gestionar hasta 1 MB/s de rendimiento, hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de Amazon SQS por segundo. El rango de valores aceptados para el número mínimo de sondeadores de eventos (MinimumPollers) oscila entre 2 y 200, con el valor predeterminado de 2. El rango de valores aceptados para el número máximo de sondeadores de eventos (MaximumPollers) oscila entre 2 y 2000, con el valor predeterminado de 200. MaximumPollers debe ser mayor o igual que MinimumPollers.

### Determinación de los sondeadores de eventos necesarios
<a name="sqs-determining-event-pollers"></a>

Para estimar el número de sondeadores de eventos necesarios para garantizar un rendimiento óptimo del procesamiento de mensajes cuando se utiliza el modo aprovisionado para la ESM de SQS, recopile las siguientes métricas para su aplicación: picos de eventos de SQS por segundo que requieren un procesamiento de baja latencia, tamaño medio de la carga útil de los eventos de SQS, duración promedio de la función de Lambda y tamaño de lote configurado.

En primer lugar, puede estimar el número de eventos de SQS por segundo (EPS) que admite un sondeador de eventos para la carga de trabajo mediante la siguiente fórmula:

```
EPS per event poller = 
        minimum(
            ceiling(1024 / average event size in KB),
            ceiling(10 / average function duration in seconds) * batch size, 
            min(100, 10 * batch size)
                )
```

A continuación, puede calcular el número mínimo de sondeadores necesarios con la siguiente fórmula. Este cálculo garantiza un aprovisionamiento de capacidad suficiente para satisfacer sus necesidades de tráfico máximo.

```
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
```

Considere una carga de trabajo con un tamaño de lote predeterminado de 10, un tamaño promedio de eventos de 3 KB, una duración promedio de la función de 100 ms y el requisito de gestionar 1000 eventos por segundo. En este escenario, cada sondeador de eventos admitirá aproximadamente 100 eventos por segundo (EPS). Por lo tanto, debe establecer un mínimo de 10 sondeadores para gestionar adecuadamente los requisitos de tráfico máximo. Si su carga de trabajo tiene las mismas características, pero una duración promedio de la función de 1 segundo, cada sondeador solo admitirá 10 EPS, por lo que deberá configurar 100 sondeadores como mínimo para que admitan 1000 eventos por segundo con una latencia baja.

Recomendamos utilizar un tamaño de lote predeterminado de 10 o más para maximizar la eficiencia de los sondeadores de eventos en modo aprovisionado. Los tamaños de lote más altos permiten que cada sondeador procese más eventos por invocación, lo que mejora el rendimiento y la rentabilidad. Cuando planifique la capacidad del sondeador de eventos, tenga en cuenta los posibles picos de tráfico y considere la posibilidad de establecer el valor de minimumPollers ligeramente por encima del mínimo calculado para proporcionar un búfer. Además, supervise las características de su carga de trabajo a lo largo del tiempo, ya que los cambios en el tamaño de los mensajes, la duración de las funciones o los patrones de tráfico pueden requerir ajustes en la configuración del sondeador de eventos para mantener un rendimiento y una rentabilidad óptimos. Para planificar la capacidad de forma precisa, le recomendamos que pruebe su carga de trabajo específica para determinar el EPS real que puede generar cada sondeador de eventos.

## Configuración del modo aprovisionado para las asignación de orígenes de eventos de Amazon SQS
<a name="sqs-configuring-provisioned-mode"></a>

Puede configurar el modo aprovisionado para la asignación de orígenes de eventos de Amazon SQS mediante la consola o la API de Lambda.

**Cómo configurar el modo aprovisionado para una asignación de orígenes de eventos de Amazon SQS existente (consola)**

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

1. Elija la función con la asignación de orígenes de eventos de Amazon SQS para la que desee configurar el modo aprovisionado.

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

1. Elija la asignación de orígenes de eventos de Amazon SQS para la que desee configurar el modo aprovisionado y, a continuación, seleccione **Editar**.

1. En **Configuración de la asignación de orígenes de eventos**, elija **Configurar el modo aprovisionado**.
   + En **Número mínimo de sondeos de eventos**, introduzca un valor entre 2 y 200. Si no especifica un valor, Lambda asigna el valor predeterminado de 2.
   + En **Número máximo de sondeos de eventos**, introduzca un valor entre 2 y 2000. Este valor debe ser mayor o igual que su valor para **Número mínimo de sondeos de eventos**. Si no especifica un valor, Lambda asigna el valor predeterminado de 200.

1. Seleccione **Save**.

Puede configurar el modo aprovisionado mediante programación con el objeto `ProvisionedPollerConfig` incluido en su `EventSourceMappingConfiguration`. Por ejemplo, el siguiente comando de la CLI `UpdateEventSourceMapping` configura un valor de `MinimumPollers` de 5 y un valor `MaximumPollers` de 100.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

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 la métrica de la asignación de orígenes de eventos.

Para deshabilitar el modo aprovisionado y volver al modo predeterminado (bajo demanda), puede usar el siguiente comando de la CLI `UpdateEventSourceMapping`:

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

**nota**  
El modo aprovisionado no se puede utilizar junto con el ajuste de concurrencia máxima. Cuando utiliza el modo aprovisionado, controla la máxima concurrencia mediante el número máximo de sondeadores de eventos.

Para obtener más información sobre la configuración del modo aprovisionado, consulte [Creación y configuración de una asignación de orígenes de eventos de Amazon SQS](services-sqs-configure.md).

## Ejemplo de evento de mensaje en cola estándar
<a name="example-standard-queue-message-event"></a>

**Example Evento de mensaje de Amazon SQS (cola estándar)**  

```
{
    "Records": [
        {
            "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
            "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082649183",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082649185"
            },
            "messageAttributes": {
                "myAttribute": {
                    "stringValue": "myValue", 
                    "stringListValues": [], 
                    "binaryListValues": [], 
                    "dataType": "String"
                }
            },
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        },
        {
            "messageId": "2e1424d4-f796-459a-8184-9c92662be6da",
            "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082650636",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082650649"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        }
    ]
}
```

De forma predeterminada, Lambda sondea hasta 10 mensajes en su cola a la vez y envía ese lote a la función. Para evitar invocar la función con un número pequeño de registros, puede configurar el origen del evento de modo que almacene en búfer registros hasta 5 minutos mediante la definición de una ventana de lote. Antes de invocar la función, Lambda continúa el sondeo de los mensajes de la cola estándar hasta que caduque la ventana de lotes, se alcance la [cuota de tamaño de carga de invocaciones](gettingstarted-limits.md) o se alcance el tamaño de lote máximo configurado.

Si utiliza un intervalo de lote y la cola de SQS contiene muy poco tráfico, Lambda puede esperar hasta 20 segundos antes de invocar la función. Esto sucederá incluso si establece un intervalo de lote inferior a 20 segundos. 

**nota**  
En Java, es posible que se produzcan errores de puntero nulo al deserializar JSON. Esto podría deberse a la forma en que el mapeador de objetos JSON convierte las mayúsculas/minúsculas de “Records” y “EventSourceARN”.

## Ejemplo de evento de mensajes de cola FIFO
<a name="sample-fifo-queues-message-event"></a>

Para las colas FIFO, los registros contienen atributos adicionales relacionados con la deduplicación y la secuenciación.

**Example Evento de mensaje de Amazon SQS (cola de FIFO)**  

```
{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}
```

# Creación y configuración de una asignación de orígenes de eventos de Amazon SQS
<a name="services-sqs-configure"></a>

Para procesar los mensajes de Amazon SQS con Lambda, configure la cola con los ajustes adecuados y, a continuación, cree una asignación de orígen de eventos de Lambda.

**Topics**
+ [Configurar una cola para utilizarla con Lambda](#events-sqs-queueconfig)
+ [Configuración de permisos de rol de ejecución de Lambda](#events-sqs-permissions)
+ [Creación de una asignación de orígenes de eventos](#events-sqs-eventsource)

## Configurar una cola para utilizarla con Lambda
<a name="events-sqs-queueconfig"></a>

Si aún no tiene una cola de Amazon SQS, [cree una](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html) que sirva como origen de eventos para la función de Lambda. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS, aunque pueden estar en [diferentes Cuentas de AWS](with-sqs-cross-account-example.md).

Para que su función tenga tiempo de procesar cada lote de registros, establezca el [tiempo de espera de visibilidad](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) de la cola de origen en al menos seis veces el [tiempo de espera que configure](configuration-timeout.md) en su función. El tiempo adicional permitirá a Lambda volver a intentar realizar los procesos en caso de que la función se vea limitada debido al procesamiento de un lote anterior.

**nota**  
El tiempo de espera de la función debe ser menor o igual que el tiempo de espera de visibilidad de la fila. Lambda valida este requisito al crear o actualizar una asignación de orígenes de eventos y devolverá un error si el tiempo de espera de la función supera el tiempo de espera de visibilidad de la fila.

De forma predeterminada, si Lambda detecta un error en cualquier momento del procesamiento de un lote, todos los mensajes de ese lote se vuelven a la cola. Tras el tiempo de [espera de visibilidad](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html), Lambda vuelve a ver los mensajes. Puede configurar la asignación de orígenes de orígenes de eventos para usar [respuestas de lote parciales](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) para devolver solo los mensajes fallidos a la cola. Si su función no puede procesar un mensaje en repetidas ocasiones, Amazon SQS podrá enviar dicho mensaje a una [cola de mensajes fallidos](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html). Te recomendamos que establezcas `maxReceiveCount` la [política de redrive de la cola de origen en al menos](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#policies-for-dead-letter-queues) 5. Esto le da a Lambda algunas oportunidades de volver a intentarlo antes de enviar los mensajes fallidos directamente a la cola de mensajes sin salida.

## Configuración de permisos de rol de ejecución de Lambda
<a name="events-sqs-permissions"></a>

La política administrada de AWS, [AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html), contiene los permisos que Lambda necesita para poder leer de la cola de Amazon SQS. Puede [agregar esta política administrada](lambda-intro-execution-role.md) al rol de ejecución de la función.

De manera opcional, si utiliza una cola cifrada, también debe agregar el siguiente permiso a su rol de ejecución:
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

## Creación de una asignación de orígenes de eventos
<a name="events-sqs-eventsource"></a>

Cree un mapeo de origen de eventos para indicar a Lambda que envíe elementos desde una cola a una función de Lambda. Puede crear varios mapeos de orígenes de eventos para procesar elementos de varias colas con una sola función. Cuando Lambda invoca la función objetivo, el evento puede contener múltiples elementos, dependiendo del *tamaño de lote* máximo configurable.

Para configurar la función para que lea desde Amazon SQS, adjunte la política administrada de AWS [AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) al rol de ejecución. A continuación, cree una asignación de orígenes de eventos de **SQS** desde la consola mediante los siguientes pasos.

**Cómo agregar permisos y crear un desencadenador**

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 una función.

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

1. En **Nombre del rol**, elija el enlace al rol de ejecución. Este enlace abre el rol en la consola de IAM.  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/execution-role.png)

1. Elija **Agregar permisos** y luego **Adjuntar políticas**.  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/attach-policies.png)

1. En el campo de búsqueda, escriba `AWSLambdaSQSQueueExecutionRole`. Agregue esta política al rol de ejecución. Se trata de una política administrada de AWS que contiene los permisos que la función necesita para leer desde una cola de Amazon SQS. Para obtener más información acerca de esta política, consulte [AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) en la *Referencia de políticas administradas de AWS*.

1. Regrese a la función en la consola de Lambda. En **Function overview (Descripción general de la función)**, elija **Add trigger (Agregar desencadenador)**.  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/add-trigger.png)

1. Elija un tipo de desencadenador.

1. Configure las opciones requeridas y luego elija **Add** (Agregar).

Lambda admite las siguientes opciones de configuración para los orígenes de eventos de Amazon SQS:

**Cola de SQS**  
La cola de Amazon SQS desde la que leer registros. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS, aunque pueden estar en [diferentes Cuentas de AWS](with-sqs-cross-account-example.md).

**Activar desencadenador**  
El estado de la asignación de origen de eventos. De forma predeterninada, la opción **Enable trigger** (Activar desencadenador) está seleccionada.

**Tamaño de lote**  
El número máximo de registros que se enviarán a la función en cada lote. Para una cola estándar, puede tratarse de hasta 10 000 registros. Para una cola FIFO, el máximo es 10. Para un tamaño de lote superior a 10, también debe establecer la ventana del lote (`MaximumBatchingWindowInSeconds`) a al menos 1 segundo.  
Configure el[ tiempo de espera de la función](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/configurations#timeouts) para que disponga de tiempo suficiente para procesar todo un lote de elementos. Si elementos tardan mucho tiempo en procesarse, elija un tamaño de lote más pequeño. Un tamaño de lote amplio puede mejorar la eficiencia para cargas de trabajo que son muy rápidas o tienen mucha administración. Si configura la [simultaneidad reservada](configuration-concurrency.md) en la función, establezca al menos cinco ejecuciones simultáneas para reducir la posibilidad de errores de limitación controlada cuando Lambda invoque la función.  
Lambda pasa todos los registros del lote a la función en una sola llamada, siempre y cuando el tamaño total de los eventos no exceda la [cuota de tamaño de carga de invocaciones](gettingstarted-limits.md) para la invocación sincrónica (6 MB). Tanto Lambda como Amazon SQS generan metadatos por cada registro. Estos metadatos adicionales se cuentan como el tamaño total de la carga útil y pueden hacer que el número total de registros enviados en un lote sea inferior al tamaño del lote configurado. Los campos de metadatos que Amazon SQS envía pueden tener una longitud variable. Para obtener más información acerca de los campos de metadatos de Amazon SQS, consulte la documentación de operación de la API [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) en la *Referencia de la API de Amazon Simple Queue Service*.

**Ventana del lote**  
La cantidad de tiempo máxima para recopilar registros antes de invocar la función, en segundos. Esto se aplica únicamente a las colas estándar.  
Si utiliza una ventana por lotes superior a 0 segundos, debe tener en cuenta el tiempo de procesamiento aumentado en el [tiempo de espera de visibilidad](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) de la cola. Recomendamos establecer el tiempo de espera de visibilidad de la cola hasta en seis veces el [tiempo de espera](configuration-timeout.md), más el valor de `MaximumBatchingWindowInSeconds`. Esto permite tiempo para que su función de Lambda procese cada lote de eventos y vuelva a intentarlo en caso de un error de limitación.  
Cuando los mensajes están disponibles, Lambda comienza a procesar los mensajes en lotes. Lambda comienza a procesar 5 lotes a la vez con 5 invocaciones simultáneas de la función. Si los mensajes siguen estando disponibles, Lambda agrega hasta 300 invocaciones simultáneas de la función por minuto, hasta un máximo de 1250 invocaciones simultáneas. Cuando se utiliza el modo aprovisionado, cada sondeador de eventos puede gestionar hasta 1 MB/s de rendimiento, hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de Amazon SQS por segundo. Lambda escala el número de sondeadores de eventos entre el mínimo y el máximo configurados, y suma rápidamente hasta 1000 invocaciones simultáneas por minuto para proporcionar un procesamiento de baja latencia de los eventos de Amazon SQS. Usted controla el escalado y la concurrencia mediante estos ajustes de los sondeadores de eventos mínimos y máximos. Para obtener más información sobre el escalado de funciones y la concurrencia, consulte [Comprender el escalado de la función de Lambda](lambda-concurrency.md).  
Para procesar más mensajes, puede optimizar la función de Lambda para obtener un mayor rendimiento. Para obtener más información, consulte [Entender cómo escala AWS Lambda con las colas estándar de Amazon SQS](https://aws.amazon.com/blogs/compute/understanding-how-aws-lambda-scales-when-subscribed-to-amazon-sqs-queues/#:~:text=If there are more messages,messages from the SQS queue.).

**Criterios del filtro**  
Agregue criterios de filtrado para controlar qué eventos envía Lambda a su función para su procesamiento. Para obtener más información, consulte [Controle qué eventos envía Lambda a la función](invocation-eventfiltering.md).

**Simultaneidad máxima**  
Número máximo de funciones simultáneas que puede invocar el origen de eventos. No se puede usar con el modo apromovisionado habilitado. Para obtener más información, consulte [Configuración de la simultaneidad máxima para los orígenes de eventos de Amazon SQS](services-sqs-scaling.md#events-sqs-max-concurrency).

**Modo aprovisionado**  
Cuando está habilitado, asigna recursos de sondeo dedicados para la asignación de orígenes de eventos. Puede configurar el número mínimo (2-200) y máximo (2-2000) de sondeadores de eventos. Cada sondeador de eventos puede gestionar hasta 1 MB/s de rendimiento, hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de Amazon SQS por segundo.  
Nota: No puede utilizar el modo Aprovisionado y la concurrencia máxima a la vez. Cuando el modo Aprovisionado esté habilitado, utilice la configuración máxima de sondeadores para controlar la concurrencia.

# Configuración del comportamiento de escalado para las asignaciones de orígenes de eventos de SQS
<a name="services-sqs-scaling"></a>

Puede controlar el comportamiento de escalado de las asignaciones de orígenes de eventos de Amazon SQS mediante la configuración de concurrencia máxima o la habilitación del modo aprovisionado. Estas opciones se excluyen mutuamente.

De forma predeterminada, Lambda escala automáticamente los sondeadores de eventos en función del volumen de los mensajes. Cuando habilita el modo aprovisionado, asigna un número mínimo y máximo de recursos de sondeo dedicados que permanecen preparados para gestionar los patrones de tráfico esperados. Esto le permite optimizar el rendimiento de la asignación de orígenes de eventos de dos maneras:
+ Modo estándar (predeterminado): Lambda administra automáticamente el escalado, a partir de un número reducido de sondeadores y con aumentos o reducciones según la carga de trabajo.
+ Modo aprovisionado: se configuran recursos de sondeo dedicados con límites mínimos y máximos, lo que permite un escalado 3 veces más rápido y una capacidad de procesamiento hasta 16 veces mayor.

Para las colas estándar, Lambda utiliza el [sondeo largo](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling) para sondear una cola hasta que se active. Cuando los mensajes están disponibles, Lambda comienza a procesar cinco lotes a la vez con cinco invocaciones simultáneas de la función. Si los mensajes siguen disponibles, Lambda aumenta el número de procesos que son lotes de lectura hasta 300 invocaciones simultáneas más por minuto. El número máximo de invocaciones que una asignación de orígenes de eventos puede procesar simultáneamente es 1250. Cuando el tráfico es bajo, Lambda reduce el procesamiento a 5 invocaciones simultáneas y puede optimizarlo a tan solo 2 invocaciones simultáneas para reducir las llamadas a Amazon SQS y los costos correspondientes. Sin embargo, esta optimización no está disponible cuando se habilita la configuración de simultaneidad máxima.

Para colas FIFO, Lambda envía mensajes a su función en el orden en que los recibe. Cuando envíe un mensaje a una cola FIFO, especifique un [ID de grupo de mensajes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html). Amazon SQS garantiza que los mensajes del mismo grupo se entreguen a Lambda en orden. Cuando Lambda lee los mensajes en lotes, cada lote puede contener mensajes de más de un grupo, pero se mantiene el orden de los mensajes. Si la función devuelve un error, esta realiza todos los reintentos en los mensajes afectados antes de que Lambda reciba mensajes adicionales del mismo grupo.

Cuando se utiliza el modo aprovisionado, cada sondeador de eventos puede gestionar hasta 1 MB/s de rendimiento, hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de Amazon SQS por segundo. 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 los eventos de Amazon SQS. El uso del modo aprovisionado conlleva costos adicionales. Para obtener más información sobre precios, consulte [Precios de AWS Lambda](https://aws.amazon.com/lambda/pricing/). Cada sondeador de eventos utiliza [sondeos prolongados](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html) en la cola de SQS, con hasta 10 sondeos por segundo, lo que supone un costo por las solicitudes de la API de SQS. Para obtener más información, consulte [Precios de Amazon SQS](https://aws.amazon.com/sqs/pricing/ ). El escalado y la concurrencia se controlan mediante estas configuraciones mínima y máxima de los sondeadores de eventos, en lugar de usar la configuración de concurrencia máxima, ya que estas opciones no pueden usarse juntas.

**nota**  
No puede utilizar la configuración de concurrencia máxima y el modo aprovisionado al mismo tiempo. Cuando el modo aprovisionado está habilitado, puede controlar el escalado y la concurrencia de la asignación de orígenes de eventos de Amazon SQS mediante el número mínimo y máximo de sondeadores de eventos.

## Configuración de la simultaneidad máxima para los orígenes de eventos de Amazon SQS
<a name="events-sqs-max-concurrency"></a>

Puede utilizar la configuración de simultaneidad máxima para controlar el comportamiento de escalado de los orígenes de eventos de SQS. Tenga en cuenta que la concurrencia máxima no se puede utilizar con el modo aprovisionado habilitado. La configuración de la simultaneidad máxima limita el número de instancias simultáneas de la función que puede invocar un origen de eventos de Amazon SQS. La simultaneidad máxima es una configuración a nivel de origen de eventos. Si tiene varios orígenes de eventos de Amazon SQS asignación de orígenes de eventos, cada origen de eventos puede tener una configuración de simultaneidad máxima independiente. Puede utilizar la simultaneidad máxima para evitar que una cola utilice toda la [simultaneidad reservada](configuration-concurrency.md) de la función o el resto de la [cuota de simultaneidad de la cuenta](gettingstarted-limits.md). No hay ningún cargo por configurar la simultaneidad máxima en un origen de eventos de Amazon SQS.

Es importante destacar que la simultaneidad máxima y reservada son dos configuraciones independientes. No establezca una simultaneidad máxima superior a la reservada de la función. Si configura la simultaneidad máxima, asegúrese de que la simultaneidad reservada de la función es mayor o igual que la simultaneidad máxima total para todos los orígenes de eventos de Amazon SQS de la función. De lo contrario, Lambda podría limitar sus mensajes.

Si la cuota de simultaneidad de su cuenta se establece en el valor predeterminado (1000), puede escalarse una asignación de orígenes de eventos de Amazon SQS para invocar instancias de funciones hasta este valor, a menos que especifique una simultaneidad máxima.

Si recibe un aumento de la cuota de simultaneidad predeterminada de su cuenta, es posible que Lambda no pueda invocar instancias de funciones simultáneas hasta la nueva cuota. De forma predeterminada, Lambda puede escalar para invocar hasta 1250 instancias de funciones simultáneas para una asignación de orígenes de eventos de Amazon SQS. Si esto no es suficiente para su caso de uso, póngase en contacto con el servicio de asistencia de AWS para tratar un aumento de la simultaneidad de asignación de orígenes de eventos de Amazon SQS de su cuenta.

**nota**  
En el caso de las colas FIFO, las invocaciones simultáneas están limitadas por el número de [ID de grupos de mensajes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) (`messageGroupId`) o por la configuración de simultaneidad máxima, lo que sea inferior. Por ejemplo, si tiene seis ID de grupos de mensajes y la simultaneidad máxima está establecida en 10, la función puede tener un máximo de seis invocaciones simultáneas.

Puede configurar la simultaneidad máxima en la asignación de orígenes de eventos nuevos y existentes de Amazon SQS.

**Configure la simultaneidad máxima mediante la consola Lambda**

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 una función.

1. En **Function overview** (Descripción general de las funciones), elija **SQS**. Esta abre la pestaña **Configuration** (Configuración).

1. Seleccione el activador de Amazon SQS y elija **Edit** (Editar).

1. En **Maximum concurrency** (Simultaneidad máxima), introduzca un número entre 2 y 1000. Para desactivar la simultaneidad máxima, deje la casilla vacía.

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

**Configure la simultaneidad máxima mediante la AWS Command Line Interface (AWS CLI)**  
Utilice el comando [asignación de orígenes de eventos](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) con la opción `--scaling-config`. Ejemplo:

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config '{"MaximumConcurrency":5}'
```

Para desactivar la simultaneidad máxima, introduzca un valor vacío para `--scaling-config`:

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

**Configure la simultaneidad máxima mediante la API de Lambda**  
Utilice las acciones de [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) o [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) con un objeto [ScalingConfig](https://docs.aws.amazon.com/lambda/latest/api/API_ScalingConfig.html).

# Gestión de errores para un origen de eventos de SQS en Lambda
<a name="services-sqs-errorhandling"></a>

Para gestionar los errores relacionados con un origen de eventos de SQS, Lambda utiliza automáticamente una estrategia de reintento con una estrategia de retroceso. También puede personalizar el comportamiento de la gestión de errores si configura la asignación de orígenes de eventos de SQS para que devuelva [respuestas parciales por lotes](#services-sqs-batchfailurereporting).

## Estrategia de retroceso para invocaciones fallidas
<a name="services-sqs-backoff-strategy"></a>

Cuando se produce un error en una invocación, Lambda intenta volver a intentar la invocación mientras implementa una estrategia de retraso. La estrategia de retroceso difiere ligeramente en función de si Lambda encontró el error debido a un error en el código de la función o a una limitación.
+  Si el **código de la función** provocó el error, Lambda dejará de procesar y volver a intentar la invocación. Mientras tanto, Lambda reduce de manera gradual el volumen de simultaneidad asignada a su asignación de orígenes de eventos de Amazon SQS. Cuando se agote el tiempo de espera de visibilidad de la cola, el mensaje volverá a aparecer en la cola. 
+ Si la invocación falla debido a la **limitación**, Lambda retrocede gradualmente los reintentos reduciendo la cantidad de simultaneidad asignada a la asignación de orígenes de eventos de Amazon SQS. Lambda sigue reintentando enviar el mensaje hasta que la marca de tiempo del mensaje supere el tiempo límite de visibilidad de la cola, momento en el que Lambda descarta el mensaje.

## Implementación de respuestas parciales por lotes
<a name="services-sqs-batchfailurereporting"></a>

Cuando la función Lambda detecta un error al procesar un lote, todos los mensajes de ese lote se vuelven a ver en la cola de forma predeterminada, incluidos los mensajes que Lambda procesó correctamente. Como resultado, la función puede terminar procesando el mismo mensaje varias veces.

Para evitar el reprocesamiento de todos los mensajes procesados con éxito en un lote con errores, puede configurar la asignación de orígenes de eventos para que solo se vean de nuevo los mensajes fallidos. Esto se denomina respuesta parcial por lotes. Para activar las respuestas parciales por lotes, especifique `ReportBatchItemFailures` en la acción [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html#lambda-UpdateEventSourceMapping-request-FunctionResponseTypes) cuando configure la asignación de orígenes de eventos. Esto permite que la función devuelva un éxito parcial, lo que puede ayudar a reducir el número de reintentos innecesarios en los registros.

**nota**  
La [utilidad de procesador de lotes](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) de Powertools para AWS Lambda gestiona de manera automática toda la lógica de respuesta parcial del lote. Esta utilidad simplifica la implementación de los patrones de procesamiento por lotes y reduce el código personalizado que se necesita para gestionar de manera adecuada los errores de los artículos del lote. Está disponible para Python, Java, TypeScript y .NET.

Cuando `ReportBatchItemFailures` está activado, Lambda no [reduce verticalmente el sondeo de mensajes](#services-sqs-backoff-strategy) cuando fallan las invocaciones de las funciones. Utilice `ReportBatchItemFailures`, si espera que algunos mensajes fallen y no quiere que esos errores afecten a la velocidad de procesamiento de los mensajes.

**nota**  
Tenga en cuenta las siguientes consideraciones al utilizar las respuestas parciales por lotes:  
Si la función genera una excepción, todo el lote se considera un error completo.
Si utiliza esta característica con una cola FIFO, la función debe dejar de procesar los mensajes después del primer error y devolver todos los mensajes fallidos y sin procesar en `batchItemFailures`. Esto ayuda a preservar el orden de los mensajes en la cola.

**Para activar los informes parciales por lotes**

1. Revise las [Prácticas recomendadas para implementar las respuestas parciales por lotes](https://docs.aws.amazon.com/prescriptive-guidance/latest/lambda-event-filtering-partial-batch-responses-for-sqs/best-practices-partial-batch-responses.html).

1. Ejecute el siguiente comando para activar `ReportBatchItemFailures` para la función. Para recuperar el UUID de la asignación de orígenes de eventos, ejecute el comando [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) de la AWS CLI.

   ```
   aws lambda update-event-source-mapping \
   --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
   --function-response-types "ReportBatchItemFailures"
   ```

1. Actualice el código de la función para detectar todas las excepciones y devolver los mensajes fallidos en una respuesta JSON `batchItemFailures`. La respuesta `batchItemFailures` debe incluir una lista de ID de mensajes, como valores JSON `itemIdentifier`.

   Supongamos que tiene un lote de cinco mensajes con ID de mensaje `id1`, `id2`, `id3`, `id4` y `id5`. Su función procesa correctamente `id1`, `id3` y `id5`. Para hacer que los mensajes `id2` y `id4` sean de nuevo visibles en la cola, la función debe devolver la siguiente respuesta: 

   ```
   { 
     "batchItemFailures": [ 
           {
               "itemIdentifier": "id2"
           },
           {
               "itemIdentifier": "id4"
           }
       ]
   }
   ```

   Estos son algunos ejemplos de código de función que devuelven la lista de IDs de mensajes fallidos del lote:

------
#### [ .NET ]

**SDK para .NET**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante .NET.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   using Amazon.Lambda.Core;
   using Amazon.Lambda.SQSEvents;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   namespace sqsSample;
   
   public class Function
   {
       public async Task<SQSBatchResponse> FunctionHandler(SQSEvent evnt, ILambdaContext context)
       {
           List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new List<SQSBatchResponse.BatchItemFailure>();
           foreach(var message in evnt.Records)
           {
               try
               {
                   //process your message
                   await ProcessMessageAsync(message, context);
               }
               catch (System.Exception)
               {
                   //Add failed message identifier to the batchItemFailures list
                   batchItemFailures.Add(new SQSBatchResponse.BatchItemFailure{ItemIdentifier=message.MessageId}); 
               }
           }
           return new SQSBatchResponse(batchItemFailures);
       }
   
       private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
       {
           if (String.IsNullOrEmpty(message.Body))
           {
               throw new Exception("No Body in SQS Message.");
           }
           context.Logger.LogInformation($"Processed message {message.Body}");
           // TODO: Do interesting work based on the new message
           await Task.CompletedTask;
       }
   }
   ```

------
#### [ Go ]

**SDK para Go V2**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante Go.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"fmt"
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   func handler(ctx context.Context, sqsEvent events.SQSEvent) (map[string]interface{}, error) {
   	batchItemFailures := []map[string]interface{}{}
   
   	for _, message := range sqsEvent.Records {
   		if len(message.Body) > 0 {
   			// Your message processing condition here
   			fmt.Printf("Successfully processed message: %s\n", message.Body)
   		} else {
   			// Message processing failed
   			fmt.Printf("Failed to process message %s\n", message.MessageId)
   			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": message.MessageId})
   		}
   	}
   
   	sqsBatchResponse := map[string]interface{}{
   		"batchItemFailures": batchItemFailures,
   	}
   	return sqsBatchResponse, nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK para Java 2.x**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante Java.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.SQSEvent;
   import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
    
   import java.util.ArrayList;
   import java.util.List;
    
   public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> {
       @Override
       public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
            List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>();
   
            for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) {
                try {
                    //process your message
                } catch (Exception e) {
                    //Add failed message identifier to the batchItemFailures list
                    batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(message.getMessageId()));
                }
            }
            return new SQSBatchResponse(batchItemFailures);
        }
   }
   ```

------
#### [ JavaScript ]

**SDK para JavaScript (v3)**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante JavaScript.  

   ```
   // Node.js 20.x Lambda runtime, AWS SDK for Javascript V3
   export const handler = async (event, context) => {
       const batchItemFailures = [];
       for (const record of event.Records) {
           try {
               await processMessageAsync(record, context);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
       return { batchItemFailures };
   };
   
   async function processMessageAsync(record, context) {
       if (record.body && record.body.includes("error")) {
           throw new Error("There is an error in the SQS Message.");
       }
       console.log(`Processed message: ${record.body}`);
   }
   ```
Notificación de los errores de los elementos del lote de SQS con Lambda mediante TypeScript.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { SQSEvent, SQSBatchResponse, Context, SQSBatchItemFailure, SQSRecord } from 'aws-lambda';
   
   export const handler = async (event: SQSEvent, context: Context): Promise<SQSBatchResponse> => {
       const batchItemFailures: SQSBatchItemFailure[] = [];
   
       for (const record of event.Records) {
           try {
               await processMessageAsync(record);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
   
       return {batchItemFailures: batchItemFailures};
   };
   
   async function processMessageAsync(record: SQSRecord): Promise<void> {
       if (record.body && record.body.includes("error")) {
           throw new Error('There is an error in the SQS Message.');
       }
       console.log(`Processed message ${record.body}`);
   }
   ```

------
#### [ PHP ]

**SDK para PHP**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante PHP.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\Sqs\SqsEvent;
   use Bref\Event\Sqs\SqsHandler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   class Handler extends SqsHandler
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
   
       /**
        * @throws JsonException
        * @throws \Bref\Event\InvalidLambdaEvent
        */
       public function handleSqs(SqsEvent $event, Context $context): void
       {
           $this->logger->info("Processing SQS records");
           $records = $event->getRecords();
   
           foreach ($records as $record) {
               try {
                   // Assuming the SQS message is in JSON format
                   $message = json_decode($record->getBody(), true);
                   $this->logger->info(json_encode($message));
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   $this->logger->error($e->getMessage());
                   // failed processing the record
                   $this->markAsFailed($record);
               }
           }
           $totalRecords = count($records);
           $this->logger->info("Successfully processed $totalRecords SQS records");
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

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

**SDK para Python (Boto3)**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante Python.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   def lambda_handler(event, context):
       if event:
           batch_item_failures = []
           sqs_batch_response = {}
        
           for record in event["Records"]:
               try:
                   print(f"Processed message: {record['body']}")
               except Exception as e:
                   batch_item_failures.append({"itemIdentifier": record['messageId']})
           
           sqs_batch_response["batchItemFailures"] = batch_item_failures
           return sqs_batch_response
   ```

------
#### [ Ruby ]

**SDK para Ruby**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda-with-batch-item-handling). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante Ruby.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   require 'json'
   
   def lambda_handler(event:, context:)
     if event
       batch_item_failures = []
       sqs_batch_response = {}
   
       event["Records"].each do |record|
         begin
           # process message
         rescue StandardError => e
           batch_item_failures << {"itemIdentifier" => record['messageId']}
         end
       end
   
       sqs_batch_response["batchItemFailures"] = batch_item_failures
       return sqs_batch_response
     end
   end
   ```

------
#### [ Rust ]

**SDK para Rust**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Notificación de los errores de los elementos del lote de SQS con Lambda mediante Rust.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::{
       event::sqs::{SqsBatchResponse, SqsEvent},
       sqs::{BatchItemFailure, SqsMessage},
   };
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   async fn process_record(_: &SqsMessage) -> Result<(), Error> {
       Err(Error::from("Error processing message"))
   }
   
   async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<SqsBatchResponse, Error> {
       let mut batch_item_failures = Vec::new();
       for record in event.payload.records {
           match process_record(&record).await {
               Ok(_) => (),
               Err(_) => batch_item_failures.push(BatchItemFailure {
                   item_identifier: record.message_id.unwrap(),
               }),
           }
       }
   
       Ok(SqsBatchResponse {
           batch_item_failures,
       })
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       run(service_fn(function_handler)).await
   }
   ```

------

Si los eventos fallidos no vuelven a la cola, consulte [¿Cómo soluciono los problemas de la función de Lambda SQS ReportBatchItemFailures?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-sqs-report-batch-item-failures/) en el Centro de conocimientos de AWS.

### Condiciones de éxito y fracaso
<a name="sqs-batchfailurereporting-conditions"></a>

Lambda trata un lote como un éxito completo si la función devuelve cualquiera de los siguientes elementos:
+ Una lista `batchItemFailures` vacía
+ Una lista `batchItemFailures` nula
+ Una `EventResponse` vacía
+ Una `EventResponse` nula

Lambda trata un lote como un error completo si la función devuelve cualquiera de los siguientes elementos:
+ Respuesta JSON no válida
+ Una cadena `itemIdentifier` vacía
+ Una nula `itemIdentifier`
+ Un `itemIdentifier` con un mal nombre de clave
+ Un valor `itemIdentifier` con un ID de mensaje que no existe

### Métricas de CloudWatch
<a name="sqs-batchfailurereporting-metrics"></a>

Para determinar si la función informa correctamente de los errores de elementos por lotes, puede monitorear las métricas Amazon SQS `NumberOfMessagesDeleted` y `ApproximateAgeOfOldestMessage` en Amazon CloudWatch.
+ `NumberOfMessagesDeleted` realiza un seguimiento del número de mensajes eliminados de la cola. Si cae a 0, es una señal de que la respuesta de la función no está devolviendo correctamente los mensajes fallidos.
+ `ApproximateAgeOfOldestMessage` hace un seguimiento de cuánto tiempo ha permanecido el mensaje más antiguo en la cola. Un aumento brusco de esta métrica puede indicar que la función no está devolviendo correctamente los mensajes fallidos.

### Uso de Powertools para el procesador por lotes de AWS Lambda
<a name="services-sqs-batchfailurereporting-powertools"></a>

La utilidad de procesamiento por lotes de Powertools para AWS Lambda gestiona de manera automática la lógica de respuesta parcial de los lotes, lo que reduce la complejidad de implementar la notificación de fallas en los lotes. Estos son algunos ejemplos del uso del procesador por lotes:

**Python**  
Para ver ejemplos completos e instrucciones de configuración, consulte la [documentación del procesador por lotes](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Procesamiento de mensajes de Amazon SQS con el procesador por lotes de AWS Lambda.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import SQSEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.SQS)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Para ver ejemplos completos e instrucciones de configuración, consulte la [documentación del procesador por lotes](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Procesamiento de mensajes de Amazon SQS con el procesador por lotes de AWS Lambda.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { SQSEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.SQS);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: SQSEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

# Parámetros de Lambda para las asignaciones de origen de eventos de Amazon SQS
<a name="services-sqs-parameters"></a>

Todos los tipos de origen de eventos Lambda comparten las mismas operaciones [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) y [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) de la API. Sin embargo, solo algunos de los parámetros se aplican a Amazon SQS.


| Parámetro | Obligatorio | Predeterminado | Notas | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  10  |  Para colas estándar, el máximo es 10 000. Para colas FIFO, el máximo es 10.  | 
|  Habilitado  |  N  |  true  | none  | 
|  EventSourceArn  |  S  | N/A |  El ARN del flujo de datos o un consumidor de flujos  | 
|  FunctionName  |  S  | N/A  | none  | 
|  FilterCriteria  |  N  |  N/A   |  [Controle qué eventos envía Lambda a la función](invocation-eventfiltering.md)  | 
|  FunctionResponseTypes  |  N  | N/A  |  Para permitir que la función informe de errores específicos de un lote, incluya el valor `ReportBatchItemFailures` en `FunctionResponseTypes`. Para obtener más información, consulte [Implementación de respuestas parciales por lotes](services-sqs-errorhandling.md#services-sqs-batchfailurereporting).  | 
|  MaximumBatchingWindowInSeconds  |  N  |  0  | No se admite el intervalo de lotes para las colas FIFO | 
|  ProvisionedPollerConfig  |  N  |  N/A  |  Configura el número mínimo (2-200) y máximo (2-2000) de sondeadores de eventos dedicados para la asignación de orígenes de eventos de SQS. Cada sondeador de eventos puede gestionar hasta 1 MB/s de rendimiento y 10 invocaciones simultáneas.  | 
|  ScalingConfig  |  N  |  N/A   |  [Configuración de la simultaneidad máxima para los orígenes de eventos de Amazon SQS](services-sqs-scaling.md#events-sqs-max-concurrency)  | 

# Uso del filtrado de eventos con una fuente de eventos de Amazon SQS
<a name="with-sqs-filtering"></a>

Puede utilizar el filtrado de eventos para controlar qué registros de un flujo o una cola envía Lambda a su función. Para obtener información general sobre cómo funciona el filtrado de eventos, consulte [Controle qué eventos envía Lambda a la función](invocation-eventfiltering.md).

Esta sección se centra en el filtrado de eventos para las fuentes de eventos de Amazon SQS.

**nota**  
Las asignaciones de orígenes de eventos de Amazon SQS solo admiten el filtrado en la clave `body`.

**Topics**
+ [Conceptos básicos de filtrado de eventos de Amazon SQS](#filtering-SQS)

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

Supongamos que su cola de Amazon SQS contiene mensajes en el siguiente formato JSON.

```
{
    "RecordNumber": 1234,
    "TimeStamp": "yyyy-mm-ddThh:mm:ss",
    "RequestCode": "AAAA"
}
```

Un registro de ejemplo para esta cola tendría el siguiente aspecto.

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
        },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
    "awsRegion": "us-west-2"
}
```

Para filtrar en función del contenido de los mensajes de Amazon SQS, utilice la clave `body` del registro de mensajes de Amazon SQS. Supongamos que desea procesar solo los registros en los que el `RequestCode` del mensaje de Amazon SQS sea “BBBB”. El objeto `FilterCriteria` sería el siguiente.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
        }
    ]
}
```

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

```
{
    "body": {
        "RequestCode": [ "BBBB" ]
        }
}
```

Puede agregar el filtro mediante la consola, la AWS CLI o una plantilla de AWS SAM.

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

Para agregar este filtro mediante la consola, siga las instrucciones que se indican en [Adjuntar criterios de filtro a una asignación de origen de eventos (consola)](invocation-eventfiltering.md#filtering-console) e ingrese la siguiente cadena para los **Criterios de filtro**.

```
{ "body" : { "RequestCode" : [ "BBBB" ] } }
```

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

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": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

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": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

------
#### [ AWS SAM ]

Para agregar este filtro mediante AWS SAM, agregue el siguiente fragmento a la plantilla YAML de su origen de eventos.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'
```

------

Supongamos que desea que su función procese solo los registros en los que `RecordNumber` sea un valor superior a 9999. El objeto `FilterCriteria` sería el siguiente.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
        }
    ]
}
```

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

```
{
    "body": {
        "RecordNumber": [
            {
                "numeric": [ ">", 9999 ]
            }
        ]
    }
}
```

Puede agregar el filtro mediante la consola, la AWS CLI o una plantilla de AWS SAM.

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

Para agregar este filtro mediante la consola, siga las instrucciones que se indican en [Adjuntar criterios de filtro a una asignación de origen de eventos (consola)](invocation-eventfiltering.md#filtering-console) e ingrese la siguiente cadena para los **Criterios de filtro**.

```
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
```

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

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": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

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": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

Para agregar este filtro mediante AWS SAM, agregue el siguiente fragmento a la plantilla YAML de su origen de eventos.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'
```

------

Para Amazon SQS, el cuerpo del mensaje puede ser cualquier cadena. No obstante, esto puede ser problemático si los `FilterCriteria` esperan que el formato JSON del `body` sea válido. La situación inversa también es problemática: si el cuerpo del mensaje entrante está en formato JSON, pero los criterios de filtro esperan que el `body` sea una cadena sin formato, puede producirse un comportamiento no deseado.

Para evitar este problema, asegúrese de que el formato del cuerpo de los `FilterCriteria` coincida con el formato esperado del `body` de los mensajes que recibe de la cola. Antes de filtrar los mensajes, Lambda evalúa automáticamente el formato del cuerpo del mensaje entrante y del patrón de filtro del `body`. Si no coincide, Lambda elimina el mensaje. En la siguiente tabla se resume esta evaluación:


| Formato del `body` del mensaje entrante | Formato del `body` del patrón de filtro | Acción resultante | 
| --- | --- | --- | 
|  Cadena sin formato  |  Cadena sin formato  |  Lambda filtra en función de los criterios de filtro.  | 
|  Cadena sin formato  |  Sin patrón de filtro para las propiedades de datos  |  Lambda filtra (solo en las demás propiedades de metadatos) en función de los criterios de filtro.  | 
|  Cadena sin formato  |  JSON válido  |  Lambda elimina el mensaje.  | 
|  JSON válido  |  Cadena sin formato  |  Lambda elimina el mensaje.  | 
|  JSON válido  |  Sin patrón de filtro para las propiedades de datos  |  Lambda filtra (solo en las demás propiedades de metadatos) en función de los criterios de filtro.  | 
|  JSON válido  |  JSON válido  |  Lambda filtra en función de los criterios de filtro.  | 

# Tutorial: Uso de Lambda con Amazon SQS
<a name="with-sqs-example"></a>

En este tutorial, creará una función de Lambda que consuma los mensajes de una cola de [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html). La función de Lambda se ejecuta cada vez que se agrega un mensaje nuevo a la cola. La función escribe los mensajes en un flujo de Registros de Amazon CloudWatch. En el siguiente diagrama, se muestran los recursos de AWS que utiliza para completar el tutorial.

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


Para completar este tutorial, lleve a cabo los siguientes pasos:

1. Cree una función de Lambda que escriba mensajes en Registros de CloudWatch.

1. Cree una cola de Amazon SQS.

1. Cree la asignación de orígenes de eventos de Lambda. La asignación de orígenes de eventos lee la cola de Amazon SQS e invoca la función de Lambda cuando se agrega un mensaje nuevo.

1. Para probar la configuración, agregue mensajes a la cola y supervise los resultados en Registros de CloudWatch.

## Requisitos previos
<a name="with-sqs-prepare"></a>

### Instala la AWS Command Line Interface
<a name="install_aws_cli"></a>

Si aún no ha instalado AWS Command Line Interface, siga los pasos que se indican en [Instalación o actualización de la versión más reciente de AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) para instalarlo.

El tutorial requiere un intérprete de comandos o un terminal de línea de comando para ejecutar los comandos. En Linux y macOS, use su administrador de intérprete de comandos y paquetes preferido.

**nota**  
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, `zip`) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, [instale el subsistema de Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Creación del rol de ejecución
<a name="with-sqs-create-execution-role"></a>

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


Un [rol de ejecución](lambda-intro-execution-role.md) es un rol de AWS Identity and Access Management (IAM) que concede a la función de Lambda permiso para acceder a recursos y Servicios de AWS. Para permitir que la función lea elementos de Amazon SQS, adjunte la política de permisos **AWSLambdaSQSQueueExecutionRole**.

**Para crear un rol de ejecución y adjuntar una política de permisos de Amazon SQS**

1. Abra la [página Roles](https://console.aws.amazon.com/iam/home#/roles) en la consola de IAM.

1. Elija **Creación de rol**.

1. En **Tipo de entidad de confianza**, elija **Servicio de AWS**.

1. En **Caso de uso**, elija **Lambda**.

1. Elija **Siguiente**.

1. En el cuadro de búsqueda **Permisos de selección**, ingrese **AWSLambdaSQSQueueExecutionRole**.

1. Seleccione la política **AWSLambdaSQSQueueExecutionRole** y luego elija **Siguiente**.

1. En **Detalles del rol**, para **Nombre del rol**, ingrese **lambda-sqs-role**; luego elija **Crear rol**.

Tras crear la función, anote el nombre de recurso de Amazon (ARN) de la función de ejecución. Lo necesitará en pasos posteriores.

## Creación de la función
<a name="with-sqs-create-function"></a>

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


Cree una función de Lambda: que procese los mensajes de Amazon SQS. El código de función registra el cuerpo del mensaje de Amazon SQS en los Registros de CloudWatch.

En este tutorial, se utiliza el tiempo de ejecución de Node.js 24, pero también hemos proporcionado archivos de código de ejemplo en otros lenguajes de tiempo de ejecución. Puede seleccionar la pestaña del siguiente cuadro para ver el código del tiempo de ejecución que le interesa. El código JavaScript que usará en este paso está en el primer ejemplo que se muestra en la pestaña **JavaScript**.

------
#### [ .NET ]

**SDK para .NET**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SqsIntegrationSampleCode
{
    public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
    {
        foreach (var message in evnt.Records)
        {
            await ProcessMessageAsync(message, context);
        }

        context.Logger.LogInformation("done");
    }

    private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed message {message.Body}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }

    }
}
```

------
#### [ Go ]

**SDK para Go V2**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package integration_sqs_to_lambda

import (
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.SQSEvent) error {
	for _, record := range event.Records {
		err := processMessage(record)
		if err != nil {
			return err
		}
	}
	fmt.Println("done")
	return nil
}

func processMessage(record events.SQSMessage) error {
	fmt.Printf("Processed message %s\n", record.Body)
	// TODO: Do interesting work based on the new message
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK para Java 2.x**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;

public class Function implements RequestHandler<SQSEvent, Void> {
    @Override
    public Void handleRequest(SQSEvent sqsEvent, Context context) {
        for (SQSMessage msg : sqsEvent.getRecords()) {
            processMessage(msg, context);
        }
        context.getLogger().log("done");
        return null;
    }

    private void processMessage(SQSMessage msg, Context context) {
        try {
            context.getLogger().log("Processed message " + msg.getBody());

            // TODO: Do interesting work based on the new message

        } catch (Exception e) {
            context.getLogger().log("An error occurred");
            throw e;
        }

    }
}
```

------
#### [ JavaScript ]

**SDK para JavaScript (v3)**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante JavaScript.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message) {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Uso de un evento de SQS con Lambda mediante TypeScript.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda";

export const functionHandler: SQSHandler = async (
  event: SQSEvent,
  context: Context
): Promise<void> => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message: SQSRecord): Promise<any> {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK para PHP**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\InvalidLambdaEvent;
use Bref\Event\Sqs\SqsEvent;
use Bref\Event\Sqs\SqsHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends SqsHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws InvalidLambdaEvent
     */
    public function handleSqs(SqsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $body = $record->getBody();
            // TODO: Do interesting work based on the new message
        }
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK para Python (Boto3)**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for message in event['Records']:
        process_message(message)
    print("done")

def process_message(message):
    try:
        print(f"Processed message {message['body']}")
        # TODO: Do interesting work based on the new message
    except Exception as err:
        print("An error occurred")
        raise err
```

------
#### [ Ruby ]

**SDK para Ruby**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].each do |message|
    process_message(message)
  end
  puts "done"
end

def process_message(message)
  begin
    puts "Processed message #{message['body']}"
    # TODO: Do interesting work based on the new message
  rescue StandardError => err
    puts "An error occurred"
    raise err
  end
end
```

------
#### [ Rust ]

**SDK para Rust**  
 Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de [ejemplos de tecnología sin servidor](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Uso de un evento de SQS con Lambda mediante Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sqs::SqsEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> {
    event.payload.records.iter().for_each(|record| {
        // process the record
        tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default())
    });

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Para crear una función de Lambda Node.js.**

1. Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.

   ```
   mkdir sqs-tutorial
   cd sqs-tutorial
   ```

1. Copie el código de muestra de JavaScript en un nuevo archivo con el nombre `index.js`.

1. Cree un paquete de implementación utilizando el siguiente comando `zip`.

   ```
   zip function.zip index.js
   ```

1. Cree una función de Lambda con el comando de AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html). Para el parámetro `role`, introduzca el ARN del rol de ejecución que creó anteriormente.
**nota**  
La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS.

   ```
   aws lambda create-function --function-name ProcessSQSRecord \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-sqs-role
   ```

## Prueba de la función
<a name="with-sqs-create-test-function"></a>

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


Invoque la función de Lambda manualmente con el comando `invoke` AWS CLI y un evento de Amazon SQS de muestra.

**Para invocar la función de Lambda con un evento de ejemplo**

1. Guarde el siguiente JSON como un archivo denominado `input.json`. Este JSON simula un evento que Amazon SQS podría enviar a la función de Lambda, donde `"body"` contiene el mensaje real de la cola. En este ejemplo, el mensaje es `"test"`.  
**Example Evento de Amazon SQS**  

   Se trata de un evento de prueba y no es necesario que cambie el mensaje o el número de cuenta.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

1. Ejecute el siguiente comando de AWS CLI [invoke](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html). Este comando devuelve Registros de CloudWatch en la respuesta. Para obtener más información acerca de la recuperación de registros, consulte [Acceso a los registros con la AWS CLI](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-cli).

   ```
   aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json 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 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*.

1. Encuentre el registro `INFO` en la respuesta. Aquí es donde la función de Lambda registra el cuerpo del mensaje. Debería ver registros con un aspecto similar al siguiente:

   ```
   2023-09-11T22:45:04.271Z	348529ce-2211-4222-9099-59d07d837b60	INFO	Processed message test
   2023-09-11T22:45:04.288Z	348529ce-2211-4222-9099-59d07d837b60	INFO	done
   ```

## Cree una cola de Amazon SQS.
<a name="with-sqs-configure-sqs"></a>

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


Cree una cola de Amazon SQS que la función de Lambda pueda utilizar como origen de eventos. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS.

**Para crear una cola**

1. Abra la [consola de Amazon SQS](https://console.aws.amazon.com/sqs).

1. Elige **Crear cola**.

1. Escriba un nombre para la cola. Deje las configuraciones predeterminadas de todas las demás opciones.

1. Elige **Crear cola**.

Tras crear la cola, anote su ARN. Lo necesitará en el siguiente paso al asociar la cola a la función de Lambda.

## Configuración del origen de eventos
<a name="with-sqs-attach-notification-configuration"></a>

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


Conecte la cola de Amazon SQS a la función de Lambda mediante la creación de una [asignación de orígenes de eventos](invocation-eventsourcemapping.md). La asignación de orígenes de eventos lee la cola de Amazon SQS e invoca la función de Lambda cuando se agrega un mensaje nuevo.

Para crear una asignación entre la cola de Amazon SQS y la función de Lambda, ejecute el comando de AWS CLI [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html). Ejemplo:

```
aws lambda create-event-source-mapping --function-name ProcessSQSRecord  --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue
```

Para obtener una lista de las asignaciones de orígenes de eventos, utilice el comando [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/2.1.29/reference/lambda/list-event-source-mappings.html). Ejemplo:

```
aws lambda list-event-source-mappings --function-name ProcessSQSRecord
```

## Enviar un mensaje de prueba
<a name="with-sqs-test-message"></a>

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


**Para enviar un mensaje de Amazon SQS a la función de Lambda**

1. Abra la [consola de Amazon SQS](https://console.aws.amazon.com/sqs).

1. Elija la cola que creó anteriormente.

1. Seleccione **Enviar y recibir mensajes**.

1. En el **Cuerpo del mensaje**, ingrese un mensaje de prueba, como “este es un mensaje de prueba”.

1. Elija **Enviar mensaje**.

Lambda sondea la cola en busca de actualizaciones. Cuando hay un nuevo mensaje, Lambda invoca la función con estos nuevos datos de evento desde la cola. Si el controlador de la función vuelve sin excepciones, Lambda considera que el mensaje se procesó correctamente y empieza a leer nuevos mensajes en la cola. Después de procesar correctamente un mensaje, Lambda lo elimina automáticamente de la cola. Si el controlador genera una excepción, Lambda considera que el lote de mensajes no se procesó correctamente e invoca la función con el mismo lote de mensajes.

## Consulta de los Registros de CloudWatch
<a name="with-sqs-check-logs"></a>

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


**Para confirmar que la función procesó el mensaje**

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

1. Elija la función **ProcessSQSRecord**.

1. Elegir **Monitor**.

1. Seleccione **Ver Registros en CloudWatch**.

1. En la consola de CloudWatch, elija el **Flujo de registro** para la función.

1. Busque el registro `INFO`. Aquí es donde la función de Lambda registra el cuerpo del mensaje. Debería ver el mensaje que envió desde la cola de Amazon SQS. Ejemplo:

   ```
   2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.
   ```

## Eliminación de sus recursos
<a name="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 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ó.

1. Elija **Eliminar**.

1. Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija **Delete** (Eliminar).

**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).

**Para eliminar la cola de Amazon SQS**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon SQS en [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/).

1. Seleccione la cola que ha creado.

1. Elija **Eliminar**.

1. Introduzca **confirm** en el campo de entrada de texto.

1. Elija **Eliminar**.

# Tutorial: Uso de una cola entre cuentas de Amazon SQS como un origen de eventos
<a name="with-sqs-cross-account-example"></a>

En este tutorial, creará una función de Lambda que consuma los mensajes de una cola de Amazon Simple Queue Service (Amazon SQS) en una cuenta de AWS diferente. Este tutorial incluye dos cuentas de AWS: la **Cuenta A** hace referencia a la cuenta que contiene la función de Lambda y la **Cuenta B** hace referencia a la cuenta que contiene la cola de Amazon SQS.

## Requisitos previos
<a name="with-sqs-cross-account-prepare"></a>

### Instala la AWS Command Line Interface
<a name="install_aws_cli"></a>

Si aún no ha instalado AWS Command Line Interface, siga los pasos que se indican en [Instalación o actualización de la versión más reciente de AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) para instalarlo.

El tutorial requiere un intérprete de comandos o un terminal de línea de comando para ejecutar los comandos. En Linux y macOS, use su administrador de intérprete de comandos y paquetes preferido.

**nota**  
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, `zip`) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, [instale el subsistema de Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Creación del rol de ejecución (Cuenta A)
<a name="with-sqs-cross-account-create-execution-role"></a>

En la **Cuenta A**, cree un [rol de ejecución](lambda-intro-execution-role.md) que conceda permiso a la función para acceder a los recursos necesarios de AWS.

**Para crear un rol de ejecución**

1. Abra la [página de Roles](https://console.aws.amazon.com/iam/home#/roles) (Roles) en la consola de AWS Identity and Access Management (IAM).

1. Elija **Crear rol**.

1. Cree un rol con las propiedades siguientes.
   + **Trusted entity (Entidad de confianza** – **AWS Lambda**
   + **Permisos**: **AWSLambdaSQSQueueExecutionRole**
   + **Role name (Nombre de rol** – **cross-account-lambda-sqs-role**

La política **AWSLambdaSQSQueueExecutionRole** tiene los permisos que la función necesita para leer elementos de Amazon SQS y escribir registros en Amazon CloudWatch Logs.

## Creación de la función (Cuenta A)
<a name="with-sqs-cross-account-create-function"></a>

En la **Cuenta A**, cree una función de Lambda que procese los mensajes de Amazon SQS. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS.

El siguiente ejemplo de código Node.js escribe cada mensaje en un registro de Registros de CloudWatch.

**Example index.mjs**  

```
export const handler = async function(event, context) {
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}
```

**Cómo crear la función**
**nota**  
Al seguir estos pasos, se crea una función de Node.js. Para otros lenguajes, los pasos son similares, pero algunos detalles son diferentes.

1. Guarde el código de ejemplo como un archivo denominado `index.mjs`.

1. Cree un paquete de implementación.

   ```
   zip function.zip index.mjs
   ```

1. Cree la función mediante el comando `create-function` de la AWS Command Line Interface (AWS CLI). Sustituya `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role` por el ARN del rol de ejecución que ha creado anteriormente.

   ```
   aws lambda create-function --function-name CrossAccountSQSExample \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role
   ```

## Prueba de la función (Cuenta A)
<a name="with-sqs-cross-account-create-test-function"></a>

En la **Cuenta A**, pruebe la función de Lambda de forma manual mediante el comando `invoke` de la AWS CLI y un evento de Amazon SQS de muestra.

Si el controlador vuelve normalmente sin excepciones, Lambda considera que el mensaje se procesó de forma correcta y empieza a leer mensajes nuevos en la cola. Después de procesar correctamente un mensaje, Lambda lo elimina automáticamente de la cola. Si el controlador genera una excepción, Lambda considera que el lote de mensajes no se procesó correctamente e invoca la función con el mismo lote de mensajes.

1. Guarde el siguiente JSON como un archivo denominado `input.txt`.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

   El JSON anterior simula un evento que Amazon SQS podría enviar a la función de Lambda, donde `"body"` contiene el mensaje real de la cola.

1. Ejecute el siguiente comando AWS CLI de la `invoke`.

   ```
   aws lambda invoke --function-name CrossAccountSQSExample \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

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

1. Verifique la salida en el archivo `outputfile.txt`.

## Creación de una cola de Amazon SQS (Cuenta B)
<a name="with-sqs-cross-account-configure-sqs"></a>

En la **Cuenta B**, cree una cola de Amazon SQS que la función de Lambda en la **Cuenta A** pueda utilizar como un origen de eventos. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS.

**Para crear una cola**

1. Abra la [consola de Amazon SQS](https://console.aws.amazon.com/sqs).

1. Elige **Crear cola**.

1. Cree una cola con las siguientes propiedades.
   + **Type** (Tipo): **estándar**
   + **Name** (Nombre): **LambdaCrossAccountQueue**
   + **Configuration** (Configuración): conserve la configuración predeterminada.
   + **Access policy** (Política de acceso): elija **Advanced** (Avanzada). Pegue la siguiente política JSON. Reemplace los siguientes valores:
     + `111122223333`: ID de la **cuenta A** de la Cuenta de AWS
     + `444455556666`: ID de la **cuenta B** de la Cuenta de AWS

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Id": "Queue1_Policy_UUID",
         "Statement": [
             {
                 "Sid": "Queue1_AllActions",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": [
                         "arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role"
                     ]
                 },
                 "Action": "sqs:*",
                 "Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue"
             }
         ]
     }
     ```

------

     Esta política concede al rol de ejecución de Lambda en la **Cuenta A** los permisos para consumir mensajes de esta cola de Amazon SQS.

1. Después de crear la cola, registre su Nombre de recurso de Amazon (ARN). Lo necesitará en el siguiente paso al asociar la cola a la función de Lambda.

## Configuración del origen de eventos (Cuenta A)
<a name="with-sqs-cross-account-event-source"></a>

En la **Cuenta A**, cree una asignación de orígenes de eventos entre la cola de Amazon SQS en la **Cuenta B** y la función de Lambda al ejecutar el siguiente comando `create-event-source-mapping` de la AWS CLI. Sustituya `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue` por el ARN de la cola de Amazon SQS que creó en el paso anterior.

```
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

Para obtener una lista de asignaciones de orígenes de eventos, ejecute el siguiente comando.

```
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

## Prueba de la configuración
<a name="with-sqs-final-integration-test-no-iam"></a>

Ahora puede probar la configuración de la siguiente manera:

1. En la **Cuenta B**, abra la [consola de Amazon SQS](https://console.aws.amazon.com/sqs).

1. Elija **LambdaCrossAccountQueue**, que creó anteriormente.

1. Seleccione **Send and receive messages (Enviar y recibir mensajes)**.

1. En **Message body** (Cuerpo del mensaje), ingrese un mensaje de prueba.

1. Elija **Enviar mensaje**.

La función de Lambda en la **Cuenta A** debería recibir el mensaje. Lambda continuará sondeando la cola en busca de actualizaciones. Cuando hay un nuevo mensaje, Lambda invoca la función con estos nuevos datos de evento desde la cola. La función se ejecuta y crea registros en Amazon CloudWatch. Puede ver los registros en la [consola de CloudWatch](https://console.aws.amazon.com/cloudwatch).

## Eliminación de sus recursos
<a name="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.

En la **Cuenta A**, limpie el rol de ejecución y la función de Lambda.

**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ó.

1. Elija **Eliminar**.

1. Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija **Delete** (Eliminar).

**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).

En la **Cuenta B**, limpie la cola de Amazon SQS.

**Para eliminar la cola de Amazon SQS**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon SQS en [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/).

1. Seleccione la cola que ha creado.

1. Elija **Eliminar**.

1. Introduzca **confirm** en el campo de entrada de texto.

1. Elija **Eliminar**.