タイトル通りですね。
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あたりがまだ慣れないですが、結構簡単に実現できますねー