Como posso receber um alerta por e-mail quando minha pilha do AWS CloudFormation entrar no status ROLLBACK_IN_PROGRESS?

6 minuto de leitura
0

Quero receber um alerta por e-mail quando minha pilha do AWS CloudFormation entrar no status ROLLBACK_IN_PROGRESS durante a criação da pilha.

Breve descrição

Depois de concluir as etapas na seção Resolução, você pode esperar que a notificação funcione da seguinte maneira:

  1. Sua pilha do AWS CloudFormation envia todas as notificações para o tópico do Amazon Simple Notification Service (Amazon SNS) que notifica uma função do AWS Lambda.
  2. A função do Lambda analisa as notificações e envia somente notificações “ROLLBACK_IN_PROGRESS” para um segundo tópico do Amazon SNS configurado para alertas por e-mail.
  3. Esse segundo tópico do SNS envia um e-mail aos assinantes sobre a mensagem “ROLLBACK_IN_PROGRESS”.

Resolução

Crie um tópico do SNS e uma assinatura para alertas por e-mail

1.    Abra o console do Amazon SNS.

2.    No painel de navegação, selecione Tópicos.

Observação: para usar um tópico existente, selecione esse tópico na lista de recursos e vá para a etapa 7.

3.    Escolha Criar tópico.

4.    Em Nome, insira um nome de tópico.

5.    Em Nome de exibição, insira um nome de exibição.

6.    Escolha Criar tópico.

7.    Anote o nome do recurso da Amazon (ARN) do seu tópico para uso posterior.

8.    Escolha Criar assinatura.

9.    Em ARN do tópico, escolha o ARN do tópico do SNS que você anotou na etapa 7.

10.    Em ** Protocolo**, escolha E-mail.

11.    Em Endpoint, insira seu endereço de e-mail.

12.    Escolha Criar assinatura.

Observação: você receberá um e-mail de confirmação de assinatura do Amazon SNS a partir do endereço de e-mail que você inseriu na etapa 11.

13.    Na mensagem de e-mail de confirmação, escolha Confirmar assinatura.

Você verá uma mensagem de confirmação da assinatura no seu navegador.

Criar uma política do AWS Identity and Access Management (IAM) que permita que o Lambda publique no tópico do SNS para alertas por e-mail

Observação: essa política também permite que o Lambda grave no Amazon CloudWatch Logs.

1.    Abra o console do IAM.

2.    No painel de navegação, escolha Políticas.

3.    Escolha Criar política.

4.    Escolha a guia JSON e, em seguida, insira o seguinte código no editor de código JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sns:Publish"
      ],
      "Resource": [
        "{awsExampleSNSTopicARN}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}

Observação: substitua awsExampleSNSTopicARN pelo ARN do tópico do SNS que você criou para alertas por e-mail.

5.    Escolha Revisar política.

6.    Em Nome, insira um nome de política.

7.    Escolha Criar política.

Anexe a política do IAM a um perfil do IAM para o Lambda

1.    Abra o console do IAM.

2.    No painel de navegação, selecione Perfis.

3.    Escolha Criar perfil.

4.    Na seção Selecionar tipo de entidade confiável, escolha serviço da AWS.

5.    Na seção Escolher o serviço que usará esse perfil, escolha Lambda.

6.    Escolha Próximo: Permissões.

7.    Na barra de pesquisa, digite o nome da política que você criou anteriormente e selecione essa política.

8.    Escolha Próximo:Tags e, em seguida, crie uma tag opcional do IAM.

9.    Escolha Próximo: Revisar.

10.    Em Nome da função, insira um nome de função.

11.    Escolha Criar perfil.

Crie uma função do Lambda e atribua o perfil do IAM que você criou

1.    Abra o console do Lambda.

2.    Escolha ** Criar função**.

3.    Escolha Criar do zero.

4.    Em Nome, insira um nome para a função do Lambda.

5.    Em Runtime, escolha Node.js 10.x.

6.    Em perfil de Execução, escolha Usar um perfil existente.

7.    Em Perfil existente, escolha o perfil do IAM que você criou anteriormente.

8.    Escolha ** Criar função**.

Crie um segundo tópico e assinatura do SNS para notificar a função do Lambda

1.    Abra o console do Amazon SNS.

2.    No painel de navegação, selecione Tópicos.

3.    Escolha Criar tópico.

4.    Em Nome, insira um nome de tópico.

5.    Em Nome de exibição, insira um nome de exibição.

6.    Escolha Criar tópico.

7.    Anote o ARN do seu tópico para uso posterior.

8.    Escolha Criar assinatura.

9.    Em ARN do tópico, escolha o ARN do tópico do SNS que você anotou na etapa 7.

10.    Em Protocolo, escolha AWS Lambda.

11.    Em Endpoint, escolha a função do Lambda que você criou.

12.    Escolha Criar assinatura.

Atualizar a função do Lambda com um script que publica no tópico do SNS

1.    Abra o console do Lambda.

2.    No painel de navegação, escolha Funções e selecione a função que você criou anteriormente.

3.    Na seção Código da função, insira o seguinte script no painel do editor:

topic_arn = "{awsExampleSNSTopicARN}";
var AWS = require('aws-sdk');
AWS.config.region_array = topic_arn.split(':'); // splits the ARN into an array
AWS.config.region = AWS.config.region_array[3];  // makes the 4th variable in the array (will always be the region)

// ####################   BEGIN LOGGING   ########################

console.log(topic_arn);   // just for logging to the that the var was parsed correctly
console.log(AWS.config.region_array); // to see if the SPLIT command worked
console.log(AWS.config.region_array[3]); // to see if it got the region correctly
console.log(AWS.config.region); // to confirm that it set the AWS.config.region to the correct region from the ARN

// ####################  END LOGGING (you can remove this logging section)  ########################

exports.handler = function(event, context) {
    const message = event.Records[0].Sns.Message;
    if (message.indexOf("ROLLBACK_IN_PROGRESS") > -1) {
        var fields = message.split("\n");
        subject = fields[11].replace(/['']+/g, '');
        send_SNS_notification(subject, message);   
    }
};

function send_SNS_notification(subject, message) {
    var sns = new AWS.SNS();
    subject = subject + " is in ROLLBACK_IN_PROGRESS";
    sns.publish({
        Subject: subject,
        Message: message,
        TopicArn: topic_arn
    }, function(err, data) {
        if (err) {
            console.log(err.stack);
            return;
        }
        console.log('push sent');
        console.log(data);
    });
}

Observação: substitua awsExampleSNSTopicARN pelo ARN do tópico do SNS que você criou para alertas por e-mail.

4.    Na visualização Designer, na seção Adicionar gatilhos, escolha SNS.

5.    Na seção Configurar gatilhos, para o tópico do SNS, escolha o tópico do SNS que você criou para notificar a função do Lambda.

6.    Escolha Adicionar.

7.    Escolha Salvar.

Configurar sua pilha do AWS CloudFormation para enviar todas as notificações para o tópico do SNS que notifica a função do Lambda

1.    Abra o console do AWS CloudFormation e siga as etapas no assistente de configuração para criar uma pilha.

2.    Em Opções de notificação, escolha Tópico existente do Amazon SNS.

3.    Escolha o tópico do SNS que você criou para notificar a função do Lambda.

4.    Conclua as etapas no assistente de configuração para criar sua pilha.

Se você estiver usando a AWS Command Line Interface (AWS CLI) para criar uma pilha, use o comando --notification-arns. Esse comando envia notificações para o tópico do SNS que notifica a função do Lambda. Em seguida, defina o valor do tópico do SNS como o ARN do SNS.


Informações relacionadas

Trechos de modelo

Anatomia do modelo

Melhores práticas do AWS CloudFormation

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos