如何通过Terraform将数组转为map(any)动态生成API Gateway集成?
动态生成API Gateway v2的integrations配置(map类型)
我正在使用社区提供的AWS API Gateway v2模块部署API网关,采用微服务架构,需要将请求路由到多个Lambda函数。已经通过数组定义了所有微服务,并用for_each批量部署了ECR、Lambda等资源,现在希望基于这个数组动态生成API网关的integrations块(变量类型为map(any))。
我的微服务数组定义:
locals { services = ["identity", "organisation"] }
目前手动编写的integrations块如下:
module "api_gateway" { source = "../modules/apigateway" name = "${var.name}-${var.env}-api-gateway" # 其他省略配置... integrations = { "ANY /identity/{proxy+}" = { lambda_arn = module.api_lambdas["identity"].lambda_function_arn payload_format_version = "1.0" timeout_milliseconds = 12000 } "ANY /organisation/{proxy+}" = { lambda_arn = module.api_lambdas["organisation"].lambda_function_arn payload_format_version = "1.0" timeout_milliseconds = 12000 } } }
解决方案:用Terraform for表达式直接生成map结构
不需要使用dynamic块(模块不支持)或生成数组,直接通过for表达式遍历微服务数组,构建符合map(any)类型要求的integrations配置:
module "api_gateway" { source = "../modules/apigateway" name = "${var.name}-${var.env}-api-gateway" # 其他省略配置... integrations = { for service in local.services : "ANY /${service}/{proxy+}" => { lambda_arn = module.api_lambdas[service].lambda_function_arn payload_format_version = "1.0" timeout_milliseconds = 12000 } } }
扩展:支持差异化配置
如果需要给不同微服务设置不同的超时时间或其他参数,可以把local.services改成对象数组:
locals { services = [ { name = "identity" timeout = 12000 }, { name = "organisation" timeout = 15000 } ] }
对应的integrations生成逻辑调整为:
integrations = { for service in local.services : "ANY /${service.name}/{proxy+}" => { lambda_arn = module.api_lambdas[service.name].lambda_function_arn payload_format_version = "1.0" timeout_milliseconds = service.timeout } }
内容的提问来源于stack exchange,提问作者Richard Priddy
相关产品推荐
相关产品推荐

