Um dos grandes benefícios da nuvem é criar e gerenciar com poucos cliques (ou poucos comand0s) diversos recursos que no ambiente on premises levariam um bom tempo para serem provisionados. Isso inclui os serviços de redes, no qual recebem o nome de Amazon VPC - Virtual Private Cloud - na AWS.
A Amazon VPC possibilita criar e administrar uma rede privada na AWS. Funcionando de modo semelhante a uma infraestrutura de rede convencional, porém com as vantagens de escalabilidade oferecidas pela nuvem. Com isso, temos o controle sobre diversas configurações do ambiente de rede, incluindo definição de intervalo de IPs, grupos de segurança, sub-redes, gateways e outras configurações.
Nesse tutorial, vamos aprender a como criar uma VPC com uma arquitetura básica, entendendo o papel de cada componente da rede.

Portanto, vamos criar uma VPC com:
- 2 sub-redes (uma pública e uma privada)
- Internet Gateway
- Tabelas de roteamento (route tables)
- Security Groups
- Network ACL
- E testar as conexões com 2 instâncias
#1 Criando a VPC
Para criar a VPC, basta acessar a sua conta no console da AWS e buscar por VPC no menu de pesquisa, conforme imagem:

Em seguida, no painel da VPC, você vai clicar em "Criar VPC"

Vamos criar uma VPC com as seguintes configurações:
- Recursos a serem criados: selecionar "Somente VPC"
- Tag de nome: main-vpc
- Bloco CIDR Ipv4: selecionar "Entrada manual de IPv4"
- CIDR IPv4: 10.0.0.0/16
Por fim, clique em "Criar VPC".

Pronto! Nossa VPC está criada.
Um ponto interessante é que ao criar a VPC, automaticamente são criados uma Tabela de rotas, um Security Group e uma Network ACL. Nós iremos configurar esses serviços logo adiante. Mas primeiro, precisamos criar as sub-redes pública e privada.
#2 Criando as sub-redes
As sub-redes ou subnets são como um "pedaço" de uma rede, no qual podemos organizar e separar por grupos ou funções. Por exemplo, no ambiente on premises é comum termos a sub-rede do RH, do Financeiro, do Comercial etc.
Quando falamos em nuvem, é nas sub-redes que os recursos, tais como uma instância EC2 ou um banco de dados RDS serão alocados. Cada sub-rede recebe um range de IP derivado da VPC.
Para criar as sub-redes na AWS, vamos seguir o caminho no painel da VPC em: VPC -> Sub-redes -> e clicar em "Criar sub-rede".

Em VPC ID, vamos selecionar a VPC criada anteriormente (no meu caso, é a main-vpc).
Vamos inserir as seguintes configurações:
- Nome: public-subnet
- Zona de disponibilidade:
- Bloco CIDR IPv4 da VPC: selecione o "10.0.0.0/16"
- Bloco CIDR IPv4 da sub-rede: 10.0.1.0/24
- Tags: public-subnet
Pronto! Já temos a nossa sub-rede pública criada. Agora, vamos fazer o mesmo processo para a sub-rede privada. Essas são as configurações:
- Nome: private-subnet
- Zona de disponibilidade:
- Bloco CIDR IPv4 da VPC: selecione o "10.0.0.0/16"
- Bloco CIDR IPv4 da sub-rede: 10.0.2.0/24
- Bloco CIDR da VPC IPv6: selecione o bloco de IPv6 que aparecer
- Tags: private-subnet
No menu das Sub-redes, é possível ver as duas sub-redes que criamos:

#2.1 Criar um internet gateway
Apesar de termos criado as nossas sub-redes, os recursos que forem provisionados nelas não terão acesso à internet. Isso quer dizer que caso você precise atualizar os pacotes de uma instância Linux, por exemplo, você não vai conseguir.
Na AWS, o componente que vai permitir o acesso externo é o Internet Gateway. Para criar, você vai seguir o caminho: VPC -> Gateways da Internet -> Criar gateway da Internet

Como tag de nome, optei por usar "public-internet-gateway". Você só precisa nomear o seu gateway e clicar em "Criar".
Agora, vamos associar o gateway com a nossa VPC. Para isso, selecione gateway -> clique em Ações -> clique em Associar a VPC -> e selecione a nossa VPC criada no primeiro passo.

#3 Criando as tabelas de rotas
A tabela de rotas (route table) possui um conjunto de regras que direcionam o tráfego de uma sub-rede ou gateway. Dentro da tabela de rotas, há um conjunto de regras chamado rotas, que vai determinar esse tráfego em termos de IP de destino.
Para criar a nossa tabela de rotas, vá em VPC -> Tabela de rotas -> Criar tabela de rotas. Vamos criar uma tabela de rotas para a sub-rede pública e outra para a privada.
Os nomes das tabelas criadas foram: public-route-table e private-route-table.

#3.1. Criar as rotas
Mesmo criando as tabelas, ainda não temos nenhuma rota efetivamente criada. É através da tabela de rotas que a sub-rede pode ter acesso externo à internet por meio do Internet Gateway, então é isso que vamos fazer agora.
Selecione a tabela de rotas pública, clique no botão "Ações" e em "Editar rotas".

Em seguida, clique em: Adicionar rota -> selecione o Destino como: 0.0.0.0./0 -> e em "Alvo", escolha "Gateway da internet" e selecione o gateway criado anteriormente.

Feito isso, basta salvar as alterações.
Por fim, precisamos associar a tabela de rotas com a sub-rede pública. Selecione a tabela pública -> Editar associações de sub-rede

Escolha a sub-rede pública e clique em "Salvar associações".

Faça o mesmo para a tabela privada, associando-a com a sub-rede privada.
#4 Criando os grupos de segurança
Na AWS, os Grupos de Segurança (Security Groups, ou SGs) atuam como um firewall em nível de instâncias, controlando o tráfego de entrada e saída de uma EC2, por exemplo.
Para criar os Grupos de segurança, vá em VPC -> Segurança -> Grupos de segurança -> Criar grupo de segurança
Na imagem abaixo, estamos criando o SG para os recursos da sub-rede pública:

#4.1 Regras de entrada
Ainda na criação do Grupo de segurança, na mesma página, precisamos inserir as regras de entrada. Ou seja, as portas que iremos utilizar para a comunicação com a instância EC2.
No grupo público, vamos abrir as portas 22,80,443 (SSH, HTTP e HTTPS), conforme imagem:

Salve as configurações. Em seguida, crie o Grupo de segurança para o privado, abrindo somente as portas 22 e 3306 (SSH e MySQL).
#5 Criando as NACLs
Enquanto os Grupos de segurança atuam como firewall para instâncias, as Network Access Control Lists (NACLs) controlam o tráfego de entrada e saída de uma sub-rede. Ou seja, atuam como um firewall a nível de sub-rede, permitindo ou negando acesso à determinados recursos naquela sub-rede.
Para criar a NACL, vá em VPC -> Segurança -> ACLs da rede -> Criar Network ACL. Crie a NACL escolhendo um nome, selecionando a VPC e criando uma tag.

Depois de criar a NACL, precisamos configurar as regras de entrada e saída. Isto porque por padrão, quando criamos uma NACL, o tráfego de entrada e saída está bloqueado (deny).
Então, selecione a NACL pública -> clique em Ações -> Editar regras de entrada
Uma boa prática é numerar as regras, seguindo uma ordem de menor para maior e deixado "espaços" entre estas regras. Ou seja, é preferencial numerá-las como 100, 200, 300 do que 101, 102, 103. Isso torna mais fácil adicionar uma nova regra quando for necessário e sem precisar renumerar tudo.
Vamos criar as seguintes regras:
- Regra 100 - porta 80 - Origem 0.0.0.0/0 - Permitir
- Regra 200 - porta 443 - Origem 0.0.0.0/0 - Permitir
- Regra 300 - porta 22 - Origem 0.0.0.0/0 - Permitir
E salve as alterações.

Para o tráfego de saída:
- Regra 100 - porta 80 - Origem 0.0.0.0/0 - Permitir
- Regra 200 - porta 443 - Origem 0.0.0.0/0 - Permitir
- Regra 300 - porta 22 - Origem 0.0.0.0/0 - Permitir
Por fim, associe a NACL com a sub-rede pública.
Associar com as sub-redes

#6 Provisionando as instâncias
A fim de simular um ambiente real, vamos criar 2 instâncias. Uma será provisionada dentro da sub-rede pública e a outra na privada. Esse tipo de configuração é comum em arquiteturas onde temos um webserver "aberto" externamente e um banco de dados na rede privada, o qual somente tem acesso pela aplicação.
#6.1 Criando as instâncias
Vá em Ec2 -> Instâncias -> Executar instâncias

Coloque as seguintes configurações para a nossa primeira instância:
- Nome: webserver
- AMI: Ubuntu Server 22.04 LTS
- Tipo de Instância: t2.micro
- Par de chaves: Criar novo par de chaves - baixe e salve o par de chaves
- Configurações de rede - clicar em "Editar"
- VPC: main-vpc
- Sub-rede: public-subnet
- Atribuir IP público automaticamente: Desabilitar
- Atribuir IP IPv6 automaticamente: Habilitar
- Grupo de segurança: PublicSecGroup
- Rolar até o fim da página e clicar em "Executar instância"
Crie a segunda instância:
- Nome: database
- AMI: Ubuntu Server 22.04 LTS
- Tipo de Instância: t2.micro
- Par de chaves: prosseguir sem par de chaves
- Configurações de rede - clicar em "Editar"
- VPC: main-vpc
- Sub-rede: private-subnet
- Grupo de segurança: PrivateSecGroup
- Rolar até o fim da página e clicar em "Executar instância"
#6.2 Conectando na instância pública
No resumo da instância webserver, clique em "Conectar".

Selecione a aba "Conexão de instância do EC2" -> "Conectar-se usando o endpoint do EC2 Instance Connect" -> "Criar endpoint"

Nas configurações, insira um nome e escolha a opção para criar um "Endpoint do EC2 Instance Connect"

Além disso, na mesma página você deve selecionar a VPC criada, o grupo de segurança público e a sub-rede pública. Clique em "Criar endpoint".
Retorne para a instância e clique em "Conectar" -> "Conexão de instância do EC2" -> "Conectar-se usando o endpoint do EC2 Instance Connect" -> e selecione o endpoint criado. Por fim, clique no botão conectar.
Se tudo der certo, uma nova aba será aberta no seu navegador e você vai receber essa mensagem aqui:

Dentro da instância pública podemos testar a conexão com a instância privada (o database). Pegue o IP privado da segunda instância e use o comando telnet para verificar a conexão na porta 22 da instância pública para a privada, conforme imagem:

[ATUALIZAÇÃO] Maaaaas... Até o momento foi liberado o uso de IPs públicos para a EC2 dentro do Free Tier, durante 12 meses.
Ufa! Agora sim terminamos. Espero que esse tutorial possa te ajudar nos seus estudos. Ah, e não se esqueça de limpar o seu ambiente.
Links úteis
- Documentação: Amazon VPC
- Exemplo: VPC para servidores Web e de banco de dados
- Template: AWS CloudFormation Simple VPC