diff options
Diffstat (limited to 'fdio.infra.terraform/terraform-aws-vpc')
10 files changed, 320 insertions, 0 deletions
diff --git a/fdio.infra.terraform/terraform-aws-vpc/README.md b/fdio.infra.terraform/terraform-aws-vpc/README.md new file mode 100644 index 0000000000..52f6d1cfc7 --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/README.md @@ -0,0 +1,58 @@ +<!-- BEGIN_TF_DOCS --> +## Requirements + +| Name | Version | +|------|---------| +| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0.4 | +| <a name="requirement_aws"></a> [aws](#requirement\_aws) | ~> 4.3.0 | + +## Providers + +| Name | Version | +|------|---------| +| <a name="provider_aws"></a> [aws](#provider\_aws) | ~> 4.3.0 | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [aws_internet_gateway.internet_gateway](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/internet_gateway) | resource | +| [aws_route.route](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route) | resource | +| [aws_security_group.security_group](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource | +| [aws_subnet.subnet](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/subnet) | resource | +| [aws_vpc.vpc](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc) | resource | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| <a name="input_security_group_description"></a> [security\_group\_description](#input\_security\_group\_description) | Security group description. | `string` | `"Allow inbound/outbound traffic"` | no | +| <a name="input_security_group_egress"></a> [security\_group\_egress](#input\_security\_group\_egress) | Egress security group map. | `list(any)` | <pre>[<br> {<br> "cidr_blocks": [<br> "0.0.0.0/0"<br> ],<br> "from_port": 0,<br> "ipv6_cidr_blocks": [<br> "::/0"<br> ],<br> "protocol": "-1",<br> "to_port": 0<br> }<br>]</pre> | no | +| <a name="input_security_group_ingress"></a> [security\_group\_ingress](#input\_security\_group\_ingress) | Ingress security group map. | `list(any)` | <pre>[<br> {<br> "cidr_blocks": [<br> "0.0.0.0/0"<br> ],<br> "from_port": 22,<br> "ipv6_cidr_blocks": [<br> "::/0"<br> ],<br> "protocol": "tcp",<br> "self": false,<br> "to_port": 22<br> },<br> {<br> "cidr_blocks": [<br> "0.0.0.0/0"<br> ],<br> "from_port": 0,<br> "ipv6_cidr_blocks": [<br> "::/0"<br> ],<br> "protocol": -1,<br> "self": true,<br> "to_port": 0<br> }<br>]</pre> | no | +| <a name="input_security_group_name"></a> [security\_group\_name](#input\_security\_group\_name) | Name of the security group. | `string` | n/a | yes | +| <a name="input_security_group_revoke_rules_on_delete"></a> [security\_group\_revoke\_rules\_on\_delete](#input\_security\_group\_revoke\_rules\_on\_delete) | Instruct Terraform to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself. | `bool` | `false` | no | +| <a name="input_subnet_assign_ipv6_address_on_creation"></a> [subnet\_assign\_ipv6\_address\_on\_creation](#input\_subnet\_assign\_ipv6\_address\_on\_creation) | Specify true to indicate that network interfaces created in the specified subnet should be assigned an IPv6 address. | `bool` | `false` | no | +| <a name="input_subnet_availability_zone"></a> [subnet\_availability\_zone](#input\_subnet\_availability\_zone) | AWS availability zone | `string` | `"us-east-1a"` | no | +| <a name="input_subnet_map_public_ip_on_launch"></a> [subnet\_map\_public\_ip\_on\_launch](#input\_subnet\_map\_public\_ip\_on\_launch) | Specify true to indicate that instances launched into the subnet should be assigned a public IP address. | `bool` | `false` | no | +| <a name="input_tags_environment"></a> [tags\_environment](#input\_tags\_environment) | Environment used for tag. | `string` | `""` | no | +| <a name="input_tags_name"></a> [tags\_name](#input\_tags\_name) | Name used for tag. | `string` | `""` | no | +| <a name="input_vpc_assign_generated_ipv6_cidr_block"></a> [vpc\_assign\_generated\_ipv6\_cidr\_block](#input\_vpc\_assign\_generated\_ipv6\_cidr\_block) | Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. | `bool` | `true` | no | +| <a name="input_vpc_cidr_block"></a> [vpc\_cidr\_block](#input\_vpc\_cidr\_block) | The CIDR block for the association. | `string` | `"192.168.0.0/24"` | no | +| <a name="input_vpc_enable_dns_hostnames"></a> [vpc\_enable\_dns\_hostnames](#input\_vpc\_enable\_dns\_hostnames) | Whether or not the VPC has DNS hostname support. | `bool` | `true` | no | +| <a name="input_vpc_enable_dns_support"></a> [vpc\_enable\_dns\_support](#input\_vpc\_enable\_dns\_support) | Whether or not the VPC has DNS support. | `bool` | `true` | no | +| <a name="input_vpc_instance_tenancy"></a> [vpc\_instance\_tenancy](#input\_vpc\_instance\_tenancy) | The allowed tenancy of instances launched into the selected VPC. | `string` | `"default"` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| <a name="output_vpc_id"></a> [vpc\_id](#output\_vpc\_id) | The ID of the VPC. | +| <a name="output_vpc_ipv6_cidr_block"></a> [vpc\_ipv6\_cidr\_block](#output\_vpc\_ipv6\_cidr\_block) | IPv6 CIDR block. | +| <a name="output_vpc_main_route_table_id"></a> [vpc\_main\_route\_table\_id](#output\_vpc\_main\_route\_table\_id) | The ID of the Main Route Table. | +| <a name="output_vpc_security_group_id"></a> [vpc\_security\_group\_id](#output\_vpc\_security\_group\_id) | The ID of the Security Group. | +| <a name="output_vpc_subnet_id"></a> [vpc\_subnet\_id](#output\_vpc\_subnet\_id) | The ID of the Subnet. | +<!-- END_TF_DOCS -->
\ No newline at end of file diff --git a/fdio.infra.terraform/terraform-aws-vpc/example/main.tf b/fdio.infra.terraform/terraform-aws-vpc/example/main.tf new file mode 100644 index 0000000000..9d9469754d --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/example/main.tf @@ -0,0 +1,7 @@ +module "vpc" { + source = "../" + security_group_name = "terraform-sg" + subnet_availability_zone = "us-east-1a" + tags_name = "terraform-vpc" + tags_environment = "terraform-vpc-environment" +} diff --git a/fdio.infra.terraform/terraform-aws-vpc/example/output.tf b/fdio.infra.terraform/terraform-aws-vpc/example/output.tf new file mode 100644 index 0000000000..c26bbaecb6 --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/example/output.tf @@ -0,0 +1,4 @@ +output "vpc_id" { + value = module.vpc.vpc_id + description = "The ID of the VPC" +}
\ No newline at end of file diff --git a/fdio.infra.terraform/terraform-aws-vpc/example/providers.tf b/fdio.infra.terraform/terraform-aws-vpc/example/providers.tf new file mode 100644 index 0000000000..5ff54f0d65 --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/example/providers.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = var.region +}
\ No newline at end of file diff --git a/fdio.infra.terraform/terraform-aws-vpc/example/variables.tf b/fdio.infra.terraform/terraform-aws-vpc/example/variables.tf new file mode 100644 index 0000000000..f75f3d547f --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/example/variables.tf @@ -0,0 +1,5 @@ +variable "region" { + description = "AWS Region." + type = string + default = "us-east-1" +} diff --git a/fdio.infra.terraform/terraform-aws-vpc/example/versions.tf b/fdio.infra.terraform/terraform-aws-vpc/example/versions.tf new file mode 100644 index 0000000000..7afde83d1b --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/example/versions.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.1.0" + } + } + required_version = ">= 1.4.2" +}
\ No newline at end of file diff --git a/fdio.infra.terraform/terraform-aws-vpc/main.tf b/fdio.infra.terraform/terraform-aws-vpc/main.tf new file mode 100644 index 0000000000..1b84f8e351 --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/main.tf @@ -0,0 +1,93 @@ +locals { + tags = { + "Name" = "${var.tags_name}" + "Environment" = "${var.tags_environment}" + } +} + +# Create VPC +resource "aws_vpc" "vpc" { + assign_generated_ipv6_cidr_block = var.vpc_assign_generated_ipv6_cidr_block + cidr_block = var.vpc_cidr_block + enable_dns_hostnames = var.vpc_enable_dns_hostnames + enable_dns_support = var.vpc_enable_dns_support + instance_tenancy = var.vpc_instance_tenancy + tags = local.tags +} + +# Create Security Group +resource "aws_security_group" "security_group" { + depends_on = [ + aws_vpc.vpc + ] + description = var.security_group_description + name = var.security_group_name + revoke_rules_on_delete = var.security_group_revoke_rules_on_delete + tags = local.tags + vpc_id = aws_vpc.vpc.id + + ingress { + from_port = 0 + to_port = 0 + protocol = -1 + self = true + ipv6_cidr_blocks = ["::/0"] + } + + dynamic "ingress" { + for_each = var.security_group_ingress + content { + from_port = lookup(ingress.value, "from_port", null) + to_port = lookup(ingress.value, "to_port", null) + protocol = lookup(ingress.value, "protocol", null) + self = lookup(ingress.value, "self", null) + cidr_blocks = lookup(ingress.value, "cidr_blocks", null) + ipv6_cidr_blocks = lookup(ingress.value, "ipv6_cidr_blocks", null) + } + } + dynamic "egress" { + for_each = var.security_group_egress + content { + from_port = lookup(egress.value, "from_port", null) + to_port = lookup(egress.value, "to_port", null) + protocol = lookup(egress.value, "protocol", null) + self = lookup(egress.value, "self", null) + cidr_blocks = lookup(egress.value, "cidr_blocks", null) + ipv6_cidr_blocks = lookup(egress.value, "ipv6_cidr_blocks", null) + } + } +} + +# Create Internet Gateway +resource "aws_internet_gateway" "internet_gateway" { + depends_on = [ + aws_vpc.vpc + ] + tags = local.tags + vpc_id = aws_vpc.vpc.id +} + +# Create Route +resource "aws_route" "route" { + depends_on = [ + aws_vpc.vpc, + aws_internet_gateway.internet_gateway + ] + destination_cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.internet_gateway.id + route_table_id = aws_vpc.vpc.main_route_table_id +} + +# Create Subnet +resource "aws_subnet" "subnet" { + depends_on = [ + aws_vpc.vpc + ] + assign_ipv6_address_on_creation = var.subnet_assign_ipv6_address_on_creation + availability_zone = var.subnet_availability_zone + cidr_block = aws_vpc.vpc.cidr_block + ipv6_cidr_block = cidrsubnet(aws_vpc.vpc.ipv6_cidr_block, 8, 1) + map_public_ip_on_launch = var.subnet_map_public_ip_on_launch + tags = local.tags + vpc_id = aws_vpc.vpc.id +} diff --git a/fdio.infra.terraform/terraform-aws-vpc/outputs.tf b/fdio.infra.terraform/terraform-aws-vpc/outputs.tf new file mode 100644 index 0000000000..b58963917b --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/outputs.tf @@ -0,0 +1,24 @@ +output "vpc_id" { + value = aws_vpc.vpc.id + description = "The ID of the VPC." +} + +output "vpc_ipv6_cidr_block" { + value = aws_vpc.vpc.ipv6_cidr_block + description = "IPv6 CIDR block." +} + +output "vpc_main_route_table_id" { + value = aws_vpc.vpc.main_route_table_id + description = "The ID of the Main Route Table." +} + +output "vpc_subnet_id" { + value = aws_subnet.subnet.id + description = "The ID of the Subnet." +} + +output "vpc_security_group_id" { + value = aws_security_group.security_group.id + description = "The ID of the Security Group." +} diff --git a/fdio.infra.terraform/terraform-aws-vpc/variables.tf b/fdio.infra.terraform/terraform-aws-vpc/variables.tf new file mode 100644 index 0000000000..a501356063 --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/variables.tf @@ -0,0 +1,108 @@ +variable "tags_name" { + description = "Name used for tag." + type = string + default = "" +} + +variable "tags_environment" { + description = "Environment used for tag." + type = string + default = "" +} + +# Variables for elastic beanstalk VPC +variable "vpc_assign_generated_ipv6_cidr_block" { + description = "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC." + type = bool + default = true +} + +variable "vpc_cidr_block" { + description = "The CIDR block for the association." + type = string + default = "192.168.0.0/24" +} + +variable "vpc_enable_dns_hostnames" { + description = "Whether or not the VPC has DNS hostname support." + type = bool + default = true +} + +variable "vpc_enable_dns_support" { + description = "Whether or not the VPC has DNS support." + type = bool + default = true +} + +variable "vpc_instance_tenancy" { + description = "The allowed tenancy of instances launched into the selected VPC." + type = string + default = "default" +} + +# Variables for Security Group +variable "security_group_description" { + description = "Security group description." + type = string + default = "Allow inbound/outbound traffic" +} + +variable "security_group_name" { + description = "Name of the security group." + type = string +} + +variable "security_group_revoke_rules_on_delete" { + description = "Instruct Terraform to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself." + type = bool + default = false +} + +variable "security_group_ingress" { + description = "Ingress security group map." + type = list(any) + default = [ + { + from_port = 22 + to_port = 22 + protocol = "tcp" + self = false + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + }, + ] +} + +variable "security_group_egress" { + description = "Egress security group map." + type = list(any) + default = [ + { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + }, + ] +} + +# Variables for elastic beanstalk Subnet +variable "subnet_assign_ipv6_address_on_creation" { + description = "Specify true to indicate that network interfaces created in the specified subnet should be assigned an IPv6 address." + type = bool + default = false +} + +variable "subnet_availability_zone" { + description = "AWS availability zone" + type = string + default = "us-east-1a" +} + +variable "subnet_map_public_ip_on_launch" { + description = "Specify true to indicate that instances launched into the subnet should be assigned a public IP address." + type = bool + default = false +} diff --git a/fdio.infra.terraform/terraform-aws-vpc/versions.tf b/fdio.infra.terraform/terraform-aws-vpc/versions.tf new file mode 100644 index 0000000000..7afde83d1b --- /dev/null +++ b/fdio.infra.terraform/terraform-aws-vpc/versions.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.1.0" + } + } + required_version = ">= 1.4.2" +}
\ No newline at end of file |