terraform - 更改状态文件路径时如何保持 terraform 的状态正确?

标签 terraform

在version.tf文件中,之前将 key 存储在AWS S3中

terraform {
  required_version = "1.0.10"

  ...

  backend "s3" {
    encrypt        = true
    bucket         = "terraform-bucket"
    key            = "project1/api/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "state-lock"
  }
}

在这个路径

project1/api/

如果将api文件夹更改为price-api,还要调整状态键路径:

    key            = "project1/price-api/terraform.tfstate"

它将在先前的状态 key 旁边创建新的资源。如果更改 version.tf 中的键名称,如何避免出现重复状态?或者有没有办法将状态文件与S3文件同步以确保它们的状态相同?

最佳答案

terraform init 包含一些额外的功能,可帮助您在两个存储位置之间迁移状态。

要使用它,您必须首先使用配置初始化您的工作目录,并使用当前状态快照所在的当前对象键。运行 terraform init(如果您还没有激活的话),不带任何选项来激活它。 (如果您在以前用于其他操作的目录中工作,那么它可能已经初始化;您可以通过删除 .terraform 子目录及其内部的所有内容来确保干净的情况。)

当您看到 terraform init 使用原始路径成功完成后,请运行 terraform show 以查看 Terraform 是否返回您期望看到的基础架构。这将有助于确认您确实为要迁移的州选择了正确的当前位置。

现在,在同一工作目录中,更改您的后端“s3” block 以包含新路径。如果您现在运行 terraform init ,那么 Terraform 会注意到您更改了后端配置,并会要求您决定是迁移状态还是“重新配置”。

这里的迁移状态意味着让 Terraform 从旧位置读取当前状态快照,然后立即将其写入新位置,然后从那里进行初始化。这与您在问题中描述的内容相符,因此您可以通过运行 terraform init -migrate-state 来选择该选项,如上次运行的提示中所述。

执行此操作后,您可能在两个位置具有相同的状态快照,因此我建议直接查看相应的 S3 存储桶(使用普通的 S3 工具,而不是 Terraform)并检查以确保新对象存在并且与旧的匹配。如果是这样,您可以安全地手动删除旧版本,以避免任何可能尝试使用仍引用旧路径的旧版本配置的人感到困惑。

关于terraform - 更改状态文件路径时如何保持 terraform 的状态正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70195830/

相关文章:

Terraform destroy --target 行为

azure - Terraform 无法创建 64 位 Azure 应用服务(Web 应用)

terraform - 如何在资源中存储和重用地形插值结果?

azure - "Use for App Service"在terraform中配置网关时的参数

google-cloud-platform - 无法在区域中创建谷歌云存储桶[terraform]

azure-devops - 特点 block 地形

github - Terraform - 将变量传递给 "Source"参数

terraform > 强制安全组上的新资源

Terraform - 使用 splat 运算符不工作从模块创建输出

google-cloud-platform - 如何从 Terraform/Pulumi 访问 Cloud Run 服务 IP 以动态创建 A 记录?