Terraform错误 - 当需要最终快照时,RDS集群FinalSnapshotIdentifier是必需的。

27

我是 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销毁会抛出一个错误,指出"aws_rds_cluster.aurora-cluster-ci: RDS Cluster FinalSnapshotIdentifier是必需的,当需要最终快照时"

我的脚本中有"final_snapshot_identifier"键。


你能展示具体的错误信息吗? - ydaetskcoR
1
https://github.com/hashicorp/terraform/issues/5417#issuecomment-223733146 - BMW
10个回答

32

解决方案:

我在尝试对一个RDS实例(不是AWS Aurora下的)执行destroy时遇到了同样的问题,但原则是相同的。

以下是我采取的一些步骤来解决这个问题:

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

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

  3. backup_retention_period 更改为 0

  4. 确保将 apply_immediately 设置为 true(参见下面的注释#3)。

  5. 运行 terraform apply 并检查所影响的更改(参见下面的提示#4)。

  6. 现在,您可以运行 terraform destroy,并且不应出现任何错误(在我的情况下,我添加了 deletion_protection 设置为 true 并将其删除)。


评论 #1 - 理解相关字段的目的

来自Terraform文档

skip_final_snapshot - (可选)确定在删除DB实例之前是否创建最终的DB快照。如果指定为true,则不会创建DBSnapshot。如果指定为false,则将使用final_snapshot_identifier中的值在删除DB实例之前创建一个DB快照。默认值为false

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

在问题中指定的代码中,skip_final_snapshottrue,但仍然指定了final_snapshot_identifier

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


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

对于那些想要了解一些背景的人,可以在提到的开放问题中看到一个很好的讨论串,其中有一个贡献者@caiges给出了一个很好的解释:

首先,skip_final_snapshot 默认为 False,这也应该需要设置 final_snapshot_identifier,但实际上并没有这样做,所以会发生这样的情况:创建/更新被应用,状态被更新,其中 skip_final_snapshotFalse,但是 final_snapshot_identifiernull
这会导致销毁操作在验证阶段失败。
这个问题可以解决,但对于那些已经存在预设状态的人来说,我没有一个很好的解决方案。
一种可能的方法是,如果标识符为 null,则删除操作忽略 skip_final_snapshot
另一种可能是,如果将 skip_final_snapshot 设置为或默认为 False,则将 final_snapshot_identifier 默认为某些随机值。
我认为出于数据安全原因,如果 final_snapshot_identifier 为 null,则忽略 skip_final_snapshot 是一个不好的主意,最好只是随机生成一个标识符。

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

关于 apply_immediately 的说明来自Terraform文档:

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


注释 #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  =  ...
    }

这个问题听起来可能很琐碎,但在像这样的错误情况下,当您尝试理解为什么某些更新没有发生时,它可以节省大量的调试时间。

11

7

在我的情况下,我不得不手动编辑.tfstate文件,并将“skip_final_snapshot”设置为true。然后它就起作用了。


4

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

pulumi stack export > export.json

然后将所有的skipFinalSnapshot实例更改为true

最后导入更改后的文件:

pulumi stack import --file export.json


3

terraform destroy中删除RDS数据库的方法:

  1. 首先在您的aws_provider中添加skip_final_snapshot = "true"
  2. 执行terraform-apply

然后您就可以销毁它了。

  1. terraform destroy

2

如果您想更新需要替换资源的数据库,并且遇到“需要最终快照时必须指定 RDS 集群 FinalSnapshotIdentifier”的错误,则应首先注释掉导致需要替换的参数,然后添加以下参数:

skip_final_snapshot = true

然后执行 "terraform apply"。 之后应用您想要的更新并运行 "terraform apply" 这解决了我的问题。

2
遇到了同样的问题,如果您是RDS terraform资源的初学者,可能会错过skip_final_snapshot=true/false标志。默认情况下,它将处于false状态,当您执行terraform destroy时,它期望db的快照名称,从而导致错误。
*如果您想创建最终快照,可以使用final_snapshot_identifier标志来指定名称。
但是现在当您不知道已经创建了RDS实例时,很明显您不会知道。
只需删除该RDS实例的状态
在我的情况下: 1.) terraform state rm module.rds.aws_rds_instance_default 2.) 从AWS控制台手动删除RDS实例。 3.) 在aws_rds_instance资源中使用skip_final_snapshot=true重新应用terraform apply。
或者如果您想在销毁实例时创建实例快照。
将skip_final_snapshot设置为false,final_snapshot_identifier设置为快照名称。
希望这有所帮助!谢谢

1

我曾经遇到过同样的问题,但是在将 skipFinalSnapshot 改为 true 并将 backup_retention_period 改为 0 后,我现在可以摧毁它了,然后我执行了 terraform apply 命令。一旦应用这些更改并运行 terraform destroy 命令,就可以解决问题。


0

我无法通过terraform脚本删除实例。后来我意识到 - 不仅要将skip_final_snapshot设置为true,还要进行terraform应用以考虑更改的值。此后,使用terraform destroy可以正确地删除资源,而不会出现“错误:需要DB实例FinalSnapshotIdentifier”。


0

我遇到了这个问题,是因为我试图进行一个强制替换实例的更改,同时又尝试将 set_final_snapshot 设置为 true

确保在应用后续的强制替换更改之前(总共两次 apply),先运行 set_final_snapshot = true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接