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"
  }
}

工作区键前缀是关键,它使得每个工作区使用不同的键,如下所示。

workspacekeydefaults3://my-tfstate/network/terraform.tfstatestagings3://my-tfstate/env:/staging/network/terraform.tfstateqas3://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,因此我在错误的地方进行了搜索。

希望能够帮助遇到同样问题的人。

广告
将在 10 秒后关闭
bannerAds