错误刷新状态:S3中的状态数据没有预期的内容

Sak*_*yan 11 terraform terraform-provider-aws

当我们尝试运行带有远程状态处理的 terraform 脚本时,我们会遇到以下问题:

错误刷新状态:S3 中的状态数据没有预期的内容。这可能是由于 S3 处理先前状态更新的异常长时间延迟造成的。请等待一两分钟,然后重试。如果此问题仍然存在,并且 S3 和 DynamoDB 都没有遇到中断,您可能需要手动验证远程状态并将存储在 DynamoDB 表中的 Digest 值更新为以下值

Exe*_*ero 20

根据您的具体情况,有 3 种可能的解决方法来解决它:

情况1

如果您有AWS S3文件的备份,则terrform.tfstate可以将状态后端恢复"s3" {key = "path/to/terraform.tfstate"}到旧版本。重新尝试terraform init并验证它是否运行良好。


案例二

删除 AWS DynamoDB 表中的不同步条目。LockID表中将有一个包含状态和预期校验和的条目,您应该将其删除,并在重新运行后重新生成terraform init

重要注意事项:

  • 在此过程中,您将失去锁状态保护,这会阻止其他人获取锁,并且可能有两个人同时更新破坏您状态的相同资源。
  • 请考虑使用terraform refresh命令 ( https://www.terraform.io/docs/commands/refresh.html ),该命令用于协调 Terraform 知道的状态(通过其状态文件)与现实世界的基础设施。这可用于检测与上次已知状态的任何漂移,并更新状态文件。
  • 删除 DynamoDB LockID 表条目 -> 屏幕截图:

在此处输入图片说明


案例3

如果terraform destroy您手动删除了 AWS S3terraform.tfstate文件,然后可能尝试启动所有 tf​​state 声明资源的新实例,这意味着您是从头开始工作,则只需将 AWS S3terrform.tfstate状态后端密钥更新"s3" {key = "path/to/terraform.tfstate"}为新的"s3" {key = "new-path/to/terraform.tfstate"}. 重试terraform init并验证这应该可以正常工作。此解决方法的局限性在于您还没有真正解决根本原因,您只是使用 S3 tfstate 的新密钥绕过问题。

  • 我的 dynamodb 表导致了 pblm (2认同)

Sak*_*yan 0

问题出在 terraform 状态文件上。当您使用 s3 作为远程状态处理的后端时,我们会收到此错误,因为 s3 文件位置和 dynamodb 记录不匹配。请尝试以下步骤。

1) 删除该特定状态条目的 dyanmodb 记录。2)删除s3位置的状态文件。3) 现在从头开始初始化并应用 terraform。

这将在 dynamodb 中创建一个新的状态信息条目,并在 s3 中添加新的状态文件,问题将得到解决。

快乐编码...

  • 这是一个非常糟糕的主意。删除锁定记录而不查看其错误原因意味着您将失去锁定记录提供的安全检查,因为它认为状态文件应该与实际情况不同,因此某些地方可能会由于最终一致性而导致不匹配,但也可能是由于更糟糕的事情。也不需要删除状态文件。如果您认为状态文件没有问题并且锁是错误的,那么只需删除锁就可以了。删除状态文件意味着您可能会复制一堆资源,或者在尝试复制唯一资源时导致错误。 (2认同)