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_identifier
は ignore_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を使う