是否可以通过Terraform中的Loop将多个存储lambda函数的目录重复上传到AWS lambda?
Is it possible to upload multiple directories storing lambda function to AWS lambda repeatedly by Loop in Terraform?
我在同一目录下有 3 到 4 个包含 lambda 函数和相关文件的文件夹:functions。使用下面的代码块将这些文件夹一一存档并上传到 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 函数的数量,我想通过使用循环将代码块更改为可重复用于所有 lambda 函数,这样我就不需要再添加代码块了.请帮忙知道怎么做,谢谢
至少,您可以通过使用 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 是否具有从文件系统构建映射或数组的功能,所以不能说这是否可以进一步减少到甚至不需要列出每个函数。无论如何,我个人希望在配置中明确看到该列表,但如果需要,您可以进一步搜索该功能。
我在同一目录下有 3 到 4 个包含 lambda 函数和相关文件的文件夹:functions。使用下面的代码块将这些文件夹一一存档并上传到 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 函数的数量,我想通过使用循环将代码块更改为可重复用于所有 lambda 函数,这样我就不需要再添加代码块了.请帮忙知道怎么做,谢谢
至少,您可以通过使用 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 是否具有从文件系统构建映射或数组的功能,所以不能说这是否可以进一步减少到甚至不需要列出每个函数。无论如何,我个人希望在配置中明确看到该列表,但如果需要,您可以进一步搜索该功能。