當我的 AWS CloudFormation 堆疊進入 ROLLBACK_IN_PROGRESS 狀態時,如何收到電子郵件警示?

3 分的閱讀內容
0

當我的 AWS CloudFormation 堆疊在堆疊建立期間進入 ROLLBACK_IN_PROGRESS 狀態時,我想要收到電子郵件警示。

簡短說明

完成解決方法一節的步驟後,您可以預期通知的運作方式如下:

  1. 您的 AWS CloudFormation 堆疊會將所有通知傳送至通知 AWS Lambda 函數的 Amazon Simple Notification Service (Amazon SNS) 主題。
  2. Lambda 函數會剖析通知,並僅將 「ROLLBACK_IN_PROGRESS」 通知傳送至針對電子郵件提醒設定的第二個 Amazon SNS 主題。
  3. 關於 「ROLLBACK_IN_PROGRESS 訊息」,第二個 SNS 主題會傳送電子郵件給訂閱用戶。

解決方法

建立 SNS 主題和電子郵件提醒的訂閱

1.    開啟「 Amazon SNS 主控台」。

2.    在瀏覽窗格中,選擇「 主題」。

**注意:**若要使用現有主題,請從資源清單中選取該主題,然後跳至步驟 7。

3.    選擇「 建立主題」。

4.    針對「 名稱」,請輸入主題名稱。

5.    針對「 顯示名稱」,請輸入顯示名稱。

6.    選擇「 建立主題」。

7.    請備註您的主題的 Amazon Resource Name (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.    在「 設計師」檢視的「 新增觸發條件 」區段中,選擇「 SNS」。

5.    在「 設定觸發條件」區段中,針對「 SNS 主題」,請選擇您建立的 SNS 主題以通知 Lambda 函數。

6.    選擇「 新增」。

7.    選擇「 儲存」。

設定您的 AWS CloudFormation 堆疊,以便將所有通知傳送至通知 Lambda 函數的 SNS 主題

1.    開啟「 AWS CloudFormation 主控台,然後依照設定精靈中的步驟「 建立堆疊」。

2.    針對「 通知選項」,請選擇「 現有 Amazon SNS 主題」。

3.    選擇您建立的 SNS 主題以通知 Lambda 函數。

4.    完成設定精靈中的步驟以建立您的堆疊。

如果您使用 AWS Command Line Interface (AWS CLI) 建立堆疊,請使用 --notification-arns 命令。此命令會將通知傳送至通知 Lambda 函數的 SNS 主題。然後,將 SNS 主題的值設定為 SNS ARN。


相關資訊

範本程式碼片段

範本剖析

AWS CloudFormation 最佳實務

AWS 官方
AWS 官方已更新 4 年前