Я пытаюсь создать определенные таблицы 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
list(any)
не означает, что в вашем списке могут быть элементы «любого» типа. Все элементы должны быть одного типа, и вы не можете смешивать типы, как сейчас (т.е. отсутствует второй элемент partitioned_tables
). any
означает только то, что TF выведет один тип для элементов, но все элементы должны быть одного типа. Итак, у вас есть три варианта:
type = list(any)
optional
вместо использования any
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 Нет проблем. Для новой проблемы я бы предложил создать новый вопрос SO с конкретными деталями.
Мне удалось решить проблему, сделав таблицы картой вместо списка, а затем сославшись на каждый.value.id на карте для разделения. Спасибо за помощь
Какова полная стоимость
dbs
? Зачем вы его обрезали, если это причина ошибки?