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