TerraformでスナップショットからRDSを復元・リストアする
RDSはスナップショットがあれば、AWSコンソール画面から手軽にDBを復元することができます。
既存のDBを残す場合は問題ないですが、削除する場合はtfstateと整合が取れなくなるので、復元もTerraformで実行しないといけません。
この記事ではTerraformでスナップショットからDBを復元する方法についてまとめます。
Terraform定義
下記のように、DBのリソースにsnapshot_identifierを指定します。すると指定したスナップショットからDBが作成されます。
resource aws_db_instance db_instance_rdn_restore_from_snapshot {
# 中略
snapshot_identifier = var.database_rdn.snapshot_identifier
lifecycle {
ignore_changes = [snapshot_identifier]
}
}
__var.database_rdn.snapshot_identifier__は変数です(変数は別ファイルで定義します)。この変数にSnapshot nameを入れます。
terraform apply
の初回実行時はリストアのDBは不要なので、countを使った擬似的なif文で分岐させました。
# var.database_rdn.snapshot_identifierが空の場合は作成しない
count = var.database_rdn.snapshot_identifier == "" ? 0 : 1
上記1行をリソース内に追加すると、__var.database_rdn.snapshot_identifier__に値が入っている時のみスナップショットからリストアしたDBが作成されます。
resource aws_db_instance db_instance_rdn_restore_from_snapshot {
count = var.database_rdn.snapshot_identifier == "" ? 0 : 1
# 中略
snapshot_identifier = var.database_rdn.snapshot_identifier
lifecycle {
ignore_changes = [snapshot_identifier]
}
}
既存のDBを残しつつ、リストアした新たなDBが作られます。
復元に要する時間
実際にDBを復元する際、作業量を見積もれるよう把握しておきたかったので、復元に要する時間も測りました。
インスタンスのサイズは20GiBで試しました。
- スナップショット取得の時間: 2~3min程度
- スナップショットからの復元: 11min程度
まとめ
これで万が一DBが壊れても安心です。やったね!
参考URL
Use this data source to get information about a DB Snapshot for use when provisioning DB instances
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/db_snapshot