AWS Lambda
Guia do desenvolvedor

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

  1. Abra a página Roles no console do IAM.

  2. Selecione Create role.

  3. Crie uma função com as seguintes propriedades.

    • Trusted entity (Entidade confiável)AWS Lambda.

    • Permissions (Permissões)AWSLambdaBasicExecutionRole.

    • Nome da funçãolambda-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

  1. Copie o código de amostra em um arquivo chamado index.js.

  2. Crie um pacote de implantação.

    $ zip function.zip index.js
  3. 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:us-east-2:12345678901A:lambda-x-account \ --statement-id sns-x-account --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB { "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\"}" }

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:us-east-2:12345678901A:lambda-x-account \ --notification-endpoint arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account \ --profile accountB { "SubscriptionArn": "arn:aws:sns:us-east-2:12345678901A: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.