Terraform: как предоставить несколько zip-файлов лямбда-функций в одном блоке ресурсов
рабочий фрагмент для 1 лямбда-функции. Terraform версия 0.14.9.
resource "aws_lambda_function" "main" {
function_name = var.lambda_name
role = aws_iam_role.lambda.arn
handler = "index.handler"
runtime = "nodejs12.x"
filename = "testlambda1.zip"
}
variable "lambda_name" {
default = "testlambda1"
}
Я новичок в терраформе. У меня всего 4 лямбда-функции в формате zip. Как разместить их все в одном блоке ресурсов.
resource "aws_lambda_function" "main" {
function_name = var.lambda_name
role = aws_iam_role.lambda.arn
handler = "index.handler"
runtime = "nodejs12.x"
filename = var.filename
}
variable "lambda_name" {
type = list(string)
default = [
"testlambda1",
"testlambda2",
"testlambda3",
"testlambda4"
]
}
variable "filename" {
type = list(string)
default = [
"testlambda1.zip",
"testlambda2.zip",
"testlambda3.zip",
"testlambda4.zip"
]
}
Я пробовал это, но в итоге возникла ошибка.
Error: Incorrect attribute value type
on main-lambda.tf line 6, in resource "aws_lambda_function" "main":
6: function_name = var.lambda_name
Inappropriate value for attribute "function_name": string required.
Error: Incorrect attribute value type
on main-lambda.tf line 10, in resource "aws_lambda_function" "main":
10: filename = var.filename
Inappropriate value for attribute "filename": string required.
1 ответ
Если вы хотите, чтобы один ресурсный блок создавал несколько ресурсов, вам нужно использовать Terraform for_each или подсчитывать мета-аргументы.
Например:
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]
}
variable "lambda_name" {
type = list(string)
default = [
"testlambda1",
"testlambda2",
"testlambda3",
"testlambda4"
]
}
variable "filename" {
type = list(string)
default = [
"testlambda1.zip",
"testlambda2.zip",
"testlambda3.zip",
"testlambda4.zip"
]
}
или преобразование ваших переменных в карту и использование
for_each
:
resource "aws_lambda_function" "main" {
for_each = var.lambdas
function_name = each.key
role = aws_iam_role.lambda.arn
handler = "index.handler"
runtime = "nodejs12.x"
filename = each.value
}
variable "lambdas" {
type = map(string)
default = {
"testlambda1" = "testlambda1.zip",
"testlambda2" = "testlambda2.zip",
"testlambda3" = "testlambda3.zip",
"testlambda4" = "testlambda4.zip"
}
}