I am new to Terraform. I am using Terraform to write AWS scripts. I am getting an error while performing Terraform Destroy. Terraform script is
resource "aws_rds_cluster" "aurora-cluster-ci" {
cluster_identifier = "aurora-cluster-ci"
engine = "aurora-mysql"
availability_zones = ["us-east-1a", "us-east-1b", "us-east-1c"]
database_name = "${var.rds_dbname}"
master_username = "${var.rds_username}"
master_password = "${var.rds_password}"
backup_retention_period = 5
engine_version = "5.7.16"
preferred_backup_window = "07:00-09:00"
apply_immediately = true
final_snapshot_identifier = "ci-aurora-cluster-backup"
skip_final_snapshot = true
}
Terraform Destroy throws an error "aws_rds_cluster.aurora-cluster-ci: RDS Cluster FinalSnapshotIdentifier is required when a final snapshot is required"
I have "final_snapshot_identifier" key in my script.
I Encountered the same problem while trying to perform a destroy on an RDS instance (not under AWS Aurora) but the principles are the same.
Below are a few steps I took in order to solve this issue:
Change skip_final_snapshot to true and remove final_snapshot_identifier if exists
(see comments #1 and #2 below) .
Remove backup_window (Under AWS Aurora its probably called preferred_backup_window).
Change backup_retention_period to 0.
Make sure that apply_immediately is set to true (see comment #3 below).
Run terraform apply and check the changes to affect (see a tip as comment #4 below).
Now you can run terraform destroy and no errors should appear (in my case I add deletion_protection set to true and add to remove it).
From Terraform docs:
skip_final_snapshot - (Optional) Determines whether a final DB snapshot is created before the DB instance is deleted. If true is specified, no DBSnapshot is created. If false is specified, a DB snapshot is created before the DB instance is deleted, using the value from final_snapshot_identifier. Default is false.
final_snapshot_identifier - (Optional) The name of your final DB snapshot when this DB instance is deleted. Must be provided if skip_final_snapshot is set to false.
In the code specified in the question skip_final_snapshot was true and final_snapshot_identifier was still specified.
(*) Don't be confused with the snapshot_identifier field.
For those who want to understand a little bit what is happening here, in the mentioned open issue there is a nice thread where a contributor named @caiges gave a nice explanation there:
For starters,
skip_final_snapshotdefaults toFalsewhich should also requirefinal_snapshot_identifierto be set but it's not so what happens is the create/update is applied, state updated whereskip_final_snapshotisFalsebutfinal_snapshot_identifierisnull.
This causes the destroy operation to fail it's verification stage.This can be fixed but I don't really have a great story for those who already have prexisting state.
One possibility would be that a delete operation ignoresskip_final_shopshotif the identifier is null.
Another might be to defaultfinal_snapshot_identifierto something random ifskip_final_snapshotis set to or defaulted to False.
I think for data safety reasons, ignoringskip_final_snapshotiffinal_snapshot_identifieris null is a bad idea and it'd be better to just randomize an identifier.
A note about apply_immediately from Terraform's docs:
Note: using apply_immediately can result in a brief downtime as the server reboots. See the AWS Docs on RDS Maintenance for more information.
When you run terraform plan make sure that the ~ (update in-place sign) appears in the relevant fields under Terraform's execution plan - In the example below you can see that 2 changes will be applied:
~ resource "aws_db_instance" "postgresql" {
address = ...
allocated_storage = 100
allow_major_version_upgrade = false
.
.
~ apply_immediately = false -> true
.
.
~ backup_retention_period = 7 -> 0
.
.
tags = ...
username = ...
vpc_security_group_ids = ...
}
This might sound trivial, but in cases like this error, it can save a lot of debugging time when you try to understand why certain updates haven't took place.
This is a known bug that is still open as of the current version of the Terraform provider for AWS:
https://github.com/terraform-providers/terraform-provider-aws/issues/2588
In a nutshell, it's ignoring the skip_final_snapshot parameter.
In my case I had to manually edit the .tfstate file and set "skip_final_snapshot" to true. Then it worked.
To delete RDS DB from terraform destroy:-
skip_final_snapshot = "true" to your aws_provider
terraform-apply
Then you are able to destroy it.
terraform destroyIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With