当我的 AWS CloudFormation 堆栈处于 ROLLBACK_IN_PROGRESS 状态时,我如何才能收到电子邮件提醒?

上次更新时间:2019 年 11 月 12 日

当我的 AWS CloudFormation 堆栈在堆栈创建期间进入 ROLLBACK_IN_PROGRESS 状态时,我希望收到电子邮件提醒。我如何才能设置这些电子邮件提醒?

简要说明

在完成解决方法部分的步骤后,通知预计会按以下方式运行:

  1. 您的 AWS CloudFormation 堆栈会将所有通知发送到可通知 AWS Lambda 函数的 Amazon Simple Notification Service (Amazon SNS) 主题。
  2. Lambda 函数会解析通知并仅将“ROLLBACK_IN_PROGRESS”通知发送到第二个为电子邮件提醒配置的 Amazon SNS 主题。
  3. 第二个 SNS 主题会向订阅者发送有关“ROLLBACK_IN_PROGRESS”消息的电子邮件。

解决方法

为电子邮件提醒创建 SNS 主题和订阅

1.    打开 Amazon SNS 控制台

2.    在导航窗格中,选择主题

注意:要使用现有主题,请从资源列表中选择该主题,然后跳到步骤 7。

3.    选择创建主题

4.    在名称中,输入主题名称。

5.    在显示名称中,输入显示名称。

6.    选择创建主题

7.    请记下您的主题的 Amazon 资源名称 (ARN) 以供稍后使用。

8.    选择创建订阅

9.    在主题 ARN 中,选择您在步骤 7 中记下的 SNS 主题 ARN。

10.    在协议中,选择电子邮件

11.    在终端节点中,输入您的电子邮件地址。

12.    选择创建订阅

您将从步骤 11 中输入的电子邮件地址收到来自 Amazon SNS 的订阅确认电子邮件。

13.    在确认电子邮件中选择确认订阅

您将在浏览器中看到一条订阅确认消息。

创建 AWS Identity and Access Management (IAM) 策略,允许 Lambda 发布到 SNS 主题以获取电子邮件提醒

注意:该策略还允许 Lambda 写入 Amazon CloudWatch Logs。

1.    打开 IAM 控制台

2.    在导航窗格中,选择策略

3.    选择创建策略

4.    选择 JSON 选项卡,然后在 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:*:*:*"
    }
  ]
}

注意:请将 awsExampleSNSTopicARN 替换为您为电子邮件提醒创建的 SNS 主题的 ARN。

5.    选择查看策略

6.    在名称中,输入策略名称。

7.    选择创建策略

将 IAM 策略附加到 Lambda 的 IAM 角色

1.    打开 IAM 控制台

2.    在导航窗格中,选择角色

3.    选择创建角色

4.    在选择受信任实体的类型部分,选择 AWS 服务

5.    在选择将使用此角色的服务部分,选择 Lambda

6.    选择下一步: 权限

7.    在搜索栏中,输入您之前创建的策略的名称,然后选择该策略。

8.    选择下一步: 标签,然后创建一个可选 IAM 标签。

9.    选择下一步: 检查

10.    在角色名称中,输入角色名称。

11.    选择创建角色

创建 Lambda 函数并分配您创建的 IAM 角色

1.    打开 Lambda 控制台

2.    选择创建函数

3.    选择从头开始创建

4.    在名称中,输入 Lambda 函数的名称。

5.    在运行时中,选择 Node.js 10.x

6.    在执行角色中,选择使用现有角色

7.    在现有角色中,选择您之前创建的 IAM 角色。

8.    选择创建函数

创建第二个 SNS 主题和订阅以通知 Lambda 函数

1.    打开 Amazon SNS 控制台

2.    在导航窗格中,选择主题

3.    选择创建主题

4.    在名称中,输入主题名称。

5.    在显示名称中,输入显示名称。

6.    选择创建主题

7.    请记下您的主题的 ARN 以供稍后使用。

8.    选择创建订阅

9.    在主题 ARN 中,选择您在步骤 7 中记下的 SNS 主题 ARN。

10.    在协议中,选择 AWS Lambda

11.    在终端节点中,选择您创建的 Lambda 函数。

12.    选择创建订阅

使用发布到 SNS 主题的脚本更新 Lambda 函数

1.    打开 Lambda 控制台

2.    在导航窗格中,选择函数,然后选择您之前创建的函数。

3.    在函数代码部分,在编辑器窗格中输入以下脚本:

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);
    });
}

注意:请将 awsExampleSNSTopicARN 替换为您为电子邮件提醒创建的 SNS 主题的 ARN。

4.    在 Designer 视图中的添加触发器部分,选择 SNS

5.    在配置触发器部分,对于 SNS 主题,选择您创建的用于通知 Lambda 函数的 SNS 主题。

6.    选择添加

7.    选择保存

设置 AWS CloudFormation 堆栈,以将所有通知发送到可通知 Lambda 函数的 SNS 主题

1.    打开 AWS CloudFormation 控制台,按照设置向导中的步骤创建堆栈

2.    在通知选项中,选择现有的 Amazon SNS 主题

3.    选择您创建的用于通知 Lambda 函数的 SNS 主题。

4.    完成设置向导中的步骤来创建您的堆栈。

如果使用 AWS 命令行界面 (AWS CLI) 创建堆栈,请使用 --notification-arns 命令。此命令会将通知发送至 SNS 主题,通知 Lambda 函数。然后,将 SNS 主题的值设置为 SNS ARN。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?