From 274603b1a6d3ff22517ce277a200f1451f5e894b Mon Sep 17 00:00:00 2001 From: Adar Nimrod <nimrod@shore.co.il> Date: Mon, 11 Apr 2022 20:56:29 +0300 Subject: [PATCH] AWS VPC setup. --- Terraform/AWS/vpc.tf | 304 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 Terraform/AWS/vpc.tf diff --git a/Terraform/AWS/vpc.tf b/Terraform/AWS/vpc.tf new file mode 100644 index 0000000..a5691ff --- /dev/null +++ b/Terraform/AWS/vpc.tf @@ -0,0 +1,304 @@ +variable "cidr_block" { + default = "172.31.0.0/16" + description = "CIDR block for the VPC." + type = string +} + +output "cidr_block" { + description = "CIDR block for the VPC." + value = var.cidr_block +} + +resource "aws_vpc" "vpc" { + cidr_block = var.cidr_block + tags = { + Name = local.env, + } +} + +locals { + vpc_arn = aws_vpc.vpc.arn + vpc_id = aws_vpc.vpc.id + vpc_name = aws_vpc.vpc.tags.Name +} + +output "vpc_arn" { + description = "ARN of the VPC." + value = local.vpc_arn +} + +output "vpc_id" { + description = "ID of the VPC." + value = local.vpc_id +} + +output "vpc_name" { + description = "Name of the VPC." + value = local.vpc_name +} + +resource "aws_internet_gateway" "gateway" { + vpc_id = local.vpc_id + tags = { + Name = local.env, + } +} + +locals { + internet_gateway_arn = aws_internet_gateway.gateway.arn + internet_gateway_id = aws_internet_gateway.gateway.id + internet_gateway_name = aws_internet_gateway.gateway.tags["Name"] +} + +output "internet_gateway_arn" { + description = "ARN of the internet gateway." + value = local.internet_gateway_arn +} + +output "internet_gateway_id" { + description = "ID of the internet gateway." + value = local.internet_gateway_id +} + +output "internet_gateway_name" { + description = "Name of the internet gateway." + value = local.internet_gateway_name +} + +variable "subnet_count" { + default = 3 + description = "Number of each private and public subnets." + type = number +} + +output "subnet_count" { + description = "Number of each private and public subnets." + value = var.subnet_count +} + +locals { + az_mapping = { + 1 = "a" + 2 = "b" + 3 = "c" + 4 = "d" + 5 = "e" + 6 = "f" + 7 = "g" + 8 = "h" + 9 = "i" + } +} + +resource "aws_subnet" "private" { + count = var.subnet_count + availability_zone = "${var.region}${local.az_mapping[count.index + 1]}" + cidr_block = cidrsubnet(var.cidr_block, 8, count.index) + map_public_ip_on_launch = false + vpc_id = local.vpc_id + tags = { + Name = "${local.env}-private-${local.az_mapping[count.index + 1]}" + Type = "private" + } +} + +locals { + private_subnet_arns = aws_subnet.private.*.arn + private_subnet_ids = aws_subnet.private.*.id + private_subnet_names = [for i in aws_subnet.private.*.tags : i["Name"]] +} + +output "private_subnet_arns" { + description = "List of private subnets ARNs." + value = local.private_subnet_arns +} + +output "private_subnet_ids" { + description = "List of private subnets IDs." + value = local.private_subnet_ids +} + +output "private_subnet_names" { + description = "List of private subnets names." + value = local.private_subnet_names +} + +resource "aws_subnet" "public" { + count = var.subnet_count + availability_zone = "${var.region}${local.az_mapping[count.index + 1]}" + cidr_block = cidrsubnet(var.cidr_block, 8, var.subnet_count + count.index) + map_public_ip_on_launch = true + vpc_id = local.vpc_id + tags = { + Name = "${local.env}-public-${local.az_mapping[count.index + 1]}" + Type = "public" + } +} + +locals { + public_subnet_arns = aws_subnet.public.*.arn + public_subnet_ids = aws_subnet.public.*.id + public_subnet_names = [for i in aws_subnet.public.*.tags : i["Name"]] +} + +output "public_subnet_arns" { + description = "List of public subnets ARNs." + value = local.public_subnet_arns +} + +output "public_subnet_ids" { + description = "List of public subnets IDs." + value = local.public_subnet_ids +} + +output "public_subnet_names" { + description = "List of public subnets names." + value = local.public_subnet_names +} + +resource "aws_eip" "nat_eip" { + count = var.subnet_count + vpc = true + tags = { + Name = "${local.env}-${local.az_mapping[count.index + 1]}" + } + depends_on = [ + aws_internet_gateway.gateway, + ] +} + +locals { + nat_gateway_eip_ids = aws_eip.nat_eip.*.id + nat_gateway_eip_names = [for i in aws_eip.nat_eip.*.tags : i["Name"]] +} + +output "nat_gateway_eip_ids" { + description = "List of Elastic IP IDs for the NAT gateway." + value = local.nat_gateway_eip_ids +} + +output "nat_gateway_eip_names" { + description = "List of Elastic IP names for the NAT gateway." + value = local.nat_gateway_eip_names +} + +resource "aws_nat_gateway" "gateway" { + count = var.subnet_count + allocation_id = local.nat_gateway_eip_ids[count.index] + subnet_id = local.public_subnet_ids[count.index] + tags = { + Name = "${local.env}-${local.az_mapping[count.index + 1]}" + } +} + +locals { + nat_gateway_ids = aws_nat_gateway.gateway.*.id + nat_gateway_names = [for i in aws_nat_gateway.gateway.*.tags : i["Name"]] +} + +output "nat_gateway_ids" { + description = "List of NAT gateway IDs." + value = local.nat_gateway_ids +} + +output "nat_gateway_names" { + description = "List of NAT gateway names." + value = local.nat_gateway_names +} + +resource "aws_route_table" "public" { + vpc_id = local.vpc_id + tags = { + Name = "${local.env}-public" + } + + route { + cidr_block = "0.0.0.0/0" + gateway_id = local.internet_gateway_id + } +} + +locals { + public_route_table_arn = aws_route_table.public.arn + public_route_table_id = aws_route_table.public.id + public_route_table_name = aws_route_table.public.tags["Name"] +} + +output "public_route_table_arn" { + description = "ARN of the routing table for the public subnets." + value = local.public_route_table_arn +} + +output "public_route_table_id" { + description = "ID of the routing table for the public subnets." + value = local.public_route_table_id +} + +output "public_route_table_name" { + description = "Name of the routing table for the public subnets." + value = local.public_route_table_name +} + +resource "aws_route_table_association" "public" { + for_each = toset(local.public_subnet_ids) + route_table_id = local.public_route_table_id + subnet_id = each.key +} + +locals { + public_route_table_association_ids = [for i in aws_route_table_association.public : i.id] +} + +output "public_route_table_association_ids" { + description = "List of the route table associations IDs for the public subnets." + value = local.public_route_table_association_ids +} + +resource "aws_route_table" "private" { + for_each = toset(local.nat_gateway_ids) + vpc_id = local.vpc_id + tags = { + Name = "${local.env}-private-${local.az_mapping[index(local.nat_gateway_ids, each.key) + 1]}" + } + + route { + cidr_block = "0.0.0.0/0" + nat_gateway_id = each.key + } +} + +locals { + private_route_table_arns = [for i in aws_route_table.private : i.arn] + private_route_table_ids = [for i in aws_route_table.private : i.id] + private_route_table_names = [for i in aws_route_table.private : i.tags["Name"]] +} + +output "private_route_table_arns" { + description = "List of ARNs of the routing tables for the private subnets." + value = local.private_route_table_arns +} + +output "private_route_table_ids" { + description = "List of IDs of the routing tables for the private subnets." + value = local.private_route_table_ids +} + +output "private_route_table_names" { + description = "List of names of the routing tables for the private subnets." + value = local.private_route_table_names +} + +resource "aws_route_table_association" "private" { + for_each = zipmap(local.private_subnet_ids, local.private_route_table_ids) + route_table_id = each.value + subnet_id = each.key +} + +locals { + private_route_table_association_ids = [for i in aws_route_table_association.private : i.id] +} + +output "private_route_table_association_ids" { + description = "List of the route table associations IDs for the private subnets." + value = local.private_route_table_association_ids +} -- GitLab