Я использую 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.
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
.
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...]
}
[...]
Здесь ваш модуль lambda_API_dts
, похоже, предназначен для создания шлюза AWS API И лямбда-функций AWS.
Если вам действительно нужно иметь блок for_each
в вызывающем модуле, вы можете оставить его там, но вы также можете поместить for_each
на уровне ресурсов в блок resource
, используя мой пример в методе 1.
.
├── api-gw
│ └── main.tf
├── lambda-functions
│ └── main.tf
└── main.tf
Таким образом, вы:
Надеюсь это поможет !
Какой из них вы хотите создать?