【Terraform】EC2のバックアップをAWS Backupで取る

タイトル通りですね。

Terraform v0.12.25

Terraformを使って、既に構築済みのEC2インスタンスのバックアップを設定します。

下記のtfファイルで設定できました。

resource "aws_backup_plan" "test" {
  name = "test-backup"
  rule {
    rule_name = "test-backup-rule"
    target_vault_name = aws_backup_vault.test.name
    schedule = "cron(05 18 * * ? *)"
    lifecycle {
      delete_after = 35
    }
  }
}

resource "aws_backup_vault" "test" {
  name = "test-backup-vault"
}

resource "aws_backup_selection" "test" {
  iam_role_arn = aws_iam_role.test-backup.arn
  name = "test-backup-selection"
  plan_id = aws_backup_plan.test.id
  resources = [
    aws_instance.instance_a.arn,
    aws_instance.instance_b.arn,
    aws_instance.instance_c.arn,
  ]
}

data "aws_iam_policy_document" "aws_backup_ec2_role" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type = "Service"
      identifiers = ["backup.amazonaws.com"] 
    }
  }
}

resource "aws_iam_role" "test-backup" {
  name = "test-backup"
  assume_role_policy = data.aws_iam_policy_document.aws_backup_ec2_role.json
}

resource "aws_iam_role_policy_attachment" "test" {
  role = aws_iam_role.test-backup.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup"
}

上記のtfファイルで実施している内容について簡単に上から書いておきます。

①バックアッププランを作成し、ルールにてターゲットvaultとスケジュールとライフサイクルを定義。cronはUTCで定義が必要です(JST18:05以降に走るよう設定)。

resource "aws_backup_plan" "test" {
  name = "test-backup"
  rule {
    rule_name = "test-backup-rule"
    target_vault_name = aws_backup_vault.test.name
    schedule = "cron(05 18 * * ? *)"
    lifecycle {
      delete_after = 35
    }
  }
}

②ターゲットvaultを定義(名前だけ)。vaultって何?って感じですが、グループ的なものと捉えてます。

resource "aws_backup_vault" "test" {
  name = "test-backup-vault"
}

③バックアップセレクションで、バックアッププランとバックアップ対象、IAMロールの紐付けを定義。今回はバックアップ対象を、インスタンス3つにしてます。

resource "aws_backup_selection" "test" {
  iam_role_arn = aws_iam_role.test-backup.arn
  name = "test-backup-selection"
  plan_id = aws_backup_plan.test.id
  resources = [
    aws_instance.instance_a.arn,
    aws_instance.instance_b.arn,
    aws_instance.instance_c.arn,
  ]
}

④後は、iam_policy_documentとiam_role、iam_role_policy_attachmentでIAMの定義ですね。

data "aws_iam_policy_document" "aws_backup_ec2_role" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type = "Service"
      identifiers = ["backup.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "test-backup" {
  name = "test-backup"
  assume_role_policy = data.aws_iam_policy_document.aws_backup_ec2_role.json
}

resource "aws_iam_role_policy_attachment" "test" {
  role = aws_iam_role.test-backup.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup"
}

IAMあたりがまだ慣れないですが、結構簡単に実現できますねー