開始するには中途半端な時期だけど、今日から思い付き「AWS 100日チャレンジ」なるものを始めることにした。
ITではけっこう読まれている以下書籍に影響される取り組みです。
AWSサービスを使用して簡易の仕組みを100日続けて構築してみます。
AWSは経験2年目でまだ基本しかわかっていません。
技術力アップのためにも完了させたいです。
・100日続ける(休日まとめ投稿もあり)
・記事を読んでもらうことを目的とはしない(すいません、継続することを重視します。自己満です)
・社会人のため、風邪および業務によりキャンセルすることもある。
・核となるサービス以外は、CloudFormation(VPCやサブネット、EC2など)やすでに設定済のサービス(SNSなど)を利用して構築する。
課題
AWS ChatBotでAWS Healthイベントを検知してメールを送信する
実施 (キャプチャのみの場合もあり)
1.SNS(メール送信)を作成する(既存設定を利用)
2.Amazon EventBridge: AWS Healthイベントを検知し、SNSトピックへ渡すルール作成
3.メールが届くか検証
2.Amazon EventBridge: AWS Healthイベントを検知し、SNSトピックへ渡すルール作成
-
[Amazon EventBridge] コンソールを開き、[ルール] → [ルールを作成] をクリック。
-
名前: test-detect-aws-health-events
-
作成メソッド: 「イベントパターンを持つルール」。
-
イベントパターン:
-
イベントソース: AWSサービス
-
サービス名: Health
-
イベントタイプ: 特定のイベント(メンテナンス等)または「すべてのイベント」を選択。
-
-
ターゲットを選択:
-
ターゲットタイプ: AWSのサービス。
-
ターゲットを選択: SNSトピック。
-
トピック: ステップ1で作成したトピックを選択。
-
-
[作成] をクリック。

3.メールが届くか検証
Healthイベントは「AWS側の都合」で発生するものなので、残念ながらボタン一つで本物のイベントを発生させることはできない。
ということで、疑似的にイベントを発生させてみる。
■AWS CLI で「偽のイベント」を流し込む
CloudShellを起動する

以下コマンドを張り付け実行する
aws events put-events --entries '[
{
"Source": "my.test",
"DetailType": "AWS Health Event",
"Detail": "{\"eventArn\":\"arn:aws:health:ap-northeast-1::event/TEST\",\"service\":\"EC2\",\"eventTypeCode\":\"AWS_EC2_MAINTENANCE_SCHEDULED\",\"eventTypeCategory\":\"scheduledChange\",\"startTime\":\"2026-03-03T12:00:00Z\",\"eventDescription\":[{\"language\":\"en_US\",\"latestDescription\":\"This is a test notification.\"}]}",
"Resources": ["i-1234567890abcdef0"]
}
]'
結果
{
"FailedEntryCount": 0,
"Entries": [
{
"EventId": "126c848e-09e3-2dff-5e31-5838202b225d"
}
]
}
でもメールは飛ばない。
Geminiに聞くと、SNSトピック側の「アクセスポリシー」が設定が足りてないみたい.
SNSのアクセスポリシーに以下を追加する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow_EventBridge_Publish",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:あなたのアカウントID:トピック名"
}
]
}
それでも飛ばない
EventBridgeのイベントパターンを以下に書き換える
{
"detail-type": ["AWS Health Event"]
}

再度CloudShellから実行する
~ $ aws events put-events --entries '[
> {
> "Source": "my.test",
> "DetailType": "AWS Health Event",
> "Detail": "{\"eventArn\":\"arn:aws:health:ap-northeast-1::event/TEST\",\"service\":\"EC2\",\"eventTypeCode\":\"AWS_EC2_MAINTENANCE_SCHEDULED\"}"
> }
> ]' --region ap-northeast-1
{
"FailedEntryCount": 0,
"Entries": [
{
"EventId": "b5095eaa-1c0f-f020-8604-bf1964332e7c"
}
]
}
メールが飛んだ!

「本物のAWSからのイベント」ではないテスト用のEventBridgeのイベントパターンを設定することで、コマンドで実行したイベントを拾えたということらしい。
ここまでで2時間かかった。
疲れた。今日はこれまで。
