【问题标题】:terraform tfstate is not refreshing from remote s3 bucketterraform tfstate 未从远程 s3 存储桶刷新
【发布时间】:2018-09-14 21:45:10
【问题描述】:

我使用本地机器上的 tf 代码部署了 AWS 基础设施,该机器将 terraform.tfstate 存储在我的机器上。现在我希望其他开发人员引用相同的状态文件,因此我将代码复制到 github repo 并添加了 state.tf 并将 terraform.tfstate 从我的本地机器复制到我的状态文件指向的 s3 存储桶前缀。我还在 repo 中进行了一项更改,而不是拥有一个大的 tf 文件,我将其分为三个文件 - state.tf、vpc.tf 和 dynamodb.tf。

我的 state.tf 文件:

terraform {
  backend "s3" {
   bucket = "testing-d-tf-state"
   key    = "aws-xyz/terraform.tfstate"
   region = "us-west-2"
  }
}

但是,当我的开发人员在他的机器上运行代码时,他会得到

计划:26 增加,0 改变,25 破坏。

我无法弄清楚为什么他没有正确刷新 terraform.tfstate 文件以使其无法“添加”或“销毁”,因为基础架构没有发生任何更改。

【问题讨论】:

  • 看起来他们至少获得了一些状态,因为 Terraform 知道有 25 个资源需要销毁。您确定您的状态文件配置正确并且您没有查看错误的状态文件吗?
  • 感谢@ydaetskcoR 的回复。我正在查看正确的状态文件。唯一的区别是,在我的 github 代码中,我使用 bash 脚本来创建 terraform 工作区,以便我可以通过为每个区域设置“aws-xyz/terraform.tfstate”来在多个区域中部署代码。我将 AWS_REGION=us-west-2 作为环境变量传递,在我的 s3 存储桶上,我手动创建了 us-west-2/aws-xyz 文件夹并将 terraform.tfstate 上传到它。我也有 .terraform/environment 文件有us-west-2
  • 如果我新创建了基础设施,我的状态文件工作正常,如果我在上面重新运行代码,那么我不会收到“添加”或“销毁”消息。只有当我尝试使用从本地机器复制的状态文件并在新的代码/文件夹结构中使用它时,“添加”或“销毁”才会出现。知道我做错了什么吗?任何指针将不胜感激..

标签: terraform terraform-provider-aws


【解决方案1】:

您不应手动将terraform.tfstate 文件复制到远程位置。在您编写好 backend 信息后,您将重新运行 terraform init,Terraform 将负责在本地和远程存储桶中为您正确设置。

完成此操作后,您应该做一些事情来确认它是否有效:

  1. 登录 AWS 控制台并确认在正确的存储桶和位置中现在有一个 terraform.tfstate 文件。
  2. 移动本地的terraform.tfstate 文件(不要删除它以防万一),然后运行类似terraform state list 的东西来查询状态文件。如果它有效,那么您的远程状态配置正在工作。

【讨论】:

  • 谢谢@KJH,我什至试过了,还有 terraform state push -force terraform.tfstate.backup 但运气不好我仍然得到Plan: 26 to add, 0 to change, 25 to destroy.。我忘记提及的一个区别是,在新代码中我使用的是 terraform 工作区,而在旧代码(具有 terraform.tfstate)中我没有使用工作区。现在的问题是如何将状态文件移植到工作区?
  • 啊,是切换到 TF 工作区导致了这种情况。我重新阅读了您的评论,发现您正在为不同地区使用工作区。我只考虑过将工作空间用于环境(例如 prod、dev、test 等),而这正是 TF 最初设想的用途。如果您的包装脚本没有使用terraform workspace,而只是将该区域注入到后端信息中怎么办?这会给你足够的变量和状态隔离吗?
  • 我尝试在没有工作区的情况下运行它,即使这样我也收到相同的添加或销毁消息。我的新代码还有一个变化。早些时候我使用类似module "vpc" { source = "/dtest" home_dir = "/Users/deepak.prasad/" aws_profile = "dtest" s3_bucket = "<bucketname>" } 的模块,但现在我没有使用任何模块。那会是个问题吗?抱歉,我对 terraform 还是很天真...
  • @DeepakPrasad - 不幸的是,在这一点上,有人必须查看您的 TF 代码、您的包装脚本、您看到的错误等的所有才能到达找出问题的根源并提出解决方案。我强烈建议的一件事是不要在此过程中添加额外的更改(如模块更改) - 这只会加剧问题。
猜你喜欢
  • 2020-02-05
  • 2021-12-30
  • 1970-01-01
  • 2018-05-20
  • 2021-12-12
  • 1970-01-01
  • 2023-03-07
  • 2019-09-16
  • 2017-01-05
相关资源
最近更新 更多