Я хочу, чтобы for_each применялся только к блоку кода в локалах, а не ко всему

Я использую Terraform для создания шлюза API AWS и двух функций Lambda.

Я хотел бы знать, есть ли способ применить for_each только к определенному блоку из locals при использовании модулей. Для остальных переменных в модулях я хочу, чтобы они брались либо из variables.tf, либо из местных жителей:

Ниже мой код:

locals {
  lambda_apigateway = {
    "digitalts-devtest-${var.environment}-auth" = {
      service_name          = "${var.environment}-auth"
      function_handler      = "auth.handler"
      lambda_key            = "customizedlayer.zip"
      function_name         = "${var.account}-${var.environment}"
      source_dir            = "../built/lambdahandlers/auth/"
      output_path           = "../auth.zip"
      layer_name            = var.layer_name
      create_lambda_layer   = var.create_lambda_layer
      #layers                           = var.layers
      layer_count                       = var.layer_count
      filename                          = var.filename
      #create_lambda_permission          = var.create_lambda_permission
      #create_lambda                     = var.create_lambda
      environment_variables = {
        "MATRIS_CREDENTIALS" = "MATRIS_CLIENT"
      }
    },

    "digitalts-devtest-${var.environment}-healthz" = {
      service_name          = "${var.environment}-healthz"
      function_handler      = "healthz.handler"
      lambda_key            = "customizedlayer.zip"
      function_name         = "${var.account}-${var.environment}"
      source_dir            = "../built/lambdahandlers/healthz/"
      output_path           = "../healthz.zip"
      layer_name            = var.layer_name
      create_lambda_layer   = var.create_lambda_layer
      #layers                           = var.layers
      layer_count           = var.layer_count
      filename              = var.filename
      environment_variables = {
        "MATRIS_CREDENTIALS" = "MATRIS_CLIENT"
      }
    }
   }
    
  api_gateway_variables = {
    create_apigw_rest               = var.create_apigw_rest
    create_apigw                    = var.create_apigw
    api_gateway_name                = var.api_gateway_name
    endpoint_configuration          = var.endpoint_configuration
    parent_path                     = var.parent_path
    first_sub_path                  = var.first_sub_path
    http_methods                    = var.http_methods
    authorizations                  = var.authorizations
    request_parameters              = var.request_parameters
    request_models                  = var.request_models
    integration_http_methods        = var.integration_http_methods
    integration_types               = var.integration_types
    connection_types                = var.connection_types
    uri                             = var.uri
  }
}
    

Я попробовал следующий код, но он применяет for_each ко всем местным жителям:

module "lambda_API_dts" {
  source                  = "gitlab.***"
  version                 = "0.0.49"

  for_each                = local.lambda_apigateway
  service_name            = each.key
  lambda_key              = each.value.lambda_key
  function_name           = each.value.function_name
  source_dir              = each.value.source_dir
  output_path             = each.value.output_path
  runtime                 = var.runtime
  function_handler        = var.function_handler
  timeout                 = var.timeout
  memory_size             = var.memory_size
  environment_variables   = each.value.environment_variables
  subnet_ids              = var.subnet_ids
  VPCId                   = var.vpc_id
  env                     = var.env
  filename                = var.filename
  lambda_layer_bucket     = var.lambda_layer_bucket
  s3_key_lambda_layer     = var.s3_key_lambda_layer
  layer_count             = each.value.layer_count

  #api gateway variables
  
  create_apigw_rest               = local.create_apigw_rest
  create_apigw                    = local.create_apigw
  api_gateway_name                = local.api_gateway_name
  endpoint_configuration          = local.endpoint_configuration
  parent_path                     = local.parent_path
  first_sub_path                  = local.first_sub_path
  http_methods                    = local.http_methods
  authorizations                  = local.authorizations
  request_parameters              = local.request_parameters
  request_models                  = local.request_models
  integration_http_methods        = local.integration_http_methods
  integration_types               = local.integration_types
  connection_types                = local.connection_types
  uri                             = local.uri
}

Я хочу, чтобы был создан только 1 шлюз API и 2 Lambdas.

Какой из них вы хотите создать?

Marko E 31.03.2023 16:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2


Попробуйте использовать динамический следующим образом:
module "lambda_API_dts" {
  source = "gitlab.***"
  version = "0.0.49"

  # digitalts-devtest auth, healthz

  dynamic "lambda_apigateway" {
    for_each = local.lambda_apigateway
    content {
      service_name = lambda_apigateway.key
      lambda_key = lambda_apigateway.value.lambda_key
      function_name = lambda_apigateway.value.function_name
      source_dir = lambda_apigateway.value.source_dir
      output_path = lambda_apigateway.value.output_path
      runtime = var.runtime
      function_handler = var.function_handler
      timeout = var.timeout
      memory_size = var.memory_size
      environment_variables = lambda_apigateway.value.environment_variables
      subnet_ids = var.subnet_ids
      VPCId = var.vpc_id
      env = var.env
      filename = var.filename
      lambda_layer_bucket = var.lambda_layer_bucket
      s3_key_lambda_layer = var.s3_key_lambda_layer
      layer_count = lambda_apigateway.value.layer_count
    }
  }

  #api gateway variables

  create_apigw_rest = local.create_apigw_rest
  create_apigw = local.create_apigw
  api_gateway_name = local.api_gateway_name
  endpoint_configuration = local.endpoint_configuration
  parent_path = local.parent_path
  first_sub_path = local.first_sub_path
  http_methods = local.http_methods
  authorizations = local.authorizations
  request_parameters = local.request_parameters
  request_models = local.request_models
  integration_http_methods = local.integration_http_methods
  integration_types = local.integration_types
  connection_types = local.connection_types
  uri = local.uri
}
Ответ принят как подходящий

@Shlomi, блоки dynamic не будут работать здесь, в модуле, как сказано в документации :

Вы можете динамически создавать повторяющиеся вложенные блоки [...], используя специальный тип динамического блока, который поддерживается внутри блоков resource, data, provider и provisioner.

Способ 1: депортируйте for_each в определение ресурса.

Если вы хотите оставить корневой модуль как есть по определенной причине, вы можете использовать for_each в дочернем модуле, чтобы зациклиться на нужном ресурсе. Ниже вы найдете корневой модуль и дочерний модуль:

./main.tf :

module "lambda_API_dts" {
  source                  = "gitlab.***"
  version                 = "0.0.49"

  # Pass you map of objects to your module #############
  lambda_apigateway = local.lambda_apigateway

  runtime                 = var.runtime
  function_handler        = var.function_handler
  timeout                 = var.timeout
  memory_size             = var.memory_size
  subnet_ids              = var.subnet_ids
  VPCId                   = var.vpc_id
  env                     = var.env
  filename                = var.filename
  lambda_layer_bucket     = var.lambda_layer_bucket
  s3_key_lambda_layer     = var.s3_key_lambda_layer

  #api gateway variables
  
  [...]
}

./modules/lambda_API_dts/main.tf :

[...]

resource "aws_lambda_function" "test_lambda" {

  for_each = var.lambda_apigateway
  
  [...aws_lambda_function properties...]
}

[...]

Способ 2. Разделите модули по назначению.

Здесь ваш модуль lambda_API_dts, похоже, предназначен для создания шлюза AWS API И лямбда-функций AWS.

Если вам действительно нужно иметь блок for_each в вызывающем модуле, вы можете оставить его там, но вы также можете поместить for_each на уровне ресурсов в блок resource, используя мой пример в методе 1.

.
├── api-gw
│   └── main.tf
├── lambda-functions
│   └── main.tf
└── main.tf

Таким образом, вы:

  • у вас есть 2 модуля, которые будут иметь свои собственные переменные и поведение
  • иметь возможность размещать здесь все свои лямбда-функции, а не только ваши «API-шлюзы»

Надеюсь это поможет !

Другие вопросы по теме