Tutorial: Uso de uma fila do Amazon SQS entre contas como a origem de um evento
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
Este tutorial presume que você tenha algum conhecimento de operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Criar uma função do Lambda com o console para criar sua primeira função do Lambda.
Para concluir as etapas apresentadas a seguir, é necessário ter a versão 2 da AWS CLI. Os comandos e a saída esperada são mostrados em blocos separados:
aws --version
A seguinte saída deverá ser mostrada:
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
Para comandos longos, um caractere de escape (\
) é usado para dividir um comando em várias linhas.
No Linux e no macOS, use seu gerenciador preferido de pacotes e de shell.
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
Criar a função de execução (Conta A)
Na Conta A, crie uma função de execução que dê à sua função permissão para acessar os recursos da AWS necessários.
Para criar uma função de execução
-
Abra a página Roles
(Funções) no console do AWS Identity and Access Management (IAM). -
Selecione Criar perfil.
-
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)
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.
O exemplo de código Node.js 18 a seguir grava cada mensagem em um log do CloudWatch Logs.
exemplo 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 18. Para outras linguagens, as etapas são semelhantes, mas alguns detalhes são diferentes.
-
Salve o exemplo de código como um arquivo denominado
index.mjs
. -
Crie um pacote de implantação.
zip function.zip index.mjs
-
Crie a função usando o comando
create-function
da AWS Command Line Interface (AWS CLI).aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::
<AccountA_ID>
:role/cross-account-lambda-sqs-role
Teste a função (Conta 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 sucesso, 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.
-
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. -
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 no Guia do usuário da AWS Command Line Interface versão 2. -
Verifique a saída no arquivo
outputfile.txt
.
Criar uma fila do Amazon SQS (Conta B)
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
-
Abra o console do Amazon SQS
. -
Selecione Criar fila.
-
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 a seguinte política do JSON:
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
<AccountA_ID>
:role/cross-account-lambda-sqs-role" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-1:<AccountB_ID>
: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.
-
-
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)
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.
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:
<AccountB_ID>
: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:
<AccountB_ID>
:LambdaCrossAccountQueue
Testar a configuração
Você agora pode testar a configuração da seguinte forma:
-
Na Conta B, abra o console do Amazon SQS
. -
Escolha LambdaCrossAccountQueue criada anteriormente.
-
Escolha Send and receive messages (Enviar e receber mensagens).
-
Em Message body (Corpo da mensagem), insira uma mensagem de teste.
-
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. Você pode visualizar os logs no console do CloudWatch
Limpe os recursos
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
-
Abra a página Roles
(Funções) no console do IAM. -
Selecione a função de execução que você criou.
-
Escolha Excluir.
-
Insira o nome do perfil no campo de entrada de texto e escolha Delete (Excluir).
Como excluir a função do Lambda
-
Abra a página Functions
(Funções) no console do Lambda. -
Selecione a função que você criou.
-
Selecione Ações, Excluir.
-
Digite
delete
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
-
Faça login no AWS Management Console e abra o console do Amazon SQS em https://console.aws.amazon.com/sqs/
. -
Selecione a fila que você criou.
-
Escolha Excluir.
-
Digite
confirm
no campo de entrada de texto. -
Escolha Excluir.