TerraformでAWS Backupジョブの通知設定を行う

AWS Backupの通知設定についてTerraformのサンプルコードを紹介します
2022.11.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ネクストモードの南です。

先日AWS Backupの通知設定をTerraformで作成する機会がありました。

現状、AWS Backupのジョブをモニタリングする場合、以下の3パターンがあります。

  1. AWS BackupのメトリクスをCloudWatchアラームでモニタリングし、SNSに通知する
  2. AWS BackupのイベントをEventBridgeで検知し、SNSに通知する
  3. AWS Backup通知APIからSNSに通知する

この中で3.のパターンについてはAWS CLIから設定をする必要がありますが、今回はなるべくTerraformで構成管理をするという要件があったので見送りました。
(3.のパターンについてはこちらの公式ドキュメントをご参考ください。)

1.と2.のパターンについては検証も兼ねてTerraformで作成をしてみましたので、以下に紹介させていただきます。

構成とサンプルコード

パターン1 CloudWatchアラームから通知

CloudWatchアラームでAWS Backupに関するメトリクスをモニタリングし、閾値を超過した場合にSNSに通知する構成です。

今回はバックアップジョブの失敗が発生した場合に検知をするという想定で、NumberOfBackupJobsFailedを対象のメトリクスにし、しきい値は1以上と指定しています。 また、ディメンションはバックアップボールド(BackupVaultName)としていますが、リソースタイプ(ResourceType)を指定することも可能です。
AWS Backupで取得可能なメトリクスの情報については、以下の公式ドキュメントをご参照ください。

サンプルコードはこちらになります。

cwalarm.tf

resource "aws_cloudwatch_metric_alarm" "NumberOfBackupJobsFailed-backup" {
  alarm_name          = "NumberOfBackupJobsFailed-backup"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = 1
  metric_name         = "NumberOfBackupJobsFailed"
  namespace           = "AWS/Backup"
  period              = 300
  statistic           = "Sum"
  threshold           = 1
  treat_missing_data  = "missing"
  datapoints_to_alarm = 1
  dimensions = {
    BackupVaultName = "test-backup-vault"
  }
  actions_enabled = "true"
  alarm_actions   = ["sns topic arn"]
}

実際の通知内容は以下のようになります。
こちらのパターンではジョブの数をモニタリングしているため、具体的にどのリソースやジョブが失敗したのかまでは通知内容から読み取ることはできません。
対象のジョブの詳細な情報まで通知したい場合にはパターン2の方をご検討ください。

  • メール通知
  • Chatbot

パターン2 EventBridgeから通知

AWS BackupのイベントをEventBridgeからSNSに通知する構成です。

パターン1と同様にバックアップジョブの失敗が発生した場合に検知をする想定でサンプルコードを記載しています。
以下の公式ドキュメントでAWS Backupでモニタリング可能なイベントの一覧やサンプルのペイロードが紹介されていますので、要件に合わせてカスタマイズをしてください。イベントの場合はAWS Backupジョブの状態変更だけでなく、Backup Vaultの設定やリージョン設定の変更についてもモニタリングすることが可能ですので、より柔軟にモニタリングの要件に対応することが可能です。

サンプルコートは以下となります。

eventbridge.tf

resource "aws_cloudwatch_event_rule" "backup-event-rule" {
  name           = "backup-event-rule"
  event_bus_name = "default"

  tags = {
    Name = "backup-event-rule"
  }

  event_pattern = <<EOF
{
  "source": ["aws.backup"],
  "detail-type": ["Backup Job State Change"],
  "detail": {
    "state": ["FAILED"]
  }
}
EOF
}

resource "aws_cloudwatch_event_target" "backup-event-target" {
  rule           = aws_cloudwatch_event_rule.backup-event-rule.name
  arn            = "sns topic arn"
  event_bus_name = "default"
}

また、TerraformでEventBridgeのターゲットにSNSトピックを設定する場合、SNSトピック側にアクセスポリシーの許可設定を追加する必要があります。(マネジメントコンソールで設定する場合は自動で補完してくれますが、TerraformやSDKで設定する場合はケアする必要が生じます。)
ご参考までにSNSトピックのアクセスポリシーの許可設定のサンプルも記載します。

  • 参考:SNSトピックのアクセスポリシー設定

sns.tf

resource "aws_sns_topic" "topic_1" {
  name         = "sns-test-topic1"
  display_name = "sns-test-topic1"

}

resource "aws_sns_topic_policy" "default" {
  arn    = aws_sns_topic.topic_1.arn
  policy = data.aws_iam_policy_document.sns_topic_policy.json
}

data "aws_iam_policy_document" "sns_topic_policy" {
  policy_id = "__default_policy_ID"
  version = "2008-10-17"

  statement {
    actions = [
      "SNS:GetTopicAttributes",
      "SNS:SetTopicAttributes",
      "SNS:AddPermission",
      "SNS:RemovePermission",
      "SNS:DeleteTopic",
      "SNS:Subscribe",
      "SNS:ListSubscriptionsByTopic",
      "SNS:Receive",
      "SNS:Publish",
    ]

    condition {
      test     = "StringEquals"
      variable = "AWS:SourceOwner"
      values = [
        "AWS Account ID",
      ]
    }

    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    resources = [
      aws_sns_topic.topic_1.arn,
    ]

    sid = "__default_statement_ID"
  }

  statement {
    actions = [
      "SNS:Publish",
    ]

    effect = "Allow"

    principals {
      type        = "Service"
      identifiers = ["events.amazonaws.com"]
    }

    resources = [
      aws_sns_topic.topic_1.arn,
    ]

    sid = "AWSEvents_Allow"
  }
}

実際の通知内容としては以下のようになります。
イベントの場合は対象リソースのarnなど、ジョブの詳細な情報を通知することができます。
どのような情報を通知したいかによって、パターン1とパターン2のどちらを採用するかご検討ください。

  • メール通知
  • Chatbot

参考

AWS BackupのイベントとメトリクスがCloudWatchで利用可能になったので検証してみた
AWS Backup -CloudWatchを使用したメトリクスのモニタリング
AWS Backup -EventBridgeを使用してイベントをモニタリングする
EventBridgeからSNSに通知ができなくてハマった話

ネクストモードについて

ネクストモード株式会社は東日本電信電話株式会社とクラスメソッド株式会社で設立したクラウドカンパニーです。「クラウドであたらしい働き方を」というメッセージを掲げ、さまざまなクラウド技術や製品を組み合わせて企業の働き方の当たり前を変えていくことを目指しています。クラウドやSaaSのご利用に関してお困りごとがあれば、ネクストモードまでぜひお問い合わせください。