terraform_remote_state和workspace的陷阱
Terraform的工作区功能非常方便。它可以在同一项目中切换和管理多个环境(开发、质量保证、暂存、生产等),非常有用。
如果更改工作空间,则必须另外保存 tfstate 文件,因此必须设置保存位置可以变化。因为我使用 s3 后端,所以我进行了以下设置。
terraform {
backend "s3" {
region = "ap-northeast-1"
bucket = "my-tfstate"
key = "network/terraform.tfstate"
workspace_key_prefix = "env:"
dynamodb_table = "terraform_backend"
}
}
工作区键前缀是关键,它使得每个工作区使用不同的键,如下所示。
workspacekey
default
s3://my-tfstate/network/terraform.tfstate
staging
s3://my-tfstate/env:/staging/network/terraform.tfstate
qa
s3://my-tfstate/env:/qa/network/terraform.tfstate
选择除了默认工作区之外的工作区,您会注意到 workspace_key_prefix 被添加到键的前面,并且在 env: 后面会加上工作区的名称。
顺便说一下,workspace_key_prefix 的默认值是 env:,所以不需要专门写出来。
terraform {
backend "s3" {
region = "ap-northeast-1"
bucket = "my-tfstate"
key = "network/terraform.tfstate"
dynamodb_table = "terraform_backend"
}
}
这个功能本身是令人高兴的,但当我试图在不同的项目中使用 terraform_remote_state 引用这个 tfstate 时,出现了严重困难。
首先,我认为按照常规方式写的话会是这样的。
data "terraform_remote_state" "network" {
backend = "s3"
config {
region = "ap-northeast-1"
bucket = "my-tfstate"
key = "network/terraform.tfstate"
}
}
和后端设置一样,我们期望当前的工作空间也能够提供补全支持。
然而,当我们尝试引用该资源的属性时,却遇到了找不到属性的错误。
* output.aws_aaa: Resource 'data.terraform_remote_state.network' does not have attribute 'vpc_id' for variable 'data.ter
raform_remote_state.network.vpc_id'
据我所知,terarform_remote_state 似乎不会根据当前工作空间自动生成密钥,必须显式地在后端设置中写入补全的密钥。
data "terraform_remote_state" "network" {
backend = "s3"
config {
region = "ap-northeast-1"
bucket = "my-tfstate"
key = "env:/${terraform.workspace}/network/terraform.tfstate"
}
}
嗯,有时候我也想要引用不同工作区的 tfstate,我认为这是一个合理的需求。但是,我错误地认为它会自动补全 key,因此我在错误的地方进行了搜索。
希望能够帮助遇到同样问题的人。