Tocyukiのブログ

ギターと柔術とプログラミングが好き!

【Terraform】 skip_final_snapshot を設定しないでRDSを作成したらterraform destroyできなくなった

というわけで、これちょいちょいやってしまうんですが、Terraformでskip_final_snapshot = trueを設定しないでRDSリソースを作成して、その後削除しようとすると以下のエラーが出るようになってしまったんですよ

Error: RDS Cluster FinalSnapshotIdentifier is required when a final snapshot is required

というわけで対応手順をメモして行こうと思います

再現方法

以下のような感じでRDSのリソースを作成する

resource "aws_rds_cluster" "db" {
  cluster_identifier      = "${var.name}-${var.env}-db"
  engine                  = local.engine
  engine_version          = local.engine_version
  engine_mode             = local.engine_mode
  availability_zones      = values(var.azs)
  master_username         = aws_ssm_parameter.db_username.value
  master_password         = aws_ssm_parameter.db_password.value
  backup_retention_period = var.backup_retention_period
  preferred_backup_window = local.preferred_backup_window

  tags = merge(var.common_tags, {
    Name = "${var.name}-${var.env}-db"
    Role = "RDS"
  })
}

で、applyはうまくいくのでその後、destroyを実行すると・・・

Error: RDS Cluster FinalSnapshotIdentifier is required when a final snapshot is required

というエラーが出てしまい、Terraformでのこのリソースの削除ができなくなってしまいました

修正方法

stackoverflowの回答を参考に以下を実施したところ解決した

  • backup_retention_periodの値を0にする
  • preferred_backup_windowのパラメータを削除する
  • skip_final_snapshot = trueapply_immediately = trueを追加する

以下が修正後のコード

resource "aws_rds_cluster" "db" {
  cluster_identifier      = "${var.name}-${var.env}-db"
  engine                  = local.engine
  engine_version          = local.engine_version
  engine_mode             = local.engine_mode
  availability_zones      = values(var.azs)
  master_username         = aws_ssm_parameter.db_username.value
  master_password         = aws_ssm_parameter.db_password.value
  backup_retention_period = 0
  skip_final_snapshot     = true
  apply_immediately       = true

  tags = merge(var.common_tags, {
    Name = "${var.name}-${var.env}-db"
    Role = "RDS"
  })
}

そしてapplyを実施後、destroyで正常にリソースが削除されるようになりました〜!

参考情報

stackoverflow.com