簡體   English   中英

for_each 循環與動態塊和來自 tfvars 的值

[英]for_each loop with dynamic block and values from tfvars

我正在嘗試使用動態塊創建帶有 time_partitioning 的某些 BigQuery 表,我想在運行時使用來自 tfvars 的值,如下所示:

./表/表.tf:

resource "google_bigquery_table" "tables" {
  for_each            = var.tables == [] ? [] : toset(var.tables)
  dataset_id          = var.db_id
  deletion_protection = false
  table_id            = each.key
  
  dynamic "time_partitioning" {
    for_each = var.partitioned_tables
    content {
      type  = "DAY"
      field = time_partitioning.value.field
    }
  }
  labels = {
    environment = var.environment
    application = var.application
  }
  schema = fileexists("${path.module}/${var.db_id}/${each.key}.json") ? file("${path.module}/${var.db_id}/${each.key}.json") : null
}

主.tf:

resource "google_bigquery_dataset" "database" {
  count                      = length(var.dbs)
  dataset_id                 = var.dbs[count.index].db_id
  friendly_name              = var.dbs[count.index].db_name
  description                = "TF"
  location                   = "US"
  delete_contents_on_destroy = var.delete_contents_on_destroy
  labels = {
    environment = var.environment
    application = var.dbs[count.index].app_name
  }
}

module "tables" {
  source      = "./tables"
  count       = length(var.dbs)
  db_id       = google_bigquery_dataset.database[count.index].dataset_id
  environment = var.environment
  application = var.dbs[count.index].app_name
  tables      = var.dbs[count.index].tables
  partitioned_tables = var.dbs[count.index].partitioned_tables
}

module "iam" {
  source      = "./iam"
  count       = length(var.dbs)
  db_id       = google_bigquery_dataset.database[count.index].dataset_id
  iam_members = var.dbs[count.index].iam_members
}

dev.tfvars:

region     = "us-central1"
project_id = "some-project"
dbs = [
  {
    db_id    = "dataset1"
    db_name  = "dataset1"
    app_name = "hello"
    iam_members = [
      {
        role   = "roles/bigquery.dataEditor"
        member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com",
      }
    ]
    tables = ["daily_inventory", "dc_inventory", "products", "daily_sales", "planned_inventory", "stores", "stores_in_program"]
    partitioned_tables = [
      {
        table = "daily_sales"
        field = "sales_timestamp"
      },
      {
        table = "daily_inventory"
        field = "inventory_timestamp"
      }
    ]
  },
  {
    db_id    = "dataset2"
    db_name  = "dataset2"
    app_name = "hello"
    iam_members = [
      {
        role   = "roles/bigquery.dataEditor"
        member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com"
      }
    ]
    tables = []
  }
]
environment                = "development"
delete_contents_on_destroy = true


var.dbs 是 type = list(any)

得到:

給定的值不適合在 variables.tf:9,1-15 處聲明的 var.dbs:所有列表元素必須具有相同的類型。

提前致謝!

list(any)並不意味着您可以在列表中包含“任何”類型的元素。 所有元素都必須具有相同的類型,並且您不能像現在那樣混合類型(即第二個元素缺少partitioned_tables )。 any僅表示 TF 將推斷元素的單一類型,但所有元素都必須屬於該單一類型。 所以你有三個選擇:

  1. 刪除type = list(any)
  2. 使用optional的 arguments 完全定義您的類型,而不是使用any
  3. partitioned_tables添加到第二個元素:
[
    {
      db_id    = "dataset1"
      db_name  = "dataset1"
      app_name = "hello"
      iam_members = [
        {
          role   = "roles/bigquery.dataEditor"
          member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com",
        }
      ]
      tables = ["daily_inventory", "dc_inventory", "products", "daily_sales", "planned_inventory", "stores", "stores_in_program"]
      partitioned_tables = [
        {
          table = "daily_sales"
          field = "sales_timestamp"
        },
        {
          table = "daily_inventory"
          field = "inventory_timestamp"
        }
      ]
    },
    {
      db_id    = "dataset2"
      db_name  = "dataset2"
      app_name = "hello"
      iam_members = [
        {
          role   = "roles/bigquery.dataEditor"
          member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com"
        }
      ]
      partitioned_tables = []
      tables = []
    }
  ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM