-
Notifications
You must be signed in to change notification settings - Fork 0
root module
Aleksej Komnenovic edited this page Jun 30, 2026
·
3 revisions
The only module you call directly. Child modules are internal.
| File | Purpose |
|---|---|
main.tf |
Module composition + precondition validations |
variables.tf |
Top-level structured object variables |
outputs.tf |
Root outputs (33 values) |
locals.tf |
Component creation flags, cross-module wiring |
data.tf |
aws_region, aws_caller_identity, aws_availability_zones |
versions.tf |
Provider requirements |
The root module conditionally instantiates four child modules:
module "vpc" {
count = local.create_vpc ? 1 : 0
source = "./modules/vpc"
nat_gateway_mode = var.vpc.nat_gateway_mode
enable_vpc_endpoints = var.vpc.enable_vpc_endpoints
create_public_subnets = local.needs_public_subnets
additional_interface_endpoints = local.vpc_additional_endpoints
# ...
}
module "storage" {
count = local.create_storage ? 1 : 0
source = "./modules/storage"
# ...
}
module "database" {
count = local.create_database ? 1 : 0
source = "./modules/database"
depends_on = [module.vpc]
# ...
}
module "ecs" {
count = local.create_ecs ? 1 : 0
source = "./modules/ecs"
depends_on = [module.vpc, module.storage, module.database]
# ...
}Three terraform_data resources enforce dependency rules:
-
brms_dependencies: BRMS requires the Database Module (
databaseset), plus object storage satisfied by either the Storage Module (storageset) orbrms.external_buckets(for cross-account deployments). Two preconditions enforce this:local.create_database, andlocal.create_storage || length(coalesce(var.brms.external_buckets, [])) > 0. - agent_dependencies: Agent requires Storage Module
-
vpc_validation (existing-VPC mode): requires
vpc.idand at least oneprivate_subnet_id. Additionally, when any enabled ALB is internet-facing (alb_internal = false, the default), at least onepublic_subnet_idis required (thelocal.needs_public_subnetscheck). Setalb_internal = trueon each component to deploy ALBs in private subnets and make public subnets optional.
Boolean flags control which modules are instantiated:
locals {
create_vpc = var.vpc != null && var.vpc.create
create_storage = var.storage != null
create_bucket = local.create_storage && var.storage.create_bucket
create_database = var.database != null
create_brms = var.brms != null
create_agent = var.agent != null
create_ecs = local.create_brms || local.create_agent
}Two more locals translate component settings into VPC wiring:
-
needs_public_subnetsis true when any enabled component hasalb_internal = false. It is passed to the VPC module ascreate_public_subnetsand gates the public-subnet precondition invpc_validation. -
vpc_additional_endpointscomputes the extra interface VPC endpoints to provision:kmswhenbrms.secrets_provider.type = "aws-kms",bedrock-runtimewhenbrms.ai.provider = "amazon-bedrock", plus anyvpc.additional_vpc_endpoints. It is passed to the VPC module asadditional_interface_endpoints.
The root main.tf handles cross-module security group rules:
resource "aws_security_group_rule" "database_from_brms" {
count = local.create_brms && local.create_database ? 1 : 0
type = "ingress"
from_port = local.database_port # 5432
to_port = local.database_port # 5432
protocol = "tcp"
source_security_group_id = module.ecs[0].brms_tasks_security_group_id
security_group_id = module.database[0].security_group_id
}This allows BRMS ECS tasks to connect to the Aurora database. See Security Architecture for details.
See Variable System for how configuration flows from root variables to child modules.