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

Terraform如何在单个resource块中配置多个Lambda函数zip包

问题原因

你当前的写法将list类型的变量直接传递给了aws_lambda_function资源要求string类型的function_name、filename属性。单个resource块默认仅创建1个资源实例,无法直接接收列表类型的参数值。

解决方案

方案1:使用count循环(最小改动适配现有变量结构)

直接在resource块中添加count参数,通过索引取值即可循环创建多个Lambda实例,无需调整现有变量定义:

resource "aws_lambda_function" "main" {
  count         = length(var.lambda_name)
  function_name = var.lambda_name[count.index]
  role          = aws_iam_role.lambda.arn
  handler       = "index.handler"
  runtime       = "nodejs12.x"
  filename      = var.filename[count.index]
}

注意:需保证lambda_name和filename两个列表的长度完全一致,否则会出现索引越界错误。该方案的缺点是如果后续调整列表元素顺序,会导致对应索引的Lambda资源被重建。

方案2:使用for_each循环(更推荐,稳定性更高)

调整变量结构为Map类型,避免顺序变化导致的资源重建问题,更适合生产环境使用:

第一步:调整变量定义

variable "lambda_functions" {
  type = map(object({
    filename = string
  }))
  default = {
    testlambda1 = { filename = "testlambda1.zip" }
    testlambda2 = { filename = "testlambda2.zip" }
    testlambda3 = { filename = "testlambda3.zip" }
    testlambda4 = { filename = "testlambda4.zip" }
  }
}

第二步:修改resource块

resource "aws_lambda_function" "main" {
  for_each      = var.lambda_functions
  function_name = each.key
  role          = aws_iam_role.lambda.arn
  handler       = "index.handler"
  runtime       = "nodejs12.x"
  filename      = each.value.filename
}

该方案后续增减Lambda仅需调整lambda_functions变量中的键值对即可,不会影响其他已创建的资源。

内容的提问来源于stack exchange,提问作者Lord Beerus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:03