TerraformでRDS Auroraクラスタのリストアをする

TerraformでRDS Auroraクラスタのリストアをする
目次

今回は Terraform の小ネタです。 RDS Aurora クラスタをリストアする方法を紹介します。

モチベーション:うっかりAuroraクラスタをdestroyしてしまった

Terraform でAurora クラスタをコード化し、運用しているのですが、先日うっかりdestroyしてしまいました。 不幸中の幸いというか、final snapshotを取得していたので、そのsnapshotを使ってクラスタの復元を試みます。

ちなみにfinal snapshotというのは、 クラスタが削除されるタイミングにてsnapshotを取得するRDSのオプション のことで、 デイリーでの自動バックアップオプションと併用して設定することで万が一に備えることができます。

今回はその万が一が発生してしまったということです。

ゴール

今回のゴールは以下です

  • Aurora クラスタを特定のsnapshotからリストアする
  • 復元はTerraformから行う

snapshotからのリストア設定

Terraform でクラスタを作成するときに使う aws_rds_cluster リソースに対して snapshot_identifier を指定するだけです。

hogehogehogehoge という識別子のsnapshotを対象データとしてリストアします。

また snapshot_identifierignore_changes に設定し、terraform plan 実行時にdiffを無視してもらいます。

サンプルの設定は以下になります。

 1// auroraクラスタを構築するための定義
 2resource "aws_rds_cluster" "hoge_db_cluster" {
 3    cluster_identifier = "hoge_db_cluster"
 4    engine = "aurora-postgresql"
 5    database_name = "${var.db_name}"
 6    master_username = "${data.aws_kms_secrets.master.plaintext["master_username"]}"
 7    master_password = "${data.aws_kms_secrets.master.plaintext["master_password"]}"
 8    backup_retention_period = 7
 9    preferred_backup_window = "19:30-20:00"
10    preferred_maintenance_window = "mon:17:00-mon:17:30"
11    port = 5432
12    vpc_security_group_ids = [
13        "${aws_security_group.hoge_db_sg.id}"
14    ]
15    db_subnet_group_name = "${aws_db_subnet_group.hoge_db_subnet.name}"
16    db_cluster_parameter_group_name = "${aws_rds_cluster_parameter_group.hoge_db_cluster_parameter_group.name}"
17    skip_final_snapshot = false
18    final_snapshot_identifier = "hogehogehogehoge"
19    snapshot_identifier = "${data.aws_db_cluster_snapshot.final_snapshot.id}"
20    tags {
21        Name = "hoge-db-cluster"
22    }
23    lifecycle {
24        ignore_changes  = [
25            "final_snapshot_identifier",
26            "snapshot_identifier",
27        ]
28    }
29}
30
31// snapshotを参照するためのdata定義
32data "aws_db_cluster_snapshot" "final_snapshot" {
33    db_cluster_snapshot_identifier = "hogehogehogehoge"
34    most_recent = true
35}
36
37// クラスタインスタンスを生成するための定義
38resource "aws_rds_cluster_instance" "hoge_db_cluster_instance" {
39    (設定は省略)
40    cluster_identifier = "${aws_rds_cluster.hoge_db_cluster.id}"
41}

注意点

既に構築済みのRDSクラスタにはsnapshotを適用できない

2019/01時点でのRDSの仕様なので仕方ありませんが、クラスタを新規で構築するときにのみsnapshotからのリストアが可能です。 既に存在するクラスタを任意の時間のデータに巻き戻したい場合には ポイントインタイム のリストア機能を使うことになります。

Auroraクラスタにはクラスタのsnapshotを適用する

Auroraクラスタの場合はデータストレージを共有しているので、クラスタに対して復元を適用することになります。Terraform的には aws_db_cluster_snapshot で snapshotの情報を参照します。

逆に他のDBミドルウェアで構築したRDSクラスタであれば、ストレージは独立していますから、インスタンス単位でのリストアが必要です。インスタンスのsnapshotを参照するには aws_db_snapshot を使います。

まとめ

今回は Terraform を使って RDS Aurora クラスタのリストアを行いました。

  • snapshot_identifier にsnapshotのIDを指定することでリストアが可能
    • ただしクラスタは再作成になる
  • クラスタのsnapshotを参照するには aws_db_cluster_snapshot 、インスタンス単体のsnapshotには aws_db_snapshot のData Resourceを使う