はじめに
AWSを利用していると、サービスの障害情報を迅速に把握することが非常に重要です。本記事では、AWSの障害情報をSlackに通知する仕組みを、CloudFormationを使って構築する方法を紹介します。この仕組みを導入することで、障害発生時に対応することが可能となり、システムの信頼性を向上させることができます。
以下が今回紹介するCloudFormationテンプレートのコードです。このテンプレートを使用することで、AWS HealthDashboardからの障害情報をSNSトピックを通じてSlackに通知する設定を自動で行うことができます。
AWSTemplateFormatVersion: 2010-09-09
Description: AWS-health-check
Resources:
# Chatbot
HealthCheckChatbot:
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: health_notification
SlackChannelId: "**********"
SlackWorkspaceId: "**********"
IamRoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/chatbot-role
GuardrailPolicies:
- !Sub arn:aws:iam::${AWS::AccountId}:policy/guardrail-role
SnsTopicArns:
- !Ref HealthCheckTopic
# SNS Topic
HealthCheckTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: health_notification
KmsMasterKeyId: "alias/key-sns"
HealthCheckTopicPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
Topics:
- !Ref HealthCheckTopic
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "events.amazonaws.com"
Action: "sns:Publish"
Resource: !Ref HealthCheckTopic
Condition:
ArnEquals:
aws:SourceArn: !Sub arn:aws:events:ap-northeast-1:${AWS::AccountId}:rule/eventbridge_cloudformation
HealthCheckTopicSubscription:
Type: AWS::SNS::Subscription
Properties:
Endpoint: https://global.sns-api.chatbot.amazonaws.com
Protocol: HTTPS
TopicArn: !Ref HealthCheckTopic
# EventBridge
HealthCheckEventRule:
Type: AWS::Events::Rule
Properties:
Name: health_notification
EventPattern:
source:
- "aws.health"
detail-type:
- "AWS Health Event"
State: ENABLED
Targets:
- Arn: !Ref HealthCheckTopic
Id: "HealthCheckTarget"
各リソースの説明
HealthCheckChatbot
このリソースはAWS Chatbotを設定し、Slackのチャンネルに通知を送るための設定を行います。SlackChannelIdとSlackWorkspaceIdはご自身のSlackワークスペースの情報を入力してください。
また、IamRoleArnにはAWS Chatbotが使用するIAMロールを指定します。
HealthCheckTopic
SNSトピックを作成します。このトピックがAWS HealthDashboardからの通知を受け取り、Slackに転送する役割を担います。
HealthCheckTopicPolicy
このリソースはSNSトピックに対するポリシーを設定し、Amazon EventBridgeがSNSトピックにメッセージを発行できるようにします。
HealthCheckTopicSubscription
SNSトピックに対するサブスクリプションを作成します。エンドポイントとしてAWS ChatbotのAPIを指定し、通知をSlackに送信します。
HealthCheckEventRule
EventBridgeのルールを設定し、AWS HealthからのイベントをキャッチしてSNSトピックに送信します。
KMSの設定
SNS Topic内で設定するKMSキーは、デフォルトのAWS マネージド型キーだと権限が足りないためEventBridgeからメッセージを受信することができません。
そのため、カスタマー管理型のキーを作成する必要があります。
KmsMasterKeyId: "alias/key-sns"
具体的にどんな権限が必要かというと
{
"Sid": "Allow Eventbirdge",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "*"
}
さいごに
無料のAWSアカウントだと障害情報の通知が届かないので気をつけてください。