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"
             }
}
Другие вопросы по тегам