Vamos criar um NAT Gateway na public subnet e também adicionar uma nova regra na private route table associada a private subnet para encaminhar o tráfego direcionado a endereços que não estão no CIDR da VPC para o NAT Gateway. Desta forma, quando qualquer instância em qualquer subnet privada associada a private route table realizar uma requisição para qualquer endereço fora do CIDR da VPC a requisição será encaminhada para o NAT Gateway.
Lembrando que o NAT gateway estará em uma public subnet que é associada implicitamente a main route table que possui uma regra para direcionar o tráfego para o internet gateway que acessará a internet.
Para demonstrar que a instância EC2 na private subnet consegue acessar a internet através ****do NAT Gateway é preciso realizar duas conexões SSH.
A primeira conexão SSH é da máquina pessoal com a Instancia pública(bastion host), em seguida, estando conectado a instancia publica realiza-se outra conexão SSH, desta vez com a instancia EC2 privada e então o comando ping.
A instância EC2 na public subnet é conhecida como Jump Host ou Bastion Host ela é utilizada para acessar recursos da private subnet.
Atualização na private-route-table, adição de uma rota que direciona o tráfego para o NAT Gateway e atributo depends_on para aguardar a criação do NAT Gateway antes de associar o seu id a nova rota. não sei se é realmente necessário utilizar o depends_on.
resource "aws_route_table" "private-route-table" {
vpc_id = aws_vpc.custom-vpc.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat-gw.id
}
tags = {
Name = "private-route-table"
Course = "AWS Certified Solutions Architect Professional SAP-C01 2022"
Session = "Advanced VPC"
Class = "5. [HOL] Configure Routing"
}
depends_on = [
aws_nat_gateway.nat-gw
]
}
Criação do Elastic IP e NAT Gateway, ao criar pelo console deve-se selecionar a subnet publica, clicar em Allocate Elastic IP, aguardar alguns segundos para que a AWS disponibilize um Elastic IP público para o NAT Gateway e então cria-lo.
# <https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eip>
resource "aws_eip" "elastic-ip" {
vpc = true
depends_on = [
aws_internet_gateway.custom-vpc-igw
]
}
# <https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/nat_gateway>
resource "aws_nat_gateway" "nat-gw" {
allocation_id = aws_eip.elastic-ip.id
subnet_id = aws_subnet.public-us-east-1a.id
connectivity_type = "public"
tags = {
Name = "custom-NAT-gateway"
Course = "AWS Certified Solutions Architect Professional SAP-C01 2022"
Session = "Advanced VPC"
Class = "8. [HOL] Create NAT Gateway"
}
depends_on = [
aws_eip.elastic-ip
]
}
Antes de criar as máquinas é preciso gerar as chaves SSH de acordo com o key_name dado as chaves nos recursos aws_key_pair chamados public-ssh-key e private-ssh-key.
# gerar chave para a instancia publica
ssh-keygen -q -t rsa -f public-instance-key -N ''
# gerar chave para a instancia privada
ssh-keygen -q -t rsa -f private-instance-key -N ''