Terraform 错误 - 需要最终快照时需要 RDS Cluster FinalSnapshotIdentifier

ujj*_*arg 10 amazon-web-services amazon-rds terraform terraform-provider-aws

我是 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
}
Run Code Online (Sandbox Code Playgroud)

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

我的脚本中有“final_snapshot_identifier”键。

Rtm*_*tmY 10

解决方案:

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

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

  1. 更改skip_final_snapshottrue并删除final_snapshot_identifier如果存在
    (请参阅下面的评论 #1 和 #2)。

  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_protectionset添加到true并添加以删除它)。


评论 #1 - 了解相关字段的用途

来自Terraform 文档

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 - 是什么导致了这个错误?

对于那些想要了解这里发生的事情的人,在提到的开放问题中有一个很好的线程,其中名为@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_snapshotif final_snapshot_identifier为 null 是一个坏主意,最好只是随机化一个标识符。


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

apply_immediately来自Terraform 文档的注释:

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


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

运行时,terraform plan确保 ~(update in-place sign) 出现在 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  =  ...
    }
Run Code Online (Sandbox Code Playgroud)

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


And*_*at7 8

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


KJH*_*KJH 7

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

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

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