Terraform 地形错误,每个地形都有动态块
我正在尝试使用azuremrm资源实例化azure存储共享映射。根据设计,我需要能够用同一块实例化多个存储共享;这些股票中的每一个可能有也可能没有“acl”部分 我正在考虑使用for_each和动态块来解决这个问题,如相关SE问题: Main.tfTerraform 地形错误,每个地形都有动态块,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我正在尝试使用azuremrm资源实例化azure存储共享映射。根据设计,我需要能够用同一块实例化多个存储共享;这些股票中的每一个可能有也可能没有“acl”部分 我正在考虑使用for_each和动态块来解决这个问题,如相关SE问题: Main.tf resource "azurerm_storage_share" "storage_share" { for_each = var.storage_share_map name
resource "azurerm_storage_share" "storage_share" {
for_each = var.storage_share_map
name = each.key
storage_account_name = azurerm_storage_account.sa.name
quota = each.value.quota
dynamic "acl" {
for_each = each.value.acl
content {
id = acl.value.id
access_policy {
permissions = acl.value.access_policy.permissions
start = acl.value.access_policy.start
expiry = acl.value.access_policy.expiry
}
}
}
变量的定义如下:
variable "storage_share_map" {
type = map(object({
quota = number,
acl = object({
id = string,
access_policy = object({
expiry = string,
permissions = string,
start = string
})
}),
}))
default = {}
}
后来在我的测试中参数化为:
storage_share_map = {
my-share-2 = {
quota = 123,
acl = {
id = "a-id",
access_policy = {
expiry = "ISO8061 UTC TIME"
permissions = "rwdl"
start = "ISO8601 UTC TIME"
},
},
}
但是,在测试时,terraform返回以下输出:
Error: Unsupported attribute
on .terraform\modules\sa\main.tf line 83, in resource "azurerm_storage_share" "storage_share":
83: id = acl.value.id
|----------------
| acl.value is object with 3 attributes
This object does not have an attribute named "id".
Error: Unsupported attribute
on .terraform\modules\sa\main.tf line 83, in resource "azurerm_storage_share" "storage_share":
83: id = acl.value.id
|----------------
| acl.value is "a-id"
This value does not have any attributes.
Error: Unsupported attribute
on .terraform\modules\sa\main.tf line 86, in resource "azurerm_storage_share" "storage_share":
86: permissions = acl.value.access_policy.permissions
|----------------
| acl.value is object with 3 attributes
This object does not have an attribute named "access_policy".
Error: Unsupported attribute
on .terraform\modules\sa\main.tf line 86, in resource "azurerm_storage_share" "storage_share":
86: permissions = acl.value.access_policy.permissions
|----------------
| acl.value is "a-id"
This value does not have any attributes.
据我所知,这里的问题是,动态块中的for_each要么格式不正确,要么行为不正常:acl.value的值似乎既是字符串“a-id”,又带有三个属性(?)
地形版本0.12.26
Azurerm2.26.0版
如有任何见解,将不胜感激
相关问题:
请使用方括号表示
每个.value.acl
Azure存储共享块应类似于:
resource "azurerm_storage_share" "storage_share" {
for_each = var.storage_share_map
name = each.key
storage_account_name = azurerm_storage_account.sa.name
quota = each.value.quota
dynamic "acl" {
for_each = [each.value.acl]
content {
id = acl.value.id
access_policy {
permissions = acl.value.access_policy.permissions
start = acl.value.access_policy.start
expiry = acl.value.access_policy.expiry
}
}
}
}
通过使用
for_each=each.value.acl在动态块中进行迭代,可以迭代对象
类型中的值。看起来您确实想在acl
本身上迭代。您需要将您的类型调整为:
variable "storage_share_map" {
type = map(object({
quota = number,
acl = list(object({
...
}))
})),
}
从错误消息中可以看出,当前它正在迭代id
,然后是access\u policy
,并且无法找到每个属性的两个请求属性,这就是为什么会出现2*2=4个错误
您可以相应地调整输入,以:
storage_share_map = {
my-share-2 = {
quota = 123,
acl = [{
id = "a-id",
access_policy = {
expiry = "ISO8061 UTC TIME"
permissions = "rwdl"
start = "ISO8601 UTC TIME"
},
}],
}
这将实现你想要的行为
请注意,Terraform 0.12有时在嵌套对象类型规范方面存在问题,因此在某些情况下,省略[]
的acl
可能会导致崩溃。谢谢您的回答。我对您的解决方案进行了一些修改,但在terraform管理列表的方式上遇到了一个问题。最后我自己开发了Matt Schuchard提出的答案;)是的,我在阅读之前使用了你的解决方案。似乎更稳定;我痛苦地意识到这些错误