

# Tutorial: Uso de uma fila do Amazon SQS entre contas como a origem de um evento
<a name="with-sqs-cross-account-example"></a>

Neste tutorial, você criará uma função do Lambda que consome mensagens de uma fila do Amazon Simple Queue Service (Amazon SQS) em uma conta da AWS diferente. Este tutorial envolve duas contas da AWS: **Conta A** refere-se à conta que contém sua função do Lambda e **Conta B** refere-se à conta que contém a fila do Amazon SQS.

## Pré-requisitos
<a name="with-sqs-cross-account-prepare"></a>

### Instalar o AWS Command Line Interface
<a name="install_aws_cli"></a>

Se você ainda não instalou a AWS Command Line Interface, siga as etapas em [Instalar ou atualizar a versão mais recente da AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) para instalá-la.

O tutorial requer um terminal de linha de comando ou um shell para executar os comandos. No Linux e no macOS, use o gerenciador de pacotes e de shell de sua preferência.

**nota**  
No Windows, alguns comandos da CLI do Bash que você costuma usar com o Lambda (como `zip`) não são compatíveis com os terminais integrados do sistema operacional. Para obter uma versão do Ubuntu com o Bash integrada no Windows, [instale o Subsistema do Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Criar a função de execução (Conta A)
<a name="with-sqs-cross-account-create-execution-role"></a>

Na **Conta A**, crie uma [função de execução](lambda-intro-execution-role.md) que dê à sua função permissão para acessar os recursos da AWS necessários.

**Para criar uma função de execução**

1. Abra a página [Roles](https://console.aws.amazon.com/iam/home#/roles) (Funções) no console do AWS Identity and Access Management (IAM).

1. Selecione **Criar perfil**.

1. Crie uma função com as propriedades a seguir.
   + **Trusted entity (Entidade confiável** – **AWS Lambda**
   + **Permissões**: **AWSLambdaSQSQueueExecutionRole**.
   + **Role name (Nome da função** – **cross-account-lambda-sqs-role**

A política **AWSLambdaSQSQueueExecutionRole** tem as permissões necessárias para a função ler itens do Amazon SQS e para gravar logs no Amazon CloudWatch Logs.

## Criar a função (Conta A)
<a name="with-sqs-cross-account-create-function"></a>

Na **Conta A**, crie uma função do Lambda para processar suas mensagens do Amazon SQS. A função do Lambda e a fila do Amazon SQS devem estar na mesma Região da AWS.

A seguir, o exemplo de código Node.js grava cada mensagem em um log do CloudWatch Logs.

**Example index.mjs**  

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

**Para criar a função**
**nota**  
Seguir estas etapas cria uma função no Node.js. Para outras linguagens, as etapas são semelhantes, mas alguns detalhes são diferentes.

1. Salve o exemplo de código como um arquivo denominado `index.mjs`.

1. Crie um pacote de implantação.

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

1. Crie a função usando o comando `create-function` da AWS Command Line Interface (AWS CLI). Substitua `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role` pelo ARN do perfil de execução que você criou 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
   ```

## Teste a função (Conta A)
<a name="with-sqs-cross-account-create-test-function"></a>

Na **Conta A**, invoque sua função do Lambda manualmente usando o comando `invoke` AWS CLI e um evento do Amazon SQS de exemplo.

Se o manipulador obtém um retorno normal sem exceções, o Lambda considerará a mensagem como processada com êxito e começará a ler novas mensagens na fila. Após o processamento com êxito, uma mensagem,o Lambda a exclui automaticamente da fila. Se o manipulador gera uma exceção, o Lambda considera que o batch de mensagens que não foram processadas com êxito e o Lambda invoca novamente a função com o mesmo batch de mensagens.

1. Salve o JSON a seguir como um arquivo 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"
           }
       ]
   }
   ```

   O JSON anterior simula um evento que o Amazon SQS pode enviar para a função do Lambda, onde `"body"` contém a mensagem real da fila.

1. Execute o comando `invoke` a seguir da AWS CLI.

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

   A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.

1. Verifique a saída no arquivo `outputfile.txt`.

## Criar uma fila do Amazon SQS (Conta B)
<a name="with-sqs-cross-account-configure-sqs"></a>

Na **Conta B**, crie uma fila do Amazon SQS que a função do Lambda na **Conta A** possa usar como uma fonte de eventos. A função do Lambda e a fila do Amazon SQS devem estar na mesma Região da AWS.

**Para criar uma fila**

1. Abra o [console do Amazon SQS](https://console.aws.amazon.com/sqs).

1. Selecione **Criar fila**.

1. Crie uma fila com as propriedades a seguir.
   + **Type** (Tipo): **Standard** (Padrão)
   + **Name** (Nome): **LambdaCrossAccountQueue**
   + **Configuration** (Configuração): mantenha as configurações padrão.
   + **Access policy** (Política de acesso): selecione **Advanced** (Avançado). Cole na seguinte política do JSON. Substitua os valores a seguir:
     + `111122223333`: Conta da AWS ID da **Conta A**
     + `444455556666`: Conta da AWS ID da **Conta B**

------
#### [ 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 à função de execução do Lambda na **Conta A** permissões para consumir mensagens desta fila do Amazon SQS.

1. Depois de criar a fila, registre o nome do recurso da Amazon (ARN). Você precisará dele na próxima etapa, quando for associar a fila à função do Lambda.

## Configurar a origem do evento (Conta A)
<a name="with-sqs-cross-account-event-source"></a>

Na **Conta A**, crie um mapeamento da origem do evento entre a fila do Amazon SQS na **Conta B** e sua função do Lambda executando o comando `create-event-source-mapping` da AWS CLI a seguir. Substitua `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue` pelo ARN da fila do Amazon SQS que você criou na etapa 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 obter uma lista de mapeamentos de fonte do evento, execute o comando a seguir.

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

## Testar a configuração
<a name="with-sqs-final-integration-test-no-iam"></a>

Você agora pode testar a configuração da seguinte forma:

1. Na **Conta B**, abra o [console do Amazon SQS](https://console.aws.amazon.com/sqs).

1. Escolha **LambdaCrossAccountQueue** criada anteriormente.

1. Escolha **Send and receive messages (Enviar e receber mensagens)**.

1. Em **Message body** (Corpo da mensagem), insira uma mensagem de teste.

1. Escolha **Send Message (Enviar mensagem)**.

Sua função do Lambda na **Conta A** deve receber a mensagem. O Lambda continuará a sondar a fila em busca de atualizações. Quando há uma nova mensagem, o Lambda invoca a sua função com esses novos dados de evento da fila. A função é executada e cria logs no Amazon CloudWatch. É possível visualizar os logs no [console do CloudWatch](https://console.aws.amazon.com/cloudwatch).

## Limpe os recursos
<a name="cleanup"></a>

Agora você pode excluir os recursos criados para este tutorial, a menos que queira mantê-los. Excluindo os recursos da AWS que você não está mais usando, você evita cobranças desnecessárias em sua Conta da AWS.

Na **Conta A**, limpe sua função de execução e a função do Lambda.

**Para excluir a função de execução**

1. Abra a página [Roles](https://console.aws.amazon.com/iam/home#/roles) (Funções) no console do IAM.

1. Selecione a função de execução que você criou.

1. Escolha **Excluir**.

1. Insira o nome do perfil no campo de entrada de texto e escolha **Delete** (Excluir).

**Como excluir a função do Lambda**

1. Abra a página [Functions](https://console.aws.amazon.com/lambda/home#/functions) (Funções) no console do Lambda.

1. Selecione a função que você criou.

1. Selecione **Actions**, **Delete**.

1. Digite **confirm** no campo de entrada de texto e escolha **Delete** (Excluir).

Na **Conta B**, limpe a fila do Amazon SQS.

**Para excluir a fila do Amazon SQS**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon SQS em [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/).

1. Selecione a fila que você criou.

1. Escolha **Excluir**.

1. Digite **confirm** no campo de entrada de texto.

1. Escolha **Excluir**.