【问题标题】:"Variables may not be used here" during terraform initterraform init 期间的“变量可能不会在此处使用”
【发布时间】:2021-04-26 13:20:52
【问题描述】:

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

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

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

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.

【问题讨论】:

  • terraform.io/docs/backends/config.html 文档中的注释:“只能指定一个后端,并且配置可能不包含插值。Terraform 将对此进行验证。”您可以部分配置后端,然后根据需要以交互方式提供缺失值。
  • 您可能希望订阅this GitHub issue 并为许多要求此功能增强的人发声。或者,该问题包含几个您可以考虑的建议解决方法。

标签: terraform snowflake-cloud-data-platform


【解决方案1】:

首先检查 Jhonny 的解决方案:

(保留这个供历史参考)


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

使用本地连接应该可以解决这个问题。见https://www.terraform.io/docs/configuration/locals.html

来自https://stackoverflow.com/a/61506549/132438的例子:

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

【讨论】:

  • 我不认为这回答了我的问题。我应该在"${element(local.BUCKET_NAME, 2)}" 中为 dev 指定 1,为 stg 指定 2 吗?
  • 哦,忘记数组了。重要的部分是连接是在locals 内部完成的,然后只是在resource 中使用。
  • provider.tf 第 9 行不允许函数调用,在 terraform: 9: bucket = element(local.BUCKET_NAME, 1) 此处不能调用函数。
【解决方案2】:

terraform backend docs 状态:

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

不过,s3 backend docs 向您展示了如何根据当前的工作空间 对一些 s3 存储进行分区,因此每个工作空间都有自己独立的状态文件。您只是不能为每个工作区指定不同的存储桶。您只能为所有工作空间指定一个存储桶,但 s3 后端会添加 workspace prefix to the path

使用非默认工作区时,状态路径将为 /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"
  }

并在部署前酌情切换工作区。

【讨论】:

    【解决方案3】:
    • 设置后端.tf

      terraform {
        backend "azurerm" {}
      }
      
    • 创建文件 backend.conf

      storage_account_name = "deploymanager"
      container_name       = "terraform"
      key                  = "production.terraform.tfstate"
      
    • 运行:

      terraform init -backend-config=backend.conf
      

    【讨论】:

    • 就是这样!
    • 由于某种原因,这在 Powershell 中失败,错误为 too many command line arguments。但是当我使用命令提示符时工作。
    【解决方案4】:

    遇到了类似的问题,解决方法是在 Terraform Init 中指定变量文件

    Main.tf

    terraform {
      required_providers {
        azurerm = {
          source = "hashicorp/azurerm"
          version = "2.91.0"
        }
    
        mongodbatlas = {
          source  = "mongogdb/mongodbatlas"
          version = "1.1.1" 
        }
    
        time = {
          source = "hashicorp/time"
          version = "0.7.2"
        }
    
        random = {
          source = "hashicorp/random"
          version = "3.1.0"
        }
      }
    
      backend "azurerm" {
        resource_group_name   = local.tfResourceGroupName
        storage_account_name  = var.tf_backend.storage_name
        container_name        = local.tfContainerName
        key                   = var.tf_backend.storage_key
      } 
    }
    
    terraform init -var-file="<your-var-file>"
    

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2019-06-12
      相关资源
      最近更新 更多