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

Terraform如何从Map中取值并赋值给本地变量?

解决方案

要实现仅为需要的Lambda创建aws_lambda_permission资源,核心是过滤出method_path不等于"false"的Lambda条目,而非针对单个Lambda做全局判断。具体修改如下:

1. 修正本地变量定义

替换原有的add_method_path,创建一个过滤后的Lambda映射,仅保留需要配置权限的实例:

locals {
  # 筛选出method_path不为"false"的Lambda函数
  lambdas_with_permission = {
    for k, v in var.lambda_function : k => v
    if v.method_path != "false"
  }
}

2. 调整Lambda权限资源的for_each

将aws_lambda_permission的for_each指向上述过滤后的映射,这样只会为符合条件的Lambda生成权限资源:

resource "aws_lambda_permission" "lmp" {
  for_each      = local.lambdas_with_permission
  statement_id  = "AllowAPIGatewayInvoke-${each.key}" # 添加唯一ID避免冲突
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lm[each.key].function_name
  principal     = "apigateway.amazonaws.com"
  source_arn    = "${var.ag_id}/*${each.value.method_path}"
}

额外修正点

  • 你的aws_lambda_function资源中for_each使用了var.lambda_function_l3,但变量定义里只有var.lambda_function,属于笔误,需修正为var.lambda_function否则会报错。
  • layers字段判断逻辑有误,原代码中each.value.layer1 == "null"应改为each.value.layers == null,结合变量定义调整后:
layers = each.value.layers != null ? [aws_lambda_layer_version.lm[each.value.layers[0]].arn] : null

(注:若layers是多元素列表,可根据实际需求调整取值逻辑)

完整修改后的核心代码片段

main.tf

locals {
  lambdas_with_permission = {
    for k, v in var.lambda_function : k => v
    if v.method_path != "false"
  }
}

resource "aws_lambda_function" "lm" {
  for_each      = var.lambda_function # 修正笔误
  s3_bucket     = aws_s3_bucket.lm.id
  s3_key        = "code/${each.value.s3_key}"
  function_name = "lm-${var.stack_id}-${each.key}"
  role          = aws_iam_role.lm[each.value.role].arn
  handler       = "index.${each.value.handler}"
  runtime       = each.value.runtime
  memory_size   = each.value.memory_size
  layers        = each.value.layers != null ? [aws_lambda_layer_version.lm[each.value.layers[0]].arn] : null
  depends_on    = [aws_lambda_layer_version.lm]
  
  environment {
    variables = each.value.env_key
  }
  
  vpc_config {
    subnet_ids         = [local.subnet_private[0], local.subnet_private[5]]
    security_group_ids = ["sg-0591b309a73f15dd4"]
  }
}

resource "aws_lambda_permission" "lmp" {
  for_each      = local.lambdas_with_permission
  statement_id  = "AllowAPIGatewayInvoke-${each.key}"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lm[each.key].function_name
  principal     = "apigateway.amazonaws.com"
  source_arn    = "${var.ag_id}/*${each.value.method_path}"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:57:08