diff --git a/subnets/availabilty_zones.tf b/subnets/availabilty_zones.tf new file mode 120000 index 0000000..00a240c --- /dev/null +++ b/subnets/availabilty_zones.tf @@ -0,0 +1 @@ +../common/availabilty_zones.tf \ No newline at end of file diff --git a/subnets/data.tf b/subnets/data.tf new file mode 120000 index 0000000..995624d --- /dev/null +++ b/subnets/data.tf @@ -0,0 +1 @@ +../common/data.tf \ No newline at end of file diff --git a/subnets/defaults.tf b/subnets/defaults.tf new file mode 120000 index 0000000..a5556ac --- /dev/null +++ b/subnets/defaults.tf @@ -0,0 +1 @@ +../common/defaults.tf \ No newline at end of file diff --git a/subnets/main.tf b/subnets/main.tf new file mode 100644 index 0000000..1f2f052 --- /dev/null +++ b/subnets/main.tf @@ -0,0 +1,109 @@ +/* +* # About aws-vpc-setup :: subnets +* +* This submodule creates public and private subnets. +* +* # Usage +* +* ```hcl +* module "subnets" { +* source = "git@github.e.it.census.gov:terraform-modules/aws-vpc-setup.git//subnets" +* availability_zones = var.availability_zones +* public_subnets = [ { base_cidr = "10.188.16.0/24", label = "public", bits = 2, private = false } ] +* private_subnets = [ +* { base_cidr = "10.188.18.0/23", label = "private-lb", bits = 2, private = true }, +* { base_cidr = "10.188.20.0/23", label = "db", bits = 2, private = true }, +* { base_cidr = "10.188.22.0/23", label = "apps", bits = 2, private = true } ] +* +* vpc_name = var.vpc_name +* vpc_cidr_block = var.vpc_cidr_block +* vpc_index = var.vpc_index +* vpc_short_name = var.vpc_short_name +* vpc_full_name = var.vpc_full_name +* vpc_environment = var.vpc_environment +* +* tags = {} +* } +*/ + +locals { + account_id = var.account_id != "" ? var.account_id : data.aws_caller_identity.current.account_id + account_environment = data.aws_arn.current.partition == "aws-us-gov" ? "gov" : "ew" + + base_tags = { + "boc:tf_module_version" = local._module_version + "boc:created_by" = "terraform" + } + + availability_zones = length(var.availability_zones) != 0 ? var.availability_zones : data.aws_availability_zones.zones.names + az_count = length(local.availability_zones) + az_count_list = range(local.az_count) + az_list = toset(local.availability_zones) + empty = toset([]) +} + +#--- +# public subnets +#--- +locals { + public_subnets = { for v in var.public_subnets : v.label => + { + base_cidr = v.base_cidr + label = v.label + bits = v.bits + private = v.private + subnets = [for i in local.az_count_list : cidrsubnet(v.base_cidr, v.bits, i)] + labels = [for az in local.availability_zones : format("%s-%s", v.label, az)] + availability_zones = local.availability_zones + } + } + public_map = flatten([for k, v in local.public_subnets : + [for i in local.az_count_list : tomap({ "subnet" = v.subnets[i], "label" = v.labels[i], "availability_zone" = v.availability_zones[i] })]]) +} + + +resource "aws_subnet" "public" { + for_each = { for subnet in local.public_map : subnet.label => subnet } + vpc_id = var.vpc_id + cidr_block = each.value.subnet + availability_zone = each.value.availability_zone + + tags = merge( + local.base_tags, + var.tags, + map("Name", format("%v%v-%v", local._prefixes["subnet"], var.vpc_full_name, each.value.label)) + ) +} + + +#--- +# private subnets +#--- +locals { + private_subnets = { for v in var.private_subnets : v.label => + { + base_cidr = v.base_cidr + label = v.label + bits = v.bits + private = v.private + subnets = [for i in local.az_count_list : cidrsubnet(v.base_cidr, v.bits, i)] + labels = [for az in local.availability_zones : format("%s-%s", v.label, az)] + availability_zones = local.availability_zones + } + } + private_map = flatten([for k, v in local.private_subnets : + [for i in local.az_count_list : tomap({ "subnet" = v.subnets[i], "label" = v.labels[i], "availability_zone" = v.availability_zones[i] })]]) +} + +resource "aws_subnet" "private" { + for_each = { for subnet in local.private_map : subnet.label => subnet } + vpc_id = var.vpc_id + cidr_block = each.value.subnet + availability_zone = each.value.availability_zone + + tags = merge( + local.base_tags, + var.tags, + map("Name", format("%v%v-%v", local._prefixes["subnet"], var.vpc_full_name, each.value.label)) + ) +} diff --git a/subnets/prefixes.tf b/subnets/prefixes.tf new file mode 120000 index 0000000..7e265d5 --- /dev/null +++ b/subnets/prefixes.tf @@ -0,0 +1 @@ +../common/prefixes.tf \ No newline at end of file diff --git a/subnets/variables.common.tf b/subnets/variables.common.tf new file mode 120000 index 0000000..7439ed8 --- /dev/null +++ b/subnets/variables.common.tf @@ -0,0 +1 @@ +../common/variables.common.tf \ No newline at end of file diff --git a/subnets/variables.common.vpc.tf b/subnets/variables.common.vpc.tf new file mode 120000 index 0000000..5e77d37 --- /dev/null +++ b/subnets/variables.common.vpc.tf @@ -0,0 +1 @@ +../common/variables.common.vpc.tf \ No newline at end of file diff --git a/subnets/variables.subnets.tf b/subnets/variables.subnets.tf new file mode 100644 index 0000000..39a32d6 --- /dev/null +++ b/subnets/variables.subnets.tf @@ -0,0 +1,33 @@ +variable "availability_zones" { + description = "AWS Availability Zones to use (by default will use all available)" + type = list(string) + default = [] +} + +variable "public_subnets" { + description = "List of objects with public subnet information to be created" + type = list(object({ + base_cidr = string + label = string + bits = number + private = bool + # subnets = list(string) + # labels = list(string) + # availability_zones = list(string) + })) + default = [] +} + +variable "private_subnets" { + description = "List of objects with private subnet information to be created" + type = list(object({ + base_cidr = string + label = string + bits = number + private = bool + # subnets = list(string) + # labels = list(string) + # availability_zones = list(string) + })) + default = [] +} diff --git a/subnets/version.tf b/subnets/version.tf new file mode 120000 index 0000000..b83c5b7 --- /dev/null +++ b/subnets/version.tf @@ -0,0 +1 @@ +../common/version.tf \ No newline at end of file diff --git a/vpc/locals.tf b/vpc/locals.tf index bc406a1..1551cf4 100644 --- a/vpc/locals.tf +++ b/vpc/locals.tf @@ -1,31 +1,3 @@ locals { - az_list = data.aws_availability_zones.zones.names - az_count = length(local.az_list) - az_count_list = range(local.az_count) - region = data.aws_region.current.name -} - -data "aws_availability_zones" "zones" { - state = "available" -} - -data "aws_availability_zone" "zone" { - count = length(data.aws_availability_zones.zones.names) - state = "available" - name = data.aws_availability_zones.zones.names[count.index] -} - -output "availability_zone_names" { - description = "VPC Availability zone name list (3)" - value = data.aws_availability_zones.zones.names -} - -output "availability_zone_ids" { - description = "VPC Availability zone id list (3)" - value = data.aws_availability_zones.zones.zone_ids -} - -output "availability_zone_suffixes" { - description = "VPC Availability zone suffix list (3)" - value = data.aws_availability_zone.zone[*].name_suffix + region = data.aws_region.current.name }