こしあん
2024-12-13

Amazon Data Lifecycle Managerによるバックアップ自動化を試す


5{icon} {views}


Amazon Data Lifecycle Manager(DLM)を使用して、タグ付けしたEBSボリュームのスナップショットをTerraformで毎時自動取得する手順を解説します。

はじめに

Amazon Data Lifecycle Manager(DLM)を使って、EC2のEBSを自動バックアップすることを試してみました。具体的にはEC2のスナップショットを定期的に取得するものです。

やること

  • EC2を適当に1つ立てて、ルートボリュームとアタッチした別のボリュームを1時間ごとにスナップショット取る
  • スナップショットは増分バックアップなので、S3のバージョニングのような容量やばいことにはならないはず

Terraformのコード

  • ルートボリュームと別のボリュームの2個のEBSを作成
  • それぞれにBackup = "true"というタグを付与し、これを自動スナップショットの条件とする
  • スケジュールの意味は、UTCの19:45を開始地点とし、1時間毎にスナップショットをとり、12個まで保持する意味
  • DLMのバックアップ判定基準の一つにタグがあるので、バックアップ対象これを付与するのがわかりやすい
  • ポリシーのResourceが*になっているのが気になるが、権限絞ろうと思ったらいろいろエラー出てだるくなったのでやめた。その気になればもう少し絞れると思う

# EC2インスタンスの作成
resource "aws_instance" "example" {
  ami                         = var.ami_id
  instance_type               = "t3.micro"
  subnet_id                   = var.subnet_id
  associate_public_ip_address = false

  # EC2にもタグ付与
  tags = {
    Backup = "true"
  }

  # ルートボリュームの設定
  root_block_device {
    volume_size = 10
    volume_type = "gp3"

    tags = {
      Backup = "true"
    }    
  }
}

# IAMロールの作成(DLM用)
resource "aws_iam_role" "dlm_role" {
  name = "DLMServiceRole"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "dlm.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
}

# IAMポリシーのアタッチ(DLMに必要な権限)
data "aws_caller_identity" "current" {}

data "aws_region" "current" {}

resource "aws_iam_role_policy" "dlm_policy" {
  name = "DLMPolicy"
  role = aws_iam_role.dlm_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "ec2:CreateSnapshot",
          "ec2:DeleteSnapshot",
          "ec2:DescribeVolumes",
          "ec2:DescribeSnapshots",
          "ec2:CreateTags"
        ]
        Resource = "*"
      }
    ]
  })
}


# DLMライフサイクルポリシーの作成
resource "aws_dlm_lifecycle_policy" "ebs_snapshot_policy" {
  description = "Policy to take EBS snapshot every hour"

  execution_role_arn = aws_iam_role.dlm_role.arn

  state = "ENABLED"

  policy_details {
    resource_types = ["VOLUME"]

    target_tags = {
      Backup = "true"
    }

    schedule {
      name = "HourlySnapshots"

      create_rule {
        interval      = 1
        interval_unit = "HOURS"
        times = [ "19:45" ]
      }

      retain_rule {
        count = 12 # 12時間分のスナップショットを保持
      }
    }
  }
}

# 追加のEBSボリューム
resource "aws_volume_attachment" "ebs_attach" {
  device_name = "/dev/sdh"
  volume_id   = aws_ebs_volume.additional_volume.id
  instance_id = aws_instance.example.id
}

# EBSボリュームにタグを付与(DLMポリシー対象にするため)
resource "aws_ebs_volume" "additional_volume" {
  availability_zone = aws_instance.example.availability_zone
  size              = 8
  type              = "gp3"

  tags = {
    Backup = "true"
  }
}

作成されたスナップショット

ほぼ1時間ごとにできている



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です