見出し画像

AWS BackUpでEC2のバックアップに失敗した時に、自分のslackに通知が来るようにする


要件

  • AWS BackUpで失敗した時に、自分のslakcに通知が来るようにする

今回作成するイメージの簡略図

タスク

  • AWS BackUpで失敗した時に、自分のslakcに通知が来るようにする

参考記事

▼いきなりterrafromで実装が難しければ、まずはここから!

学べること

  • AWS Backupの自動バックアップに失敗した時に、自分のslackに通知が来るようにする

  • terraformでSNSを立ち上げる方法

  • AWS BackとSNSの連携のやり方

  • SNS とlambdaの連携のやり方

  • lambdaとslackの連携のやり方

ヒント

main.tf

##########################################
# SNS
##########################################
# ------------------------------
# SNSトピックの作成
# ------------------------------
resource "aws_sns_topic" "main" {
  name       = "notification_of_AWSBackup_failure"
  fifo_topic = false
}


# ------------------------------
# aws_backupからSNSに通知するためのポリシー
# ------------------------------
data "aws_iam_policy_document" "sns_policy_document" {
  policy_id = "__default_policy_ID"

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

    effect = "Allow"

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

    resources = [
      aws_sns_topic.main.arn,
    ]

    sid = "__default_statement_ID"
  }
}

resource "aws_sns_topic_policy" "sns_policy" {
  arn    = aws_sns_topic.main.arn
  policy = data.aws_iam_policy_document.sns_policy_document.json
}


# ------------------------------
# Vaultと SNS topicの紐付け
# ------------------------------
resource "aws_backup_vault_notifications" "backup_vault_notification" {
  backup_vault_name   = aws_backup_vault.this.name
  sns_topic_arn       = aws_sns_topic.main.arn
  backup_vault_events = ["BACKUP_JOB_COMPLETED"]
}

# ------------------------------
# snsからlambdaに通知設定
# ------------------------------
resource "aws_sns_topic_subscription" "sns_to_subscription" {
  topic_arn     = aws_sns_topic.main.arn
  protocol      = "lambda"
  endpoint      = aws_lambda_function.sample_app.arn
  filter_policy = <<EOF
    {
      "State": [
        {
          "anything-but": "COMPLETED"
        }
      ]
    }
    EOF
}

# ------------------------------
# lambdaとSNSの紐付け
#  ------------------------------
resource "aws_lambda_permission" "main" {
  statement_id  = "AllowExecutionFromSNS"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.sample_app.arn
  principal     = "sns.amazonaws.com"
  source_arn    = aws_sns_topic.main.arn
}

ハマりポイント

以前の記事で、AWS Backupとlambdaをterraformを行ったが


今回行うのは、以下の2つの中間にSNSを入れとこの2つを繋げるのだが、このSNSがなかなか大変、、

AWS BackUp   =>  SNS  =>  lambda

関連タグ

#aws -backup #sns #ec2 #slack

この記事が気に入ったらサポートをしてみませんか?