【问题标题】:Terraform fails because tfstate (S3 backend) is lostTerraform 失败,因为 tfstate(S3 后端)丢失
【发布时间】:2019-06-04 23:32:27
【问题描述】:

我正在使用 Terraform 创建 AWS 基础设施,并使用 S3 后端配置。现在的问题是,有人删除了存储状态的 S3 存储桶,现在每次我运行 terraform 都会失败,说资源已经存在。旧的 tfstate 丢失,新的没有关于现有资源的信息。 注意:我没有 AWS 环境的写入权限。我通过 Jenkins CD 管道触发 terraform,因此我无法手动修改基础架构或运行任何 terraform 命令。

有没有办法用 tf 文件清理现有资源或强制重新创建资源(如果它们已经存在)?这是我唯一可以进行更改的地方。

【问题讨论】:

  • 也许你有一些 Jenkins 工作要运行破坏?
  • 如目标重复问题中所述,您将需要手动清理内容并重建或将所有内容重新导入您的状态文件。将来您应该启用状态文件的版本控制,以便您可以随时返回它,并可能防止使用 MFA Delete 等破坏 S3 存储桶。
  • 感谢@ydaetskcoR 提供的信息。我无法清理这些东西,因为我没有权限。我会按照流程完成。
  • 如果有人有本地状态,您可以将其复制到新的 s3 buucker 或 terraform import 和 terraform state rm 的组合就可以了。

标签: amazon-web-services terraform


【解决方案1】:

你真是一团糟。您需要恢复 S3 存储桶或创建一个新存储桶并将您的代码指向该存储桶。 然后,您需要重新创建丢失的状态,或者删除您通过 Terraform 创建的每个对象并重新开始。大多数对象都可以通过 Terraform import 命令导入现有对象。

这可能是一项非常艰巨的任务。

您需要对存储桶的写入权限吗?只有当您仍然拥有状态文件时,Terraform 刷新才会有所帮助。你没有。 如果您没有获得这样做的权限,那么可能会放弃该权限或坚持获得足够的权限。

如果您不能在本地运行 Terraform,那么您也是在浪费时间。 祝你好运。

但是....

你不想再来这里了。您是如何删除/丢失存储桶的? 你真的需要永远不要再发生这种情况,因为 @ydaetskcoR 说过一些 MFA 保护 在存储桶上 - 一定要这样做,并且添加版本控制是一个非常好的主意。 此外,如果您还没有将 DynamoDB 锁定 添加到存储桶中,那么这样做真的很值得。

【讨论】:

  • 非常感谢您提供这些宝贵的信息。我想我必须请求访问或根据请求清理现有资源(幸运的是对象不是太多!)。正如你和@ydaetskcoR 所建议的那样,我将使用版本控制和dynamoDb 锁定。
  • Google 平台的 Terraformer 可以为给定区域创建状态文件和 tf 代码。
【解决方案2】:

如果您在生产帐户中工作,请听从他人的建议,不要手动弄乱帐户中的任何内容!

如果您刚开始使用 terraform 或 terragrunt 并且尝试重置 terraform 状态:

  1. 确保您登录到正确的 AWS 账户,它不是生产账户,并且没有被其他人使用
  2. Terraform 状态以相同的名称保存在两个地方:S3 和 DynamoDB。要重置状态,您需要将两者都删除。
  3. 如果之前在帐户中创建了任何其他内容,您需要手动删除这些内容。根据您创建的数量,这可能需要很长时间。
  4. 删除以 terraform 状态存储桶命名的 S3 和 DynamoDB 并删除由 terraform 创建的基础架构后,您应该可以使用 terraform initterraform plan 而不会出现其他问题。

【讨论】:

  • 感谢您提供的信息。我很久以前就遇到过这个问题,我通过手动删除所有内容(部署的 AWS 资源和状态文件)解决了这个问题。为此,我不得不向 DevOps 团队寻求帮助。
猜你喜欢
  • 2021-04-04
  • 2012-10-30
  • 2020-02-05
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多