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
相关产品推荐
相关产品推荐

