【问题标题】:Terraform error - RDS Cluster FinalSnapshotIdentifier is required when a final snapshot is requiredTerraform 错误 - 需要最终快照时需要 RDS Cluster FinalSnapshotIdentifier
【发布时间】:2018-11-28 12:56:45
【问题描述】:

我是 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”键。

【问题讨论】:

标签: amazon-web-services terraform amazon-rds terraform-provider-aws


【解决方案1】:

解决办法:

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

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

  1. skip_final_snapshot 更改为true 并删除final_snapshot_identifier(如果存在)
    (参见下面的 cmets #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 docs

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

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

在问题skip_final_snapshot 中指定的代码中,truefinal_snapshot_identifier 仍然被指定。

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


评论 #2 - 导致此错误的原因是什么?

对于那些想稍微了解这里发生的事情的人,在提到的open issue 中有一个很好的帖子,其中一位名叫@caiges 的贡献者在那里给出了很好的解释:

对于初学者来说, skip_final_snapshot 默认为 False 这也应该要求 final_snapshot_identifier 被设置,但事实并非如此 应用创建/更新,状态更新在skip_final_snapshotFalse,但final_snapshot_identifiernull
这导致 销毁操作使其验证阶段失败。

这可以解决,但对于那些 已经存在状态。
一种可能性是删除 如果标识符为空,操作将忽略 skip_final_shopshot
另一个可能是默认 final_snapshot_identifier 为某事 如果 skip_final_snapshot 设置为或默认为 False,则为随机。
我觉得 出于数据安全原因,忽略skip_final_snapshot if final_snapshot_identifier 为 null 是个坏主意,最好 只是随机化一个标识符。


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

来自Terraform's docs 的关于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  =  ...
    }

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        pulumi stack export > export.json

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

        并导入修改后的文件:

        pulumi stack import --file export.json

        【讨论】:

          【解决方案5】:

          terraform destroy删除RDS DB:-

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

          然后你就可以摧毁它了。

          1. terraform destroy

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              遇到同样的问题,作为 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.) 在 aws_rds_instance 资源中使用 terraform apply with skip_final_snapshot=true 重新应用。

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

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

              希望这会有所帮助!!谢谢

              【讨论】:

                猜你喜欢
                • 2021-07-01
                • 2021-10-31
                • 2020-09-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-02-02
                • 1970-01-01
                • 2011-07-09
                相关资源
                最近更新 更多