[小ネタ]TerraformでEC2作成とAWS Backupの設定を同時にやってみた

EC2のBackupは何かとやっておいたほうが安心です。TerraformでEC2作成のタイミングでAWS Backupの設定もやってみました。
2020.04.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんばんわ。コンサル部の島川です。

EC2のBackupは何かとやっておいたほうが安心だと思います。初期のタイミングのほうが良いということで、今回はTerraformを使ってEC2の作成とAWS Backupの設定を同時にやってみました。なお初期設定のみでリストアについては触れておりません。

Terraformのコード

本来であればec2.tfbackup.tfのようにコードを分けたほうが見やすいですが、同時にやってる感を出すために今回は1つのファイルにまとめました。各セクションに分けて説明します。

main.tf

//----------
//variable
//----------

variable ec2_name {
  default = "hoge-server"
}

//----------
//EC2 config
//----------
data aws_ssm_parameter amzn2_ami_latest {
  name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}

module "hoge-server" {
  source                 = "terraform-aws-modules/ec2-instance/aws"
  version                = "~> 2.0"

  name                   = var.ec2_name
  instance_count         = 1

  ami                    = data.aws_ssm_parameter.amzn2_ami_latest.value
  instance_type          = "t3.micro"
  key_name               = "ec2testkey"
  monitoring             = false
  vpc_security_group_ids = ["sg-***"]
  subnet_id              = "subnet-***"
  //private_ip             = ""

  ebs_optimized          = true

  root_block_device = [
    {
      delete_on_termination = true
      encrypted             = true
      iops                  = 60
      kms_key_id            = ""
      volume_size           = 20
      volume_type           = "gp2"
    },
  ]
  tags = {
    Name            = var.ec2_name
  }
}

//----------
//AWS Backup config
//----------
resource "aws_backup_vault" "this" {
  name        = var.ec2_name
  kms_key_arn = "arn:aws:kms:ap-northeast-1:123456789012:key/***"
}

resource "aws_backup_plan" "this" {
  name = format("%s-backup-plan", var.ec2_name)

  rule {
    rule_name         = format("%s-backup-rule", var.ec2_name)
    target_vault_name = aws_backup_vault.this.name
    schedule          = "cron(0 12 * * ? *)"
    lifecycle {
      delete_after = 7
    }
  }
}

resource "aws_backup_selection" "this" {
  iam_role_arn = "arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole"
  name         = format("%s-backup-selection", var.ec2_name)
  plan_id      = aws_backup_plan.this.id

  resources = [
    module.hoge-server.arn.0
  ]
}

variable

  • ec2の名前やbackup planなど複数回使いまわすためここで変数を作成

EC2 config

  • セキュリティグループとサブネットは既に作成済みでIDを直接指定
  • AMIはパラメータストアから取得
    • AmazonLinux2の最新版
  • EC2はTerraform Module Registoryのterraform-aws-ec2-instanceを使用

AWS Backup config

  • バックアップボールト
    • KMSはAWS マネージドキーを指定
  • バックアッププラン
    • cron式で毎日12:00(UTC)で実行するように設定
    • 作成後1週間で有効期限を切れるように設定
  • リソースの割り当て
    • ロールはデフォルトのものを指定「AWSBackupDefaultServiceRole」
    • 作成したEC2を指定(複数のインスタンスを作成した場合は追加する必要あり)

実行

terraform apply」コマンドで実行します。

作成されました。

さいごに

Terraformで作成することによりBackupの設定をすぐに変更することも可能です。またこれをテンプレートとして使うことでとりあえずBackupしておくが叶えられます。誰かの参考になれば幸いです。