使用 Terraform 在对象内迭代列表
Iterate a list inside an object with Terraform
我正在尝试迭代一个对象列表,每个对象内部都有一个字符串列表,但我遇到了问题。
我尝试使用动态块,但出现错误不支持的块类型。
我这样声明我的变量:
variable "test" {
type = list(object({
name = string
nicknames = list(string)
}))
default = [
{
name = "Phoebe"
nicknames = ["Pheebs", "Phalange"]
},
{
name = "Chandler"
nicknames = ["Chanchan", "Mr. Bing"]
}
]
}
我的资源是这样的:
resource "aws_lambda_function" "test_lambda" {
for_each = {for i, v in var.teste: i => v}
name = each.value.name
nicknames = each.value.nicknames
dynamic "nicknames_list" {
for_each = [each.value.nicknames]
content {
opn = nicknames_list.value
}
}
}
如何迭代一个包含列表的对象?
您可以扁平化您的test
为更for_each
友好的结构:
variable "test" {
type = list(object({
name = string
nicknames = list(string)
}))
default = [
{
name = "Phoebe"
nicknames = ["Pheebs", "Phalange"]
},
{
name = "Chandler"
nicknames = ["Chanchan", "Mr. Bing"]
}
]
}
locals {
test_flat = merge([
for idx, val in var.test:
{
for name, nickname in val.nicknames:
"${idx}-${name}-${nickname}" => {
name = name
nickname = nickname
}
}
]...)
}
这将导致 test_flat
的
{
"0-0-Pheebs" = {
"name" = 0
"nickname" = "Pheebs"
}
"0-1-Phalange" = {
"name" = 1
"nickname" = "Phalange"
}
"1-0-Chanchan" = {
"name" = 0
"nickname" = "Chanchan"
}
"1-1-Mr. Bing" = {
"name" = 1
"nickname" = "Mr. Bing"
}
}
我不确定你想在 aws_lambda_function
中做什么,因为 nicknames
或 nicknames_list
等属性不正确 .但是您可以使用展平列表(仅作为示例,因为您的 aws_lambda_function
一开始就不正确)
resource "aws_lambda_function" "test_lambda" {
for_each = local.test_flat
function_name = each.value.name
# some other attribute = each.value.nickname
}
我正在尝试迭代一个对象列表,每个对象内部都有一个字符串列表,但我遇到了问题。
我尝试使用动态块,但出现错误不支持的块类型。
我这样声明我的变量:
variable "test" {
type = list(object({
name = string
nicknames = list(string)
}))
default = [
{
name = "Phoebe"
nicknames = ["Pheebs", "Phalange"]
},
{
name = "Chandler"
nicknames = ["Chanchan", "Mr. Bing"]
}
]
}
我的资源是这样的:
resource "aws_lambda_function" "test_lambda" {
for_each = {for i, v in var.teste: i => v}
name = each.value.name
nicknames = each.value.nicknames
dynamic "nicknames_list" {
for_each = [each.value.nicknames]
content {
opn = nicknames_list.value
}
}
}
如何迭代一个包含列表的对象?
您可以扁平化您的test
为更for_each
友好的结构:
variable "test" {
type = list(object({
name = string
nicknames = list(string)
}))
default = [
{
name = "Phoebe"
nicknames = ["Pheebs", "Phalange"]
},
{
name = "Chandler"
nicknames = ["Chanchan", "Mr. Bing"]
}
]
}
locals {
test_flat = merge([
for idx, val in var.test:
{
for name, nickname in val.nicknames:
"${idx}-${name}-${nickname}" => {
name = name
nickname = nickname
}
}
]...)
}
这将导致 test_flat
的
{
"0-0-Pheebs" = {
"name" = 0
"nickname" = "Pheebs"
}
"0-1-Phalange" = {
"name" = 1
"nickname" = "Phalange"
}
"1-0-Chanchan" = {
"name" = 0
"nickname" = "Chanchan"
}
"1-1-Mr. Bing" = {
"name" = 1
"nickname" = "Mr. Bing"
}
}
我不确定你想在 aws_lambda_function
中做什么,因为 nicknames
或 nicknames_list
等属性不正确 .但是您可以使用展平列表(仅作为示例,因为您的 aws_lambda_function
一开始就不正确)
resource "aws_lambda_function" "test_lambda" {
for_each = local.test_flat
function_name = each.value.name
# some other attribute = each.value.nickname
}