Цикл for_each с динамическим блоком и значениями из tfvars

Я пытаюсь создать определенные таблицы BigQuery с time_partitioning с помощью динамического блока и хочу использовать значения из 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
}

main.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 имеет тип = список (любой)

Получающий:

Данное значение не подходит для var.dbs, объявленного в Variables.tf:9,1-15: все элементы списка должны быть одного типа.

Заранее спасибо!

Какова полная стоимость dbs? Зачем вы его обрезали, если это причина ошибки?

Marcin 20.11.2022 11:16

Эй, Марчин, я добавил полное значение для dbs

MassHysteria 20.11.2022 11:40
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
2
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

list(any) не означает, что в вашем списке могут быть элементы «любого» типа. Все элементы должны быть одного типа, и вы не можете смешивать типы, как сейчас (т.е. отсутствует второй элемент partitioned_tables). any означает только то, что TF выведет один тип для элементов, но все элементы должны быть одного типа. Итак, у вас есть три варианта:

  1. удалить type = list(any)
  2. Полностью определите свой тип с помощью аргументов optional вместо использования 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 = []
    }
  ]

Большое спасибо! кажется, что я решил первоначальную проблему, но теперь я столкнулся с другой проблемой, TF теперь пытается добавить time_partitioning ко всем таблицам после tables = , например, игнорируя partitioned_tables = [ { table = "daily_sales", field = "inventory_timestamp"}]. Я хочу добавить секционирование только для конкретной таблицы в элементе. Есть идеи, почему?

MassHysteria 20.11.2022 13:08

@MassHysteria Нет проблем. Для новой проблемы я бы предложил создать новый вопрос SO с конкретными деталями.

Marcin 21.11.2022 00:04

Мне удалось решить проблему, сделав таблицы картой вместо списка, а затем сославшись на каждый.value.id на карте для разделения. Спасибо за помощь

MassHysteria 21.11.2022 07:49

Другие вопросы по теме