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

Terraform 刷新状态时出错:S3中的状态数据没有预期的内容,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,当我们尝试使用远程状态处理运行terraform脚本时,我们会遇到以下问题: 刷新状态时出错:S3中的状态数据没有预期的内容。 这可能是由于S3处理以前的状态时异常长的延迟造成的 更新。请稍等一两分钟,然后再试一次。如果这个问题 持续存在,并且S3和DynamoDB都没有遇到中断,您可能需要 手动验证远程状态并更新存储在中的摘要值 将DynamoDB表格设置为以下值 问题在于地形状态文件。当您使用s3作为后端进行远程状态处理时,会出现此错误,因为s3文件位置和dynamodb记录不匹配 尝试以下

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

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


问题在于地形状态文件。当您使用s3作为后端进行远程状态处理时,会出现此错误,因为s3文件位置和dynamodb记录不匹配 尝试以下步骤

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

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


快乐编码…

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

案例1 如果您有AWS S3
terrform.tfstate
文件的备份,则可以将状态后端
“S3”{key=“path/to/terrform.tfstate”}
还原为旧版本。重新尝试terraform init,并验证它是否工作正常


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

重要注意事项:

  • 在此过程中,您将失去锁状态保护,这将阻止其他人获取锁,并且可能有两个人同时更新相同的资源,从而破坏您的状态
  • 请考虑使用<代码> TrrFraseRealth命令(),用于将状态TrRAFRATE(通过其状态文件)与真实世界基础结构相协调。这可用于检测与上次已知状态之间的任何偏移,并更新状态文件
  • 删除DynamoDB LockID表格条目->屏幕截图:


案例3
如果在
terraform销毁后
您手动删除了AWS S3
terraform.tfstate
文件,然后可能试图启动所有tfstate声明资源的新实例,这意味着您正在从头开始工作,您可以只更新AWS S3
terrform.tfstate
状态后端键
“S3”{key=“path/to/terraform.tfstate”}
到一个新的
“s3”{key=“new path/to/terraform.tfstate”}
。重试
terraform init
并验证其是否正常工作。此解决方法的局限性在于,您没有真正解决根本原因,您只是使用S3 tfstate的新密钥传递问题。

这发生在我尝试从新机器执行“terraform init”时

所以我删除了DynamoDB锁,并尝试了这个线程中的大部分内容,但没有成功。 删除锁时的一个重要问题是,我在那里看到了多条记录,并记住了我们也在使用terraform工作区。因此,当我在新机器中创建并切换到正确的工作区时,问题得到了解决

我想背后的原因是,我的terraform文件在运行init命令时,与S3上默认工作区的状态不同,因此我切换到了新的资源:

terraform workspace new'dev'
(or)
terraform workspace select 'dev'

(and then)
terraform init

然后一切又顺利进行。

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