blu
May 31, 2022, 5:23pm
1
According to the documentation for Arbitrary Expressions with Argument Syntax we should be able to specify blocks like this
# Not recommended, but valid: a constant list-of-objects expression
example = [
{
foo = "bar"
},
{
foo = "baz"
},
]
But this does not seem to work giving error for resource snowflake_warehouse
An argument named “tag” is not expected here. Did you mean to define a block of type “tag”?
resource "snowflake_warehouse" "foo" {
name = "foo"
tag = [
{
name = "foor"
value = "bar"
},
{
name = "env"
value = "dev"
},
]
}
Specifying as blocks works but I am unsure how to do so dynamically (using dynamic block doesn’t seem to work as it only specifies tag block once)
resource "snowflake_warehouse" "foo" {
name = "foo"
tag {
name = "foor"
value = "bar"
}
tag {
name = "env"
value = "dev"
}
}
Any help is appreciated
The error is because there is no attribute called “tag”, as in this case it is a block. For static setups you just repeat the block as many times as you need (assuming the resource supports that) or for dynamic cases you use the dynamic block method.
1 Like
blu
May 31, 2022, 6:10pm
3
Dynamic blocks work
locals {
tags = [
{
name = "foo"
value = "bar"
},
{
name = "env"
value = "dev"
},
]
}
resource "snowflake_warehouse" "foo" {
name = "foo"
dynamic tag {
for_each = local.tags
content {
name = tag.value.name
value = tag.value.value
}
}
}
I am still not sure why the documentation says we can assign though
maxb
May 31, 2022, 6:11pm
4
That particular documentation page does say:
Rarely, some resource types also support an argument with the same name as a nested block type
and
The information on this page only applies to certain special arguments that were relying on this usage pattern prior to Terraform v0.12.
1 Like
It depends on the resource. Some accepts a list/map attribute, others expect blocks.