Terraform错误-需要最终快照时,需要RDS群集FinalSnapshotIdentifier

时间:2018-06-19 14:06:42

标签: 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
}
  

地形破坏引发错误“ aws_rds_cluster.aurora-cluster-ci:RDS群集   需要最终快照时,需要FinalSnapshotIdentifier。

我的脚本中有“ final_snapshot_identifier”键。

7 个答案:

答案 0 :(得分:2)

解决方案:

在尝试在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 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
这导致 销毁操作以使其失败,进入验证阶段。

这个问题可以解决,但是对于那些谁我真的没有一个好故事 已经处于存在状态。
一种可能是删除 如果标识符为null,则操作将忽略skip_final_shopshot
另一个可能是将final_snapshot_identifier默认为 如果skip_final_snapshot设置为或默认为False,则为随机。
我认为 出于数据安全原因,如果出现以下情况,请忽略skip_final_snapshot final_snapshot_identifier为空是个坏主意,最好 只是随机化一个标识符。


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

关于Terraform's docsapply_immediately的注释:

注意:立即使用apply_in会导致短暂的停机时间,因为 服务器重启。有关更多信息,请参阅有关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  =  ...
    }

这听起来很琐碎,但是在类似此错误的情况下,当您尝试了解为何未进行某些更新的原因时,它可以节省大量调试时间。

答案 1 :(得分:2)

terraform destroy 中删除 RDS 数据库:-

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

然后你就可以摧毁它了。

  1. 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 用户,在 Pulumi 使用 Terraform 提供程序时看到此错误:

pulumi export > export.json

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

并导入更改后的文件:

pulumi stack import --file export.json