You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:08