16

我是 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
}

Terraform Destroy引发错误“aws_rds_cluster.aurora-cluster-ci:需要最终快照时需要 RDS Cluster FinalSnapshotIdentifier”

我的脚本中有“final_snapshot_identifier”键。

4

7 回答 7

18

解决方案:

我在尝试对destroyRDS 实例(不在 AWS Aurora 下)执行 a 时遇到了同样的问题,但原理是相同的。

以下是我为解决此问题而采取的一些步骤:

  1. 如果存在,则更skip_final_snapshot改为true并删除(请参阅下面的注释 #1 和 #2)。final_snapshot_identifier

  2. 删除backup_window(在 AWS Aurora 下可能称为preferred_backup_window)。

  3. 更改backup_retention_period0

  4. 确保将apply_immediately其设置为true(请参阅下面的评论 #3)。

  5. 运行terraform apply并检查要影响的更改(请参阅下面的注释 #4 中的提示)。

  6. 现在您可以运行terraform destroy并且不会出现任何错误(在我的情况下,我添加deletion_protection了 settrue并添加到删除它)。


评论 #1 - 了解相关领域的目的

来自Terraform 文档

skip_final_snapshot- (可选)确定在删除数据库实例之前是否创建最终数据库快照。如果true指定,则不创建 DBSnapshot。如果false指定,则在删除数据库实例之前创建数据库快照,使用值 from final_snapshot_identifier。默认为false

final_snapshot_identifier- (可选)删除此数据库实例时您的最终数据库快照的名称。skip_final_snapshot如果设置为则必须提供false

在问题中指定的代码中skip_final_snapshottrue并且final_snapshot_identifier仍然是指定的。

(*) 不要与snapshot_identifier字段混淆。


评论 #2 - 是什么导致了这个错误?

对于那些想稍微了解这里发生的事情的人,在提到的未解决问题中有一个很好的线程,其中一个名为 @caiges 的贡献者在那里给出了一个很好的解释:

对于初学者, 还需要 设置skip_final_snapshot默认值,但事实并非如此,应用了创建/更新,状态已更新 where is but is 。 这会导致销毁操作在其验证阶段失败。Falsefinal_snapshot_identifierskip_final_snapshotFalsefinal_snapshot_identifiernull

这可以解决,但对于那些已经存在状态的人来说,我真的没有什么好故事。
一种可能性是,skip_final_shopshot如果标识符为空,则删除操作会忽略。如果设置为或默认为 False,
另一个可能是默认final_snapshot_identifier为随机值。我认为出于数据安全原因,忽略if is null 是一个坏主意,最好只是随机化一个标识符。skip_final_snapshot
skip_final_snapshotfinal_snapshot_identifier


评论 #3 - 确保我们的更改立即生效:

关于Terraform 文档apply_immediately的注释:

注意:使用 apply_immediately 可能会导致服务器重新启动时短暂停机。有关更多信息,请参阅有关 RDS 维护的 AWS 文档。


评论 #4(奖励)- 为自己节省一些时间:

当您运行时,请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  =  ...
    }

这听起来可能微不足道,但在出现这种错误的情况下,当您尝试了解某些​​更新未发生的原因时,它可以节省大量调试时间。

于 2020-07-20T11:21:28.923 回答
9

这是一个已知错误,在 AWS 的 Terraform 提供程序的当前版本中仍然存在:

https://github.com/terraform-providers/terraform-provider-aws/issues/2588

简而言之,它忽略了skip_final_snapshot参数。

于 2018-08-18T17:20:14.030 回答
4

就我而言,我必须手动编辑 .tfstate 文件并将“skip_final_snapshot”设置为 true。然后它起作用了。

于 2021-03-07T18:29:29.970 回答
3

如果您是 Pulumi 用户,在 Pulumi 使用 Terraform 提供程序时看到此错误:

pulumi stack export > export.json

然后将 的所有实例更改skipFinalSnapshottrue

并导入更改的文件:

pulumi stack import --file export.json

于 2021-06-17T15:32:08.927 回答
2

要从以下位置删除 RDS 数据库 terraform destroy:-

  1. 先加skip_final_snapshot = "true" to your aws_provider
  2. terraform-apply

然后你就可以摧毁它。

  1. terraform destroy
于 2021-01-15T20:40:56.330 回答
0

我无法删除通过 terraform 脚本创建的 rds 实例。然后我意识到 - 不仅将 skip_final_snapshot 保持为 true 就足够了,而且还可以应用 terraform 以便将更改的值考虑在内。之后,terraform destroy 会正确删除资源,而不会出现错误“错误:需要最终快照时需要数据库实例 FinalSnapshotIdentifier”

于 2020-01-09T10:39:48.463 回答
0

遇到同样的问题,作为 RDS terraform 资源的初学者,您可能会错过 skip_final_snapshot=true/false 标志。默认情况下,这将处于错误状态,当您进行 terraform destroy 时,它需要一个导致错误的数据库的快照名称。

*如果要创建最终快照,可以使用 final_snapshot_identifier 标志指定名称。

但是现在,当您创建 RDS 实例时,显然您不会知道哪个实例。

只需删除该 RDS 实例的状态

就我而言:1.) terraform state rm module.rds.aws_rds_instance_default 2.) 从 AWS 控制台手动删除 RDS 实例。3.) 使用 terraform 在 aws_rds_instance 资源中使用 skip_final_snapshot=true 重新应用。

或者如果您想在销毁它时创建实例快照。

设置 skip_final_snapshot=false,final_snapshot_identifier=name-of-snapshot。

希望这会有所帮助!谢谢

于 2020-11-20T04:47:21.070 回答