CloudFormationでAWS Personal Health Dashboardからの通知をSlackで受ける環境を（ほぼ）一発で準備する

# はじめに

AWSでは日々様々な理由でサービスのメンテナンスが行われ、その内容はAWS Personal Health Dashboard上で確認することができます。
ですが、複数AWSアカウントを管理しているプロダクトやチームでは各アカウントのAWS　Personal Health Dashboardを定期的に確認することは難しいかと思います。
そこで今回、（ほぼ）一発でAWS　Personal Health Dashboardからの通知をSlackチャンネルで受け取るためのCloudFormationテンプレートを作成しましたので、その内容についてご紹介します。

# 事前準備

まずCloudFromationスタックを作成する前に、通知したいSlack WorkSpaceと該当AWSアカウントのChatbotとの接続が必要となります。
詳しくはこちらをご参照ください。
https://docs.aws.amazon.com/chatbot/latest/adminguide/getting-started.html

またスタック作成時に接続したWorkSpaceIDと通知したいチャンネルのChannelIDが必要となります。事前にChatbotやSlackでの確認をお願いいたします。

# CloudFormationテンプレート

実際に作成したテンプレートは以下になります。

```yaml:template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Personal Health Dashboard to Slack Notice Resources'
Parameters:
  SlackWorkSpaceID:
    Type: 'String'
    Description: 'Slack WorkSpace ID'
  SlackChannelID:
    Type: 'String'
    Description: 'Slack Channel ID'

Resources:
  SNSTopic:
    Type: 'AWS::SNS::Topic'
    Properties:
      TopicName: !Sub '${AWS::StackName}-sns-topic'
  IAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: !Sub '${AWS::StackName}-iam-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service: 'chatbot.amazonaws.com'
            Action: 'sts:AssumeRole'
      Policies:
        - PolicyName: !Sub '${AWS::StackName}-iam-policy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'cloudwatch:Describe*'
                  - 'cloudwatch:Get*'
                  - 'cloudwatch:List*'
                Resource:
                  - '*'
  ChatbotSlackChannelConfiguration:
    Type: 'AWS::Chatbot::SlackChannelConfiguration'
    Properties:
      ConfigurationName: !Sub '${AWS::StackName}-chatbot-slack-channel-configuration'
      IamRoleArn: !GetAtt IAMRole.Arn
      LoggingLevel: 'INFO'
      SlackWorkspaceId: !Ref SlackWorkSpaceID
      SlackChannelId: !Ref SlackChannelID
      SnsTopicArns:
        - !Ref SNSTopic
  EventsRule:
    Type: 'AWS::Events::Rule'
    Properties:
      Name: !Sub '${AWS::StackName}-events-rule'
      Description: 'Personal Health Dashboard to Slack Notice'
      State: 'ENABLED'
      EventPattern:
        source:
          - 'aws.health'
      Targets:
        - Id: !Sub '${AWS::StackName}-events-to-sns'
          Arn: !Ref SNSTopic
```

EventsRuleでイベントパターンのsourceを`aws.health`と指定することにより、Personal Health Dashboardで発生したメンテナンスイベントをSNSに通知し、そこからChatbotを経由して確認しやすい形でSlackに通知する構成となっています。

# スタック作成

こちらのテンプレートをもとにCloudFromationでのスタック作成を行います。
作成時は事前に確認していたWorkSpaceIDとChannellIDを各パラメータ（`SlackWorkSpaceID`、`SlackChannelID`）に渡すようにしてください。

またスタック作成後はSNSからChatbotを経由してSlackに通知できるか、以下のようなメッセージをSNSに発行して通知が来るか確認しましょう。

```json
{
  "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": "ap-southeast-2",
  "resources": [],
  "detail": {
    "eventArn": "arn:aws:health:ap-southeast-2::event/AWS_ELASTICLOADBALANCING_API_ISSUE_90353408594353980",
    "service": "ELASTICLOADBALANCING",
    "eventTypeCode": "AWS_ELASTICLOADBALANCING_API_ISSUE",
    "eventTypeCategory": "issue",
    "startTime": "Sat, 04 Jun 2016 05:01:10 GMT",
    "endTime": "Sat, 04 Jun 2016 05:30:57 GMT",
    "eventDescription": [{
      "language": "en_US",
      "latestDescription": "A description of the event will be provided here"
    }]
  }
}
```

以下のようにSlackにポストされれば連携完了になります。
![notice-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146076/e325e861-3436-b075-f757-40988aeec9c5.png)

# おわりに

以上、今回はAWS Personal Health Dashboardからの通知をSlackで受ける環境をCloudFromationで準備しました。
手動で設定していくのもいいですが、複数アカウントあって繰り返し設定作業したくないという方に参考になれば幸いです。