はじめに
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テンプレート
実際に作成したテンプレートは以下になります。
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に発行して通知が来るか確認しましょう。
{
"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"
}]
}
}
おわりに
以上、今回はAWS Personal Health Dashboardからの通知をSlackで受ける環境をCloudFromationで準備しました。
手動で設定していくのもいいですが、複数アカウントあって繰り返し設定作業したくないという方に参考になれば幸いです。