

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