Tutorial: usar o AWS Lambda com o Amazon Simple Notification Service
Você pode usar uma função do Lambda em uma conta da AWS para assinar um tópico do Amazon SNS em uma conta separada da AWS. Neste tutorial, você usa o AWS Command Line Interface para executar operações do AWS Lambda, como criar uma função do Lambda, criar um tópico do Amazon SNS e conceder permissões para permitir que esses dois recursos acessem um ao outro.
Pré-requisitos
Este tutorial pressupõe que você tenha algum conhecimento das operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Conceitos básicos do AWS Lambda para criar sua primeira função do Lambda.
Para seguir os procedimentos neste manual, você precisa de um terminal de linha de comando ou de um shell para executar os comandos. Nas listagens, os comandos são mostrados precedidos por um símbolo de prompt ($) e pelo nome do diretório atual, quando apropriado:
~/lambda-project$
this is a command
this is output
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. No Windows 10, você pode instalar o Subsistema Windows para Linux para obter uma versão do Ubuntu integrada com o Windows e o Bash.
No tutorial, você usa duas contas. Os comandos da AWS CLI ilustram isso usando dois perfis nomeados, cada um configurado para uso com uma conta diferente. Se você usar perfis com nomes diferentes, ou o perfil padrão e um perfil nomeado, modifique os comandos conforme necessário.
Criar um tópico do Amazon SNS
Em uma conta A, crie o tópico do Amazon SNS de origem.
$
aws sns create-topic --name lambda-x-account --profile accountA
Anote o ARN do tópico retornado pelo comando. Você precisará dele ao adicionar permissões à função de Lambda para assinar o tópico.
Criar a função de execução
Na conta B, crie a função de execução que concede à sua função permissão para acessar recursos da AWS.
Para criar uma função de execução
-
Abra a página Roles no console do IAM.
-
Selecione Create role.
-
Crie uma função com as seguintes propriedades.
-
Trusted entity (Entidade confiável) – AWS Lambda.
-
Permissions (Permissões) – AWSLambdaBasicExecutionRole.
-
Nome da função –
lambda-sns-role
.
-
A política AWSLambdaBasicExecutionRole tem as permissões necessárias para a função gravar logs no CloudWatch Logs.
Crie uma função Lambda
Na conta B, crie a função que processa os eventos do Amazon SNS. O código de amostra a seguir recebe uma entrada de evento Amazon SNS e processa as mensagens que ela contém. Na ilustração, o código grava alguns dos dados de eventos de entrada no CloudWatch Logs.
nota
Para o código de amostra em outras linguagens, consulte Código da função de amostra.
exemplo index.js
console.log('Loading function'); exports.handler = function(event, context, callback) { // console.log('Received event:', JSON.stringify(event, null, 4)); var message = event.Records[0].Sns.Message; console.log('Message received from SNS:', message); callback(null, "Success"); };
Para criar a função
-
Copie o código de amostra em um arquivo chamado
index.js
. -
Crie um pacote de implantação.
$
zip function.zip index.js
-
Crie uma função do Lambda com o comando
create-function
.$
aws lambda create-function --function-name SNS-X-Account \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role
arn:aws:iam::01234567891B:role/service-role/lambda-sns-execution-role
\ --timeout 60 --profile accountB
Anote o ARN da função retornado pelo comando. Você precisará dele ao adicionar permissões para permitir que o Amazon SNS invoque sua função.
Configurar permissões entre contas
Na conta A, conceda adicione permissão para a conta B para assinar o tópico:
$
aws sns add-permission --label lambda-access --aws-account-id
12345678901B
\ --topic-arn arn:aws:sns:us-east-2
:12345678901A
:lambda-x-account \ --action-name Subscribe ListSubscriptionsByTopic Receive --profile accountA
Na conta B adicione a permissão do Lambda para permitir a invocação no Amazon SNS.
$
aws lambda add-permission --function-name SNS-X-Account \ --source-arn arn:aws:sns:
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-2:01234567891A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}" }us-east-2
:12345678901A
:lambda-x-account \ --statement-id sns-x-account --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB
Não use o parâmetro --source-account
para adicionar uma conta de origem à política do Lambda ao adicionar a política.
A conta de origem não é compatível com fontes de eventos do Amazon SNS e resultará
em acesso negado.
Criar uma assinatura
Na conta B, assine a função do Lambda no tópico. Quando uma mensagem é enviada ao
tópico lambda-x-account
na conta A, o Amazon SNS invoca a função SNS-X-Account
na conta B.
$
aws sns subscribe --protocol lambda \ --topic-arn arn:aws:sns:
{ "SubscriptionArn": "arn:aws:sns:us-east-2:us-east-2
:12345678901A
:lambda-x-account \ --notification-endpoint arn:aws:lambda:us-east-2
:12345678901B
:function:SNS-X-Account \ --profile accountB12345678901A
:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
A saída contém o ARN da assinatura do tópico.
Assinatura de testes
Na conta A, teste a assinatura. Digite Hello World
em um arquivo de texto e salve-o como message.txt
. Em seguida, execute o seguinte comando:
$
aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:
us-east-2
:12345678901A
:lambda-x-account \ --profile accountA
Isso retornará um id de mensagem com um identificador exclusivo indicando que a mensagem
foi aceita pelo serviço do Amazon SNS. O Amazon SNS tentará enviá-lo aos assinantes
do tópico. Como alternativa, você pode fornecer uma string JSON diretamente para o
parâmetro message
, mas o uso de um arquivo de texto permite quebras de linha na mensagem.
Para saber mais sobre o Amazon SNS, consulte O que é o Amazon Simple Notification Service.