lambda - 是否可以通过 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。请帮助知道如何做到这一点,谢谢。
解决方案
至少,您可以通过使用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 是否具有从文件系统构建映射或数组的功能,所以不能说这是否可以进一步减少,甚至不需要列出每个函数。无论如何,我个人希望在配置中明确地查看该列表,但如果您愿意,您可以进一步搜索该功能。
推荐阅读
- c# - 我使用 MS Word Interop 得到了错误的段落参数值
- c# - 使用视图组件时出现此错误
- sql-server - 如何更新 SQL Server 中的数组
- reactjs - useState 没有更新期望的状态?
- javascript - 使用大量可能名称的 Javascript 自动完成
- windows - Jupyter Notebook - 导航到驱动器
- docker - Kuberenetes 中的 Gitlab CI Runner:无法在 unix:///var/run/docker.sock 连接到 Docker 守护进程
- ordercloud - Ordercloud:使用 Postman 或 .NET SDK 时出现无效的客户端错误
- airflow - 使用 Snowflake 和 Apache Airflow,如何更改 DATABASE 或 SCHEMA 以使用 SqlSensor 进行连接?
- azure - 两个 Azure Functions 共享一个 In-Proc 集合