システム運用では、通知が常に届くと便利な反面、「夜間は不要な通知を止めたい」「営業時間だけ通知を受けたい」といったニーズがよくあります。
今回の記事では、Amazon SNSのサブスクリプションフィルターと、EventBridgeスケジュールを組み合わせて、「時間帯によって通知をする/しない」を切り替える仕組みを紹介します。
SNS通知をON/OFFするハンズオン
前提条件
今回のハンズオンの前提条件は以下の通りです。
- AWSアカウントを持っていること
- マネジメントコンソールにログインできること
- SNSトピックとサブスクリプション(メールアドレス)がすでに存在していること
- IAM権限:
SNS:Publish
、SNS:SetSubscriptionAttributes
、EventBridge:PutRule
を実行できること - EventBridgeの実行ロールは以下を参照
●信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
●許可ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sns:SetSubscriptionAttributes",
"Resource": "*"
}
]
}
■1. 通知先サブスクリプションの確認
前提条件に書きましたトピックとサブスクリプションの確認をしておきます。
↓AWSマネジメントコンソールでAmazon SNSを開きます。
↓対象トピックを選択し、サブスクリプション一覧を表示
↓
↓Subscription ARNを控えておいてください。
↓CloudShellを起動し、以下のCLIコマンドで通知されるか確認します。
aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:MyTopic \
--message "test message"
↓
↓現在の設定では、通知されることが確認できました。
確認は以上です。
■2. EventBridgeスケジュールを作成(通知OFF)
つぎに、通知をOFFにするためのEventBridgeスケジュールを作成します。
↓AWSマネジメントコンソールでEventBridgeを開き、スケジュールのページにアクセスします。
↓
↓「スケジュールを作成」をクリックします。
↓時間を通知を止めたい時間に設定
↓ターゲットでAmazon SNSを指定し、↓APIアクションはSetSubscriptionAttributes
を選択します。
↓
↓入力パラメータに「全ブロック」のポリシーを設定する記述を入力します。
{
"SubscriptionArn": "<SUBSCRIPTION_ARN>",
"AttributeName": "FilterPolicy",
"AttributeValue": "{ \"_blackhole\": [\"never\"] }"
}
入力が完了しましたら、作成をクリックします。
通知OFF用のスケジュールの作成は完了です。
■3. EventBridgeスケジュールを作成(通知ON)
↓上記と同様にスケジュールを作成
↓入力パラメータに以下を設定
{
"SubscriptionArn": "<SUBSCRIPTION_ARN>",
"AttributeName": "FilterPolicy",
"AttributeValue": "{}"
}
↓
構築は以上です。
動作テスト
動作確認をしていきましょう。
流れとしては、
- 13:10 : 通知OFFとするためにサブスクリプションフィルターに無効なjsonを設定
- 13:11~13:14 : メッセージを通知し、届かないことを確認
- 13:15 : 通知ONとするためにサブスクリプションフィルターに全てを許可する設定
- 13:16~ : メッセージを通知し、届くことを確認
■1. 通知OFF設定確認
時間になりましたので、サブスクリプションフィルターを確認してみます。
↓
フィルターが{ "_blackhole": ["never"] }
の場合、通知が届かない設定です。
設定されていますね。
■2. 通知されないこと確認
CloudShellでSNSトピックに対し、通知発行のアクションを実行します。
aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:MyTopic \
--message "test message"
↓
数分待ちましたが、メールは届きません。
■3. 通知ON設定確認
つづいて、通知ONとなる時間になりましたので、サブスクリプションフィルターを確認してみます。
こちらも設定が変更されていますね。
■4. 通知されること確認
再度、CloudShellでSNSトピックに対し、通知発行のアクションを実行します。
aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:MyTopic \
--message "test message"
↓メールが届きました。
今回のハンズオンは以上です。
■補足. CloudWatchメトリクスで確認
SNSトピックのメトリクスに「NumberOfNotificationsFilteredOut」が増えていれば、配信がフィルターされていることが確認できます。
↓通知をOFFにした後の配信直後にメトリクスを確認してみると、"1"の箇所に点が記録されていますね。
まとめ
SNSサブスクリプションフィルターポリシーとEventBridgeスケジュールを組み合わせれば、時間帯による通知ON/OFFが実現できます。Lambdaを使わないため、AWS初心者でも簡単に導入できる仕組みです。無駄な通知を減らし、運用負荷低減に活用してみてください。
参考リンク: AWS公式ドキュメント
↓ほかの協栄情報メンバーもIAMデータベース認証についての記事を公開しています。ぜひ参考にしてみてください。
■Amazon EventBridgeでセキュリティグループの変更を検知してみる(齊藤弘樹)