継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Personal Health Dashboard の通知を Slackに投稿する

タダです.

AWS のサービスの状態やメンテナンス情報を知るために Personal Health Dashboard(以下 PHD) を使うのは有効です.PHDは通常 AWS マネジメントコンソール上から確認できますが,今回は PHD の通知を Slack に自動投稿するための設定方法を紹介します.

PHD の通知を受け取る方法

PHD の通知を受け取るには CloudWatch Events を使います.イベントソースパターンでサービス名に Health,イベントタイプを すべてのイベント に設定します.ターゲットに SNS を指定します.これで PHD からのすべての通知が SNS で設定したプロトコル(例 Eメール等)利用者に通知できます.

f:id:sadayoshi_tada:20200308150229p:plain

なお,PHD の CloudWatch Events は次の JSON 形式で通知があるため通知内容をカスタマイズしたい場合は別途 Lambda 等を挟む必要があります.この記事ではデフォルトの通知内容で設定を進めます.

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2016-06-05T06:27:57Z",
  "region": "us-west-2",
  "resources": [
    "i-abcd1111"
  ],
  "detail": {
    "eventArn": "arn:aws:health:us-west-2::event/AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED_90353408594353980",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED",
    "eventTypeCategory": "issue",
    "startTime": "Sat, 05 Jun 2016 15:10:09 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "i-abcd1111",
        "tags": {
          "stage": "prod",
          "app": "my-app"
        }
      }
    ]
  }
}

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Abuse Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2018-08-01T06:27:57Z",
  "region": "global",
  "resources": [
    "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111",
    "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd2222"
  ],
  "detail": {
    "eventArn": "arn:aws:health:global::event/AWS_ABUSE_DOS_REPORT_92387492375_4498_2018_08_01_02_33_00",
    "service": "ABUSE",
    "eventTypeCode": "AWS_ABUSE_DOS_REPORT",
    "eventTypeCategory": "issue",
    "startTime": "Wed, 01 Aug 2018 06:27:57 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
      },
      {
        "entityValue": "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd2222"
      }
    ]
  }
}

AWS Chatbot での Slack の連携設定

もう一歩踏み込んで Slack 通知の設定を行いましょう.AWS では Slack と連携可能な「AWS Chatbot」があります.現在ベータ版のサービスです.なお,AWS Chatbot は Slack の他に Amazon Chime とも連携可能です.

AWS Chatbot では PHD イベント(Health イベント) を受け取ることができるので今回活用します.

Q: AWS Chatbot を使うとどのような通知を受け取ることができますか? AWS Chatbot を使用すると、CloudWatch アラーム、Health イベント、Security Hub の検出結果、Budgets アラート、CloudFormation スタックイベントに関する通知を受け取ることができます。

aws.amazon.com

AWS Chatbot で Slack 連携するメリットは次の2点があると考えます.1つは 上記のように PHD のイベントを受け取るように対応したサービスであることです.2つ目は料金の観点でのメリットです.AWS Chatbot 登場以前は Slack の Eメールアプリを使っていたかと思いますが,Slack の Eメールアプリはスタンダードプランまたはプラスプランじゃないと使えないのですが,AWS Chatbot はプランを気にせず Slack 連携できるのもメリットです.

slack.com

AWS Chatbot 設定

1. Slack との連携承認

サービス画面から順次設定していきます.まずは Slack との連携承認を行います.

チャットクライアントに Slack を設定して連携先のワークスペースと連携承認を行います. f:id:sadayoshi_tada:20200308153210p:plain f:id:sadayoshi_tada:20200308153207p:plain

設定完了したら次に「新しいチャネル設定」をクリックします. f:id:sadayoshi_tada:20200308153202p:plain

2. チャネル設定

チャネル設定の詳細をさらっていきます.

最初にチャネル名と Slack の通知チャンネルを指定します. f:id:sadayoshi_tada:20200308153155p:plain

次に,IAM ロールの作成を行います.デフォルト設定で作ります. f:id:sadayoshi_tada:20200308153151p:plain

IAM ポリシーは次の内容で自動生成されます. CloudWatch に関するものですね.

カスタム管理ポリシー: AWS-Chatbot-NotificationsOnly-Policy-乱数

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:Describe*",
                "cloudwatch:Get*",
                "cloudwatch:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

信頼関係ポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "chatbot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

そして,SNS 通知設定を行います.AWS Chatbot はSNS からの通知との統合可能なので PHD の CloudWatch Events で設定したターゲットの SNS を設定して準備完了です. f:id:sadayoshi_tada:20200308153146p:plain

指定した SNS トピックのサブスクリプションAWS Chatbot の設定が入っています. f:id:sadayoshi_tada:20200308153142p:plain

3. テストイベントによる動作確認

以上で PHD の通知を Slack に通知する設定が完了しました.最後に次のサンプルイベントを SNS 通知してみましょう.SNS のメッセージにサンプルイベントを入れて送信してみます.

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2016-06-05T06:27:57Z",
  "region": "us-west-2",
  "resources": [
    "i-abcd1111"
  ],
  "detail": {
    "eventArn": "arn:aws:health:us-west-2::event/AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED_90353408594353980",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED",
    "eventTypeCategory": "issue",
    "startTime": "Sat, 05 Jun 2016 15:10:09 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "i-abcd1111",
        "tags": {
          "stage": "prod",
          "app": "my-app"
        }
      }
    ]
  }
}

f:id:sadayoshi_tada:20200308160437p:plain

Slack の指定したチャンネルにポストされました!アカウント番号,リージョンのほかに影響あるリソースもカスタマイズ不要で自動でいい感じに通知されています.

f:id:sadayoshi_tada:20200308160500p:plain

まとめ

PHD の通知を AWS Chatbot で Slack 連携してみました.AWS Chatbot のおかげでノーコーディングで Slack への通知ができました.Slack を使っていて AWS Chatbot で対応しているイベントを拾いたい場合,運用中のシステムに関連するイベントは感知しやすくすると良いと感じました.AWS Chatbot を初めて使いましたが積極的に使いたいです.