Terraform中如何引用基于对象列表循环创建的IAM Role资源
如何在循环创建Lambda函数时引用对应IAM角色?
我在variables.tf中定义了如下对象列表变量:
variable lambda_attributes { description = "List of Lambda Objects" type = list(object({ name = string description = string runtime = string })) default = [ { name = "device-update", description = "device update function", runtime = "nodejs20.x" }, { name = "location-update ", description = "location update function", runtime = "nodejs20.x" }, { name = "ticket-update", description = "ticket update Function", runtime = "nodejs20.x" } ] }
并通过以下代码循环创建IAM角色:
resource "aws_iam_role" "role_for_lambda" { for_each = {for i, v in var.lambda_attributes: i => v} name = "iam_for_lambda_${each.value.name}" assume_role_policy = data.aws_iam_policy_document.assume_role.json }
现在需要在循环创建Lambda函数的代码中,正确引用对应的IAM角色:
resource "aws_lambda_function" "my_lambdas" { for_each = {for i, v in var.lambda_attributes: i => v} function_name = "${each.value.name}" description = "${each.value.description}" role = ??? }
解决方案
你可以通过aws_iam_role.role_for_lambda[each.key]来引用对应的IAM角色,因为两个资源使用了完全相同的for_each结构(基于var.lambda_attributes的索引i作为键),所以each.key会一一匹配到对应的IAM角色实例。
完整的Lambda函数代码如下:
resource "aws_lambda_function" "my_lambdas" { for_each = {for i, v in var.lambda_attributes: i => v} function_name = each.value.name description = each.value.description role = aws_iam_role.role_for_lambda[each.key].arn }
补充说明
- 直接使用
each.value.name而非字符串插值"${each.value.name}",Terraform支持直接引用属性值,写法更简洁。 - 必须引用IAM角色的
arn属性,因为AWS Lambda的role参数要求传入角色的ARN,而非角色名称。
内容的提问来源于stack exchange,提问作者Brian G
相关产品推荐
相关产品推荐

