1
votes

I'm creating a module to make easy to provision a BigQuery table in GCP. My module is working, but now I'm trying to add the option to create the table based in external data, like a GCS bucket.

In the doc (https://www.terraform.io/docs/providers/google/r/bigquery_table.html#external_data_configuration) are saying this configuration is supported, but I get only this error:

Acquiring state lock. This may take a few moments...

Error: Unsupported block type

  on ../../modules/bq_table/main.tf line 24, in resource "google_bigquery_table" "default":
  24:   external_data_configuration {

Blocks of type "external_data_configuration" are not expected here.

Im using the last Terraform version (0.12.5) and google provider v2.10.0 in Mac OS.

Here is my module code in HCL2:

resource "google_bigquery_table" "default" {
  dataset_id  = "${terraform.workspace}_${var.bq_dataset_id}"
  table_id    = "${terraform.workspace}_${var.bq_table_id}"
  project     = (var.project_id != "" ? var.project_id : null)
  description = (var.bq_table_description != "" ? var.project_id : null)
  expiration_time = (var.bq_table_expiration_time != null ? var.project_id : null)
  friendly_name = (var.bq_table_name != "" ? var.project_id : null)

  dynamic "external_data_configuration" {
    for_each = var.bq_table_external_data_configuration
    content {
      autodetect = true
      source_format = "NEWLINE_DELIMITED_JSON"
      source_uris = [external_data_configuration.value]
    }
  }

  time_partitioning {
    type = "DAY"
    field = var.bq_table_partition_field
  }

  labels = var.bq_table_labels

  schema = (var.bq_table_schema != "" ? var.bq_table_schema : null)

  dynamic "view" {
    for_each = (var.bq_table_view_query != "" ? {query = var.bq_table_view_query} : {})
    content {
      query = view.value
    }
  }

  depends_on = ["null_resource.depends_on"]
}

Above im using Dynamic blocks, but tried to use normally and the error is the same.

1

1 Answers

0
votes

The for_each property inside your dynamic block expects an array value. Try wrapping the input variable in an array:

dynamic "external_data_configuration" {
    for_each = var.bq_table_external_data_configuration ? [var.bq_table_external_data_configuration] : []
    content {
      autodetect = true
      source_format = "NEWLINE_DELIMITED_JSON"
      source_uris = [external_data_configuration.value]
    }
}

Conditional blocks are still a bit of a hassle even after Terraform 0.12; read here for more.