Merge pull request #6 from matttrach/add-az-to-sub

Add availability zone to subnet creation
This commit is contained in:
Matt Trachier 2023-09-26 17:09:04 -05:00 committed by GitHub
commit 17b9d94821
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 18 deletions

View File

@ -1,11 +1,17 @@
# this is given for reference, in most cases you will want to set the region using environment variables
# provider "aws" {
# region = "us-west-1"
# }
# AWS reserves the first four IP addresses and the last IP address in any CIDR block for its own use (cumulatively)
module "TestBasic" { module "TestBasic" {
source = "../../" source = "../../"
owner = "terraform-ci@suse.com" owner = "terraform-ci@suse.com"
vpc_name = "terraform-aws-access-test-basic" vpc_name = "terraform-aws-access-test-basic"
vpc_cidr = "10.0.0.0/16" vpc_cidr = "10.0.255.0/24" # gives 256 usable addresses from .1 to .254, but AWS reserves .1 to .4 and .255, leaving .5 to .254
subnet_name = "terraform-aws-access-test-basic" subnet_name = "terraform-aws-access-test-basic"
subnet_cidr = "10.0.0.0/24" subnet_cidr = "10.0.255.224/28" # gives 14 usable addresses from .225 to .238, but AWS reserves .225 to .227 and .238, leaving .227 to .237
availability_zone = "us-west-1b" # check what availability zones are available in your region before setting this
security_group_name = "terraform-aws-access-test-basic" security_group_name = "terraform-aws-access-test-basic"
security_group_type = "egress" security_group_type = "egress"
public_ssh_key = var.key # I don't normally recommend this, but it allows tests to supply their own key public_ssh_key = var.key # I don't normally recommend this, but it allows tests to supply their own key

View File

@ -7,6 +7,7 @@ locals {
subnet_name = var.subnet_name subnet_name = var.subnet_name
subnet_cidr = var.subnet_cidr # create when cidr is given, otherwise select with name subnet_cidr = var.subnet_cidr # create when cidr is given, otherwise select with name
subnet_availability_zone = var.availability_zone # only used when creating
security_group_name = var.security_group_name security_group_name = var.security_group_name
security_group_type = var.security_group_type # create when type is given, otherwise select with name security_group_type = var.security_group_type # create when type is given, otherwise select with name
@ -33,6 +34,7 @@ module "subnet" {
cidr = local.subnet_cidr cidr = local.subnet_cidr
vpc_id = module.vpc.id vpc_id = module.vpc.id
owner = local.owner owner = local.owner
availability_zone = local.subnet_availability_zone
} }
module "security_group" { module "security_group" {

View File

@ -5,6 +5,7 @@ locals {
cidr = var.cidr cidr = var.cidr
vpc_id = var.vpc_id vpc_id = var.vpc_id
owner = var.owner owner = var.owner
availability_zone = var.availability_zone
} }
data "aws_subnet" "selected" { data "aws_subnet" "selected" {
@ -18,6 +19,7 @@ resource "aws_subnet" "new" {
count = local.create count = local.create
vpc_id = local.vpc_id vpc_id = local.vpc_id
cidr_block = local.cidr cidr_block = local.cidr
availability_zone = local.availability_zone
tags = { tags = {
Name = local.name Name = local.name
Owner = local.owner Owner = local.owner

View File

@ -28,3 +28,12 @@ variable "owner" {
EOT EOT
default = "" default = ""
} }
variable "availability_zone" {
type = string
description = <<-EOT
The availability zone to create the subnet in.
This is the name of the availability zone, not the AWS unique id.
For example "us-east-1a" or "us-east-1b" not "use1-az1" or "use1-az2".
EOT
default = ""
}

View File

@ -23,6 +23,10 @@ variable "vpc_cidr" {
This value sets the default private IP space for the created VPC. This value sets the default private IP space for the created VPC.
VPCs generated with this module automatically give Amazon supplied public addresses to ec2 instances via an internet gateway. VPCs generated with this module automatically give Amazon supplied public addresses to ec2 instances via an internet gateway.
Access to the ec2 instances is then controlled by the security group. Access to the ec2 instances is then controlled by the security group.
WARNING: AWS reserves the first four IP addresses and the last IP address in any CIDR block for its own use (cumulatively).
This means that every VPC has 5 IP addresses that cannot be assigned to subnets, and every subnet assigned has 5 IP addresses that cannot be used.
If you attempt to generate a VPC that has no usable addresses you will get an "invalid CIDR" error from AWS.
If you attempt to generate a subnet that uses one of the addresses reserved by AWS in the VPC's CIDR, you will get an "invalid CIDR" error from AWS.
EOT EOT
default = "" default = ""
} }
@ -48,6 +52,21 @@ variable "subnet_cidr" {
This cidr must be within the IP bounds of the vpc_cidr. This cidr must be within the IP bounds of the vpc_cidr.
If this is specified, then a subnet will be created. If this is specified, then a subnet will be created.
If this isn't specified, then the module will attempt to find a subnet with the given name. If this isn't specified, then the module will attempt to find a subnet with the given name.
WARNING: AWS reserves the first four IP addresses and the last IP address in any CIDR block for its own use (cumulatively).
This means that every VPC has 5 IP addresses that cannot be assigned to subnets, and every subnet assigned has 5 IP addresses that cannot be used.
If you attempt to generate a subnet that has no usable addresses you will get an "invalid CIDR" error from AWS.
If you attempt to generate a subnet that uses one of the addresses reserved by AWS in the VPC's CIDR, you will get an "invalid CIDR" error from AWS.
EOT
default = ""
}
variable "availability_zone" {
type = string
description = <<-EOT
The availability zone to create the subnet in.
This is the name of the availability zone, not the AWS unique id.
For example "us-east-1a" or "us-east-1b" not "use1-az1" or "use1-az2".
This is required when creating a subnet, but not when selecting a subnet.
Any servers created in this subnet will be created in this availability zone.
EOT EOT
default = "" default = ""
} }