Terraform:在 terraform init 期间“此处不得使用变量”

Yoh*_*shi 5 terraform snowflake-cloud-data-platform

我正在使用 Terraform 雪花插件。我想${terraform.workspace}terraform范围内使用变量。

terraform {
  required_providers {
    snowflake = {
      source  = "chanzuckerberg/snowflake"
      version = "0.20.0"
    }
  }
  backend "s3" {
    bucket         = "data-pf-terraform-backend-${terraform.workspace}"
    key            = "backend/singlife/landing"
    region         = "ap-southeast-1"
    dynamodb_table = "data-pf-snowflake-terraform-state-lock-${terraform.workspace}"
  }
}
Run Code Online (Sandbox Code Playgroud)

但我收到了这个错误。变量在此范围内不可用?

Error: Variables not allowed

  on provider.tf line 9, in terraform:
   9:     bucket         = "data-pf-terraform-backend-${terraform.workspace}"

Variables may not be used here.


Error: Variables not allowed

  on provider.tf line 12, in terraform:
  12:     dynamodb_table = "data-pf-snowflake-terraform-state-lock-${terraform.workspace}"

Variables may not be used here.
Run Code Online (Sandbox Code Playgroud)

Jho*_*los 70

  • 就是这样! (7认同)
  • 在 Powershell 中,使用双破折号作为参数:`terraform init --backend-config=backend.conf` (2认同)

spi*_*kus 9

terraform后端文档指出:

后端块不能引用命名值(例如输入变量、局部变量或数据源属性)。

但是,s3 后端文档向您展示了如何根据当前工作空间对某些 s3 存储进行分区,以便每个工作空间都有自己独立的状态文件。您无法为每个工作区指定不同的存储桶。您只能为所有工作空间指定一个存储桶,但 s3 后端会将工作空间前缀添加到路径中

使用非默认工作区时,状态路径将为 /workspace_key_prefix/workspace_name/key (另请参阅workspace_key_prefix 配置)。

一张发电机桌就足以满足所有工作空间。所以只需使用:

  backend "s3" {
    bucket         = "data-pf-terraform-backend"
    key            = "terraform.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "data-pf-snowflake-terraform-state-lock"
  }
Run Code Online (Sandbox Code Playgroud)

并在部署之前根据需要切换工作区。


Fel*_*ffa -3

首先检查 Jhonny 的解决方案:

(保留此以供历史参考)


似乎是 Terraform 中更常见问题的一个特定实例:连接变量。

使用当地人来连接应该可以修复它。请参阅https://www.terraform.io/docs/configuration/locals.html

来自/sf/answers/4305458461/的示例:

locals {
  BUCKET_NAME = [
    "bh.${var.TENANT_NAME}.o365.attachments",
    "bh.${var.TENANT_NAME}.o365.eml"
  ]
}

resource "aws_s3_bucket" "b" {
  bucket = "${element(local.BUCKET_NAME, 2)}"
  acl    = "private"
}
Run Code Online (Sandbox Code Playgroud)

  • provider.tf 第 9 行不允许函数调用,在 terraform: 9:bucket = element(local.BUCKET_NAME, 1) 此处不能调用函数。 (2认同)