Terraform module for creating and managing AWS Virtual Private Cloud (VPC).
- Auto subnetting with 2 algorithms available (see subnet-addresses submodule)
- VPC & Subnets
- Delete rules from VPC default Network ACL & Security Group
- Custom Network ACL & Route Table(s) for private subnets
- Public infrastructure (see public-infra submodule)
- Internet Gateway
- NAT Gateway(s) with 3 setups available
one-az
- only one NAT Gateway shared by all subnets across all AZs
failover
- two NAT Gateways in different AZs one is used like inone-az
setup and one is ready for failover
ha
- high availability setup; each AZ has its own NAT Gateway, this setup is considerably pricier) - Subnets
- Custom Network ACL & Route Table for public subnets
- VPC Endpoints
- Gateway endpoints for S3 & DynamoDB services
- Interface endpoints for supported AWS services
- Flow logs
- IPv6 support
- Multiple IPv4 & IPv6 CIDR blocks support via BYOIP pools
- Multiple IPv4 & IPv6 CIDR blocks via IPAM pools (Amazon IP Address Manager)
- Local Zones support
- Wavelength Zones support
Name | Version |
---|---|
terraform | >= 1.0 |
aws | >= 5.0 |
Name | Version |
---|---|
aws | >= 5.0 |
Name | Source | Version |
---|---|---|
flow_log | ./modules/flow-log | n/a |
public_infra | ./modules/public-infra | n/a |
subnet_addresses | ./modules/subnet-addresses | n/a |
Name | Description | Type | Default | Required |
---|---|---|---|---|
name | VPC name. | string |
n/a | yes |
main_cidr_block | Main IPv4 CIDR block for the VPC. | string |
n/a | yes |
instance_tenancy | Tenancy of instances launched into the VPC. Dedicated or host tenancy cost at least 2$/h. | string |
"default" |
no |
enable_dns_support | Whether to enable DNS support in the VPC. | bool |
true |
no |
enable_dns_hostnames | Whether to enable DNS hostnames in the VPC. | bool |
true |
no |
ipv6_cidr_block | Whether to request an Amazon-provider IPv6 CIDR block with /56 prefix length for the VPC. | bool |
false |
no |
availability_zones_count | Number of Availability Zones to use for VPC subnets. | number |
3 |
no |
subnetting_algorithm | Algorithm type for subnetting the VPC IPv4 CIDR blocks. Supported algorithms: * nowaste - Use the whole CIDR block, leaving no subnet addresses unused. It attempts an equal split. When the number of subnets is not a power of 2, the last subnets will have bigger prefix lengths Ie. Less usable host IPs * equalsplit - The subnets will be split equally - ie. same prefix length This will result in unused subnet addresses when the number of requested subnets is not a power of 2. |
string |
"nowaste" |
no |
subnets | List of IPv4 CIDR blocks to use for each subnet, both private and public. The # of subnets created is not decide by the length of the private & public lists, but rather the value of availability_zones_count ,but no more than the number of AZs available in the AWS Region where the VPC is created. ie. min(var.availability_zones_count, length(data.aws_availability_zones.available.names)) If private_subnets_only is true , the public list can be passed as null or empty list.By default, this variables is null , which means the subnets are computed by the internal algorithms, controlled by subnetting_algorithm variable. |
object({ |
null |
no |
private_subnets_only | Whether to create only private subnets from VPC IPv4 CIDR block. | bool |
false |
no |
empty_network_acls | Do not create default allow all traffic rule in network ACLs. | bool |
false |
no |
nat_gateway_setup | NAT Gateway setup. Available options: one-az, failover, ha | string |
"ha" |
no |
force_internet_gateway | Force creation of an Internet Gateway for a VPC with only private subnets. Required if an AWS Global Accelerator is pointing to a private resource in the VPC. | bool |
false |
no |
create_vpc_gateway_endpoints | Create VPC Endpoints (Gateway) for S3 & DynamoDB services. | bool |
true |
no |
flow_logs_config | Config block for VPC Flow Logs. It must be a map with the following optional keys: destination, retention, aggregation_interval, kms_key_id. Properties allowed values: destination => "cloud-watch-logs" or "s3" Default: "cloud-watch-logs" retention => 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653, 0 (indefinetely) Default: 30 (days) Valid only for CloudWatch destination aggregation_interval => 60 or 600 Default: 600 log_format => Check AWS documentation kms_key_id => ARN of a CMK in AWS KMS Default: AWS managed key s3_tiering => configuration for S3 Intelligent-Tiering Default: Archive access after 90 days & Deep Archive Access after 180 days Pass this as null or with both properties set to 0 to disable S3 Intelligent-Tieringarchive_access => Days after which data is tiered to ARCHIVE_ACCESS Default: 90 Pass as 0 to disable ARCHIVE_ACCESS tiering deep_archive_access => Days after which data is tiered to DEEP_ARCHIVE_ACCESS Default: 180 Pass as 0 to disable DEEP_ARCHIVE_ACCESS tiering Pass the variable as null to disable flow logs. |
any |
{} |
no |
tags | Common tags for all resources created by this module. Reserved tag keys: Name, net/type | map(string) |
n/a | yes |
Name | Description |
---|---|
vpc_id | The VPC ID. |
subnets | Map of both private & public subnets with IP CIDR block, associated route table & network ACL IDs as properties. |
private_subnet_addresses | n/a |
public_subnet_addresses | n/a |
unused_subnet_addresses | n/a |
- Terraform docs
- Unit tests using Golang & GitHub Actions
- Run tfsec & checkov within GitHub Actions
- Update from private-only VPC to public with 1, 2 or multi-AZ NAT Gateways and all combinations. Total cases: 6 + 2 + 2 + 2
- Update NACL rules. Total cases: 3
- Update private-only VPC to use or not IGW. Total cases: 2
- Disable/enable flow logs. Switch between destinations in flow logs. Total cases: 6