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.

Untitled

Infraestrutura - Terraform

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
  ]
}

Untitled

Criação das máquinas EC2

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 ''