在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/