Amazon Data Lifecycle Managerによるバックアップ自動化を試す
Posted On 2024-12-13
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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー