首页 > 解决方案 > 是否可以通过 Terraform 中的 Loop 反复将存储 lambda 函数的多个目录上传到 AWS lambda?

问题描述

我在同一目录下有 3 到 4 个包含 lambda 函数和相关文件的文件夹:函数。使用下面的 Code-Block 将这些文件夹一一归档并上传到 AWS lambda。

### Set each Lambda function's name and its path
locals {
  # Lambda Functions
  lambda_id-1            = "L1"
  lambda_source_dir-1    = "./functions/L1/"

  lambda_id-2            = "L2"
  lambda_source_dir-2    = "./functions/L2/"

  lambda_id-3            = "L3"
  lambda_source_dir-3    = "./functions/L3/"
}

### Code-Block to Zip & Upload lambda function
#########################################################################
data "archive_file" "file-preparation-1" {
  type        = "zip"
  source_dir  = local.lambda_source_dir-1
  output_path = "${local.lambda_source_dir-1}.zip"

  # Ref. https://github.com/hashicorp/terraform-provider-archive/issues/39
  depends_on = [
    null_resource.dummy_trigger
  ]
}

resource "aws_lambda_function" "upload-lambda-1" {
  function_name = local.lambda_id-1
  filename      = data.archive_file.file-preparation-1.output_path

  role          = aws_iam_role.lambda_upload_role.arn
  handler       = "index.handler"
  runtime       = "nodejs12.x"

  tags        = var.extra_tags,
  )

  source_code_hash = data.archive_file.file-preparation-1.output_base64sha256
  depends_on = [
    data.archive_file.file-preparation-1
  ]
}
#########################################################################
# This code-block is repeated as many times as the number of lambdas
...

使用上述方法,每次我们需要上传新的 lambda 函数时,除了将新的 lambda 函数的名称和路径插入到locals之外,我们还必须在底部添加更多的代码块

由于我们计划增加 Lambda 函数的数量,我想通过使用循环将 Code-Block 更改为可重复用于所有 lambda 函数,这样我就不需要再添加 Code-Block。请帮助知道如何做到这一点,谢谢。

标签: lambdaterraformarchive-file

解决方案


至少,您可以通过使用for_each功能大大减少所需的重复次数。

对于您的情况,结果看起来像

### Set each Lambda function's name and its path
locals {
  # Lambda Functions
  functions = {
    "L1": "./functions/L1",
    "L2": "./functions/L2",
    "L3": "./functions/L3",
  }
}

data "archive_file" "lambda_source" {
  for_each = local.functions

  type        = "zip"
  source_dir  = each.value
  output_path = "${each.value}.zip"

  # Ref. https://github.com/hashicorp/terraform-provider-archive/issues/39
  depends_on = [
    null_resource.dummy_trigger
  ]
}

resource "aws_lambda_function" "function" {
  for_each = local.functions

  function_name = each.key
  filename      = data.archive_file.lambda_source[each.key].output_path

  role          = aws_iam_role.lambda_upload_role.arn
  handler       = "index.handler"
  runtime       = "nodejs12.x"

  tags        = var.extra_tags

  source_code_hash = data.archive_file.lambda_source[each.key].output_base64sha256
}

现在要添加一个新功能,您只需将其添加到functions顶部的地图中;其他两个块不需要重复。

我还没有研究 Terraform 是否具有从文件系统构建映射或数组的功能,所以不能说这是否可以进一步减少,甚至不需要列出每个函数。无论如何,我个人希望在配置中明确地查看该列表,但如果您愿意,您可以进一步搜索该功能。


推荐阅读