我是Terraform的新手。我正在使用Terraform编写AWS脚本。执行 Terraform Destroy 时发生错误。 Terraform脚本是
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
}
地形破坏引发错误“ aws_rds_cluster.aurora-cluster-ci:RDS群集 需要最终快照时,需要FinalSnapshotIdentifier。
我的脚本中有“ final_snapshot_identifier”键。
答案 0 :(得分:2)
在尝试在RDS实例(不在AWS Aurora下)上执行destroy
时遇到了相同的问题,但是原理相同。
以下是我为解决此问题而采取的一些步骤:
将skip_final_snapshot
更改为true
并删除final_snapshot_identifier
(如果存在的话)(请参阅下面的注释#1和#2)。
删除backup_window
(在AWS Aurora下,它可能称为preferred_backup_window
)。
将backup_retention_period
更改为0
。
确保将apply_immediately
设置为true
(请参阅下面的注释3)。
运行terraform apply
并检查要影响的更改(请参见下面的注释4,作为提示)。
现在您可以运行terraform destroy
并且不会出现任何错误(在我的情况下,我将deletion_protection
设置为true
,然后添加并删除它)。
skip_final_snapshot
-(可选)确定在删除数据库实例之前是否创建最终的数据库快照。如果指定了true
,则不会创建DBSnapshot。如果指定了false
,则使用final_snapshot_identifier
中的值在删除数据库实例之前创建数据库快照。默认值为false
。
final_snapshot_identifier
-(可选)删除该数据库实例后的最终数据库快照的名称。如果skip_final_snapshot
设置为false
,则必须提供。
在问题skip_final_snapshot
中指定的代码中,true
是final_snapshot_identifier
,并且仍被指定。
(*)不要与snapshot_identifier
字段混淆。
对于那些想了解一下这里发生的事情的人,在提到的open issue中有一个不错的线程,名为@caiges的贡献者在那里给出了很好的解释:
对于初学者,
skip_final_snapshot
默认为False
,这也需要final_snapshot_identifier
待设置,但事实并非如此 创建/更新已应用,状态更新为skip_final_snapshot
是False
,但final_snapshot_identifier
是null
。
这导致 销毁操作以使其失败,进入验证阶段。这个问题可以解决,但是对于那些谁我真的没有一个好故事 已经处于存在状态。
一种可能是删除 如果标识符为null,则操作将忽略skip_final_shopshot
。
另一个可能是将final_snapshot_identifier
默认为 如果skip_final_snapshot
设置为或默认为False,则为随机。
我认为 出于数据安全原因,如果出现以下情况,请忽略skip_final_snapshot
final_snapshot_identifier
为空是个坏主意,最好 只是随机化一个标识符。
关于Terraform's docs中apply_immediately
的注释:
注意:立即使用apply_in会导致短暂的停机时间,因为 服务器重启。有关更多信息,请参阅有关RDS维护的AWS文档。 信息。
运行terraform plan
时,请确保~
(就地更新符号)出现在Terraform的执行计划下的相关字段中-在下面的示例中,您将看到将应用2个更改:
~ 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 = ...
}
这听起来很琐碎,但是在类似此错误的情况下,当您尝试了解为何未进行某些更新的原因时,它可以节省大量调试时间。
答案 1 :(得分:2)
从 terraform destroy
中删除 RDS 数据库:-
skip_final_snapshot = "true" to your aws_provider
terraform-apply
然后你就可以摧毁它了。
terraform destroy
答案 2 :(得分:2)
就我而言,我必须手动编辑 .tfstate 文件并将“skip_final_snapshot”设置为 true。然后它起作用了。
答案 3 :(得分:1)
这是一个已知的错误,该错误从用于AWS的当前Terraform提供程序的当前版本开始仍然存在:
https://github.com/terraform-providers/terraform-provider-aws/issues/2588
简而言之,它忽略了skip_final_snapshot
参数。
答案 4 :(得分:0)
我无法删除通过terraform脚本创建的rds实例。然后我意识到-不仅将skip_final_snapshot保持为true,而且还可以进行地形应用,以便将更改后的值考虑在内。之后,terraform destroy会正确删除资源,而不会出现错误“错误:需要最终快照时需要数据库实例FinalSnapshotIdentifier”
答案 5 :(得分:0)
遇到同样的问题,作为具有RDS terraform资源的入门者,您可能会错过skip_final_snapshot = true / false标志。默认情况下,它将处于false状态,当您进行Terraform销毁时,它会期望数据库的快照名称,从而导致错误。
*如果要创建最终快照,可以使用final_snapshot_identifier标志指定名称。
但是现在当您创建RDS实例时却不知道您显然不会这么做。
只需删除该RDS实例的状态
在我的情况下: 1.)terraform状态rm模块.rds.aws_rds_instance_default 2.)从AWS控制台手动删除RDS实例。 3.)使用terraform重新应用,在aws_rds_instance资源中使用skip_final_snapshot = true进行应用。或者在销毁实例快照时要创建实例快照。
设置skip_final_snapshot = false,final_snapshot_identifier =快照名称。
希望这会有所帮助!谢谢
答案 6 :(得分:0)
pulumi export > export.json
然后将 skipFinalSnapshot
的所有实例更改为 true
。
并导入更改后的文件:
pulumi stack import --file export.json