Criando uma VPC na AWS

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.

Exemplo de uma arquitetura de VPC

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:

OBS: Nesse tutorial, optou-se por não criar o NAT Gateway, que é um componente que permite acesso externo a uma instância que está dentro de uma sub-rede privada. Dessa forma, a instância conseguem se conectar à serviços externos para atualizar pacotes, por exemplo, mas os serviços externos não conseguem iniciar uma conexão com a instância.

OBS²: Originalmente, esse tutorial foi pensado e escrito usando o IPv4 público com acesso via SSH. No entanto, com as novas políticas de cobrança da AWS, optou-se por usar o EC2 Instance Connect ao invés do SSH padrão.

Ufa! Agora sim terminamos o tutorial. Espero que ele possa te ajudar nos seus estudos. Ah, e não se esqueça de limpar o seu ambiente.