AWS CloudFormation スタックが ROLLBACK_IN_PROGRESS 状態になったときに、E メールアラートを受信するにはどうすればよいですか?

最終更新日: 2019 年 6 月 19 日

スタックの作成中に AWS CloudFormation スタックが ROLLBACK_IN_PROGRESS 状態になったときに E メールを受信したいと考えています。こうした E メールアラートを設定するには、どうすればよいですか?

簡単な説明

解決方法セクションの手順を完了すると、通知は次のように機能するようになります。

  1. AWS CloudFormation スタックは、すべての通知を AWS Lambda 関数に通知する Amazon Simple Notification Service (Amazon SNS) トピックに送信します。
  2. Lambda 関数は通知を解析し、「ROLLBACK_IN_PROGRESS」通知だけを E メールアラート用に設定された 2 番目の Amazon SNS トピックに送信します。
  3. この 2 番目の SNS トピックが、「ROLLBACK_IN_PROGRESS」メッセージに関する E メールをサブスクライバーに送信します。

解決方法

SNS トピックと E メールアラートのサブスクリプションを作成する

1.    Amazon SNS コンソールを開きます。

2.    ナビゲーション ペインで、[Topics] を選択します。

注意: 既存のトピックを使用するには、リソースリストからそのトピックを選択し、手順 7 に進みます。

3.    [Create topic] を選択します。

4.    [Name] に、トピック名を入力します。

5.    [Display name] に、表示名を入力します。

6.    [Create topic] を選択します。

7.    後で使用するために、トピックの Amazon リソースネーム (ARN) をメモします。

8.    [Create subscription] を選択します。

9.    [Topic ARN] で、手順 7 でメモした SNS トピックの ARN を選択します。

10.    [Protocol] には [Email] を選択します。

11.    [Endpoint] に、E メールアドレスを入力します。

12.    [Create subscription] を選択します。

手順 11 で入力した E メールアドレスから、Amazon SNS のサブスクリプション確認の E メールが届きます。

13.    確認メールで [Confirm subscription] を選択します。

ブラウザにサブスクリプションの確認メッセージが表示されます。

Lambda が E メールアラート用に SNS トピックに発行できるようにする AWS Identity and Access Management (IAM) ポリシーを作成する

注意: このポリシーにより、Lambda は Amazon CloudWatch Logs に書き込むこともできます。

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで、[ポリシー] を選択します。

3.    [Create policy] を選択します。

4.    [JSON] タブを選択して、コードエディタで以下のコードを入力します:

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

注意: E メールアラート用に作成した SNS トピックの場合は、awsExampleSNSTopicARN を ARN に置き換えます。

5.    [Review policy] を選択します。

6.    [Name] に、ポリシー名を入力します。

7.    [Create policy] を選択します。

IAM ポリシーを Lambda の IAM ロールにアタッチする

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで、[Roles] を選択します。

3.    [Create role] を選択します

4.    [Select type of trusted entity] セクションで、[AWS service] を選択します。

5.    [Choose the service that will use this role] セクションで、[Lambda] を選択します。

6.    [Next: Permissions] を選択します。

7.    検索バーで、前に作成したポリシーの名前を入力し、そのポリシーを選択します。

8.    [Next:Tags] を選択してから、オプションの IAM タグを作成します。

9.    [Next: Review] を選択します。

10.    [Role name] に、ロール名を入力します。

11.    [Create role] を選択します

Lambda 関数を作成し、作成した IAM ロールを割り当てる

1.    AWS Lambda コンソールを開きます。

2.    [Create function] を選択します。

3.    [Author from scratch] を選択します。

4.    [Name] に、Lambda 関数の名前を入力します。

5.    [Runtime] で、[Node.js 10.x] を選択します。

6.    [Execution role] で、[Use an existing role] を選択します。

7.    [Existing role] で、前に作成した IAM ロールを選択します。

8.    [Create function] を選択します。

2 番目の SNS トピックとサブスクリプションを作成して、Lambda 関数に通知する

1.    Amazon SNS コンソールを開きます。

2.    ナビゲーション ペインで、[Topics] を選択します。

3.    [Create topic] を選択します。

4.    [Name] に、トピック名を入力します。

5.    [Display name] に、表示名を入力します。

6.    [Create topic] を選択します。

7.    後で使用するために、トピックの ARN をメモします。

8.    [Create subscription] を選択します。

9.    [Topic ARN] で、手順 7 でメモした SNS トピックの ARN を選択します。

10.    [Protocol] で、[AWS Lambda] を選択します。

11.    [Endpoint] で、作成した Lambda 関数を選択します。

12.    [Create subscription] を選択します。

SNS トピックに発行するスクリプトを使用して Lambda 関数を更新する

1.    AWS Lambda コンソールを開きます。

2.    ナビゲーションペインで、[Functions] を選択してから、前に作成した関数を選択します。

3.    [Function code] セクションで、エディタペインに以下のスクリプトを入力します:

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

注意: E メールアラート用に作成した SNS トピックの場合は、awsExampleSNSTopicARN を ARN に置き換えます。

4.    [Designer] ビューの [Add triggers] セクションで、[SNS] を選択します。

5.    [Configure triggers] セクションの [SNS topic] で、Lambda 関数に通知するために作成した SNS トピックを選択します。

6.    [Add] を選択します。

7.    [Save] を選択します。

Lambda 関数に通知する SNS トピックにすべての通知を送信するように AWS CloudFormation スタックを設定する

1.    AWS CloudFormation コンソールを開き、セットアップウィザードの手順に従って スタックを作成します。

2.    [Notification options] で、[Existing Amazon SNS topic] を選択します。

3.    Lambda 関数に通知するために作成した SNS トピックを選択します。

4.    セットアップウィザードの手順を完了して、スタックを作成します。

AWS コマンドラインインターフェイス (AWS CLI) を使用して スタックを作成している場合は、--notification-arns コマンドを使用して、Lambda 関数に通知する SNS トピックに通知を送信します。次に、SNS トピックの値を SNS ARN に設定します。