📫
スポットインスタンスの停止通知をEventBridge+SNSで受け取る
やりたいこと
前回はFISを使ってスポットインスタンスを停止させました。
今回はその停止を通知としてメールで受信したいと思います。
スポットインスタンスの中断通知
スポットインスタンスが停止・終了する2分前に出される通知のことです。
この通知を受け取ることで、後続のアクションにつなげることが可能です。
今回の構成
前回の構成にEventBridgeとSNSを追加しました。
コード
前回使用したコードへEventBridgeとSNS分を追加しました。Terraformで再現可能です。
ポイント
通知されるイベント
スポットインスタンスの停止を検知すると以下のようなメールが送付されます。
どのようなイベントが送付されるの?はこちらで確認可能です。
time
でこのイベントが発行された時間が出力されます。
この時間の2分後にスポットインスタンスが落ちるというわけです。
SNSトピックでアクセスポリシーを設定する必要がある
EventBridgeとのやり取りを許可するためです。
terraformコードでいうとこちらです、events.amazonaws.com
のPublishを許可しています。
resource "aws_sns_topic_policy" "policy" {
arn = aws_sns_topic.topic.arn
policy = data.aws_iam_policy_document.sns_topic_policy.json
}
data "aws_iam_policy_document" "sns_topic_policy" {
statement {
effect = "Allow"
actions = ["SNS:Publish"]
principals {
type = "Service"
identifiers = ["events.amazonaws.com"]
}
resources = [aws_sns_topic.topic.arn]
}
}
こちらを明示的に設定しない場合、以下のようなアクセスポリシーが適用されていました。
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish",
"SNS:Receive"
],
"Resource": "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:spot-notice-topic",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "xxxxxxxxxxxx"
}
}
}
]
}
SNS:Publish
もあり、ぱっと見問題なさげに見えますが、どうやらCondition
句で引っかかるようです。
参考
Discussion