📫

スポットインスタンスの停止通知をEventBridge+SNSで受け取る

2023/06/08に公開

やりたいこと

前回はFISを使ってスポットインスタンスを停止させました。
今回はその停止を通知としてメールで受信したいと思います。

スポットインスタンスの中断通知

スポットインスタンスが停止・終了する2分前に出される通知のことです。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html#instance-action-metadata

この通知を受け取ることで、後続のアクションにつなげることが可能です。

今回の構成

前回の構成にEventBridgeとSNSを追加しました。

コード

前回使用したコードへEventBridgeとSNS分を追加しました。Terraformで再現可能です。
https://github.com/not75743/FIS-Terminate-SpotInstance

ポイント

通知されるイベント

スポットインスタンスの停止を検知すると以下のようなメールが送付されます。

どのようなイベントが送付されるの?はこちらで確認可能です。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html#instance-action-metadata

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句で引っかかるようです。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-use-resource-based.html#eb-sns-permissions

参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html
https://www.yamamanx.com/spot-instance-action-sns/
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-27_AWS_Summit_Online_2020_CMP01.pdf

Discussion