Introdução
Uma aplicação pode ter uma instância em execução e um endereço público e, ainda assim, permanecer inacessível. Você definirá a rota que falta e uma regra de grupo de segurança com escopo restrito usando o Terraform e, em seguida, testará conexões permitidas e bloqueadas.
Você deve compreender referências a recursos do Terraform, VPCs, sub-redes, rotas para a internet e grupos de segurança. Este ambiente independente fornece uma aplicação de destino, uma aplicação de referência separada em funcionamento e valores de entrada preparados para o Terraform. Você gerenciará apenas os novos recursos de conexão.
Relação com certificações
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Solutions Architect – Associate (SAA-C03) | Tarefa 1.2 | Conectar uma sub-rede VPC por meio de um gateway de internet e restringir o acesso de rede de uma aplicação por origem e porta. |
Visão geral do laboratório

Construa a rota para a internet
Nesta etapa, você anexará um gateway de internet à VPC da aplicação e associará explicitamente uma tabela de rotas à sua sub-rede.
Abra o Terminal e o AWS View. As redes da aplicação e de referência são independentes. O application-server já tem um endereço público porque sua sub-rede atribui IPs públicos na inicialização. Um endereço público, por si só, não cria uma rota para a internet nem uma permissão de entrada.
No AWS View, selecione application-server, User · 198.51.100.10 e Application · 8081 e clique em Send request. Espere Blocked. Selecione reference-server com o mesmo cliente e a mesma porta da aplicação, envie outra solicitação e confirme que a aplicação de referência responde. Mantenha essa aplicação de referência funcionando durante todo este laboratório.
Entre no diretório de trabalho preparado:
cd /home/labex/project/application-access
O arquivo terraform.tfvars.json fornecido contém os IDs da VPC, da sub-rede e do grupo de segurança deste novo ambiente. O Terraform carrega automaticamente esses valores de entrada. Leia-os antes de usar as variáveis correspondentes:
cat terraform.tfvars.json
A configuração preparada do provedor seleciona o ambiente do curso. Você não precisa copiar IDs de uma VM anterior nem inserir credenciais pessoais. Salve e exiba o ID da instância de destino fornecida para inspecioná-la depois. $(...) captura a saída de um comando, e --output text retorna o ID como texto simples.
TARGET_ID=$(aws ec2 \
describe-instances \
--filters Name=tag:Name,Values=application-server Name=instance-state-name,Values=running \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
echo "$TARGET_ID"
Um gateway de internet é anexado a uma VPC. Uma tabela de rotas envia o tráfego de um destino ao seu gateway, e uma associação de sub-rede escolhe qual tabela rege a sub-rede. Sem uma associação explícita, uma sub-rede usa a tabela de rotas principal de sua VPC. Mantenha essa tabela principal fornecida inalterada. O destino 0.0.0.0/0 corresponde a endereços IPv4 sem uma rota mais específica; ele não concede permissão através de um grupo de segurança.
Crie routing.tf. O heredoc com delimitador entre aspas escreve o HCL literalmente. As referências a recursos conectam a rota à sua tabela e ao gateway e conectam a associação de sub-rede à mesma tabela.
cat > routing.tf <<'HCL'
resource "aws_internet_gateway" "application" {
vpc_id = var.vpc_id
}
resource "aws_route_table" "application" {
vpc_id = var.vpc_id
}
resource "aws_route" "internet" {
route_table_id = aws_route_table.application.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.application.id
}
resource "aws_route_table_association" "application" {
subnet_id = var.subnet_id
route_table_id = aws_route_table.application.id
}
output "route_table_id" {
value = aws_route_table.application.id
}
output "subnet_id" {
value = var.subnet_id
}
HCL
Inicialize, formate e valide a configuração:
terraform init
terraform fmt
terraform validate
Se init imprimir Incomplete lock file information for providers, a mensagem se refere a somas de verificação para outras plataformas. Esta VM preparada usa linux_amd64; continue depois que a inicialização e a validação forem concluídas com sucesso.
Revise as quatro adições: o gateway, a tabela, a rota e a associação. A instância fornecida e a rede de referência não devem aparecer como recursos a substituir ou excluir.
terraform plan
Aplique e digite yes quando solicitado:
terraform apply
Salve e exiba o ID da nova tabela e o ID da sub-rede fornecida:
TABLE_ID=$(terraform output -raw route_table_id)
echo "$TABLE_ID"
SUBNET_ID=$(terraform output -raw subnet_id)
echo "$SUBNET_ID"
Consulte a tabela de rotas de forma independente. Localize o destino padrão, o gateway igw-... e a associação com o ID da sua sub-rede. A rota local da VPC também permanece.
aws ec2 \
describe-route-tables \
--route-table-ids "$TABLE_ID" \
--query 'RouteTables[].{Routes:Routes[].{Destination:DestinationCidrBlock,Gateway:GatewayId},Subnets:Associations[].SubnetId}'
Confirme a atribuição de IP público na sub-rede fornecida:
aws ec2 \
describe-subnets \
--subnet-ids "$SUBNET_ID" \
--query 'Subnets[].{CIDR:CidrBlock,PublicIPOnLaunch:MapPublicIpOnLaunch}'
PublicIPOnLaunch é true. Essa configuração controla instâncias recém-iniciadas; alterá-la não é uma forma de atribuir retroativamente um endereço a uma instância existente. O AWS View agora mostra o gateway real e a tabela de rotas efetiva. Envie novamente a solicitação User/8081 da aplicação: ela continua Blocked, pois ainda não há uma regra de entrada que a permita.
Permita o cliente pretendido e teste o limite de acesso
Nesta etapa, você permitirá que o cliente User alcance a porta da aplicação e verificará se um cliente diferente e uma porta diferente permanecem bloqueados.
Um grupo de segurança é um limite de rede com estado associado à interface de rede de uma instância. O roteamento disponibiliza um caminho; o grupo ainda decide quais conexões de entrada são permitidas. O grupo da aplicação fornecido atualmente não tem regras de entrada.
Crie um recurso independente de regra de entrada para esse grupo. cidr_ipv4 = "198.51.100.10/32" seleciona o único endereço IPv4 do cliente User. Definir ambas as portas como 8081 permite apenas o serviço da aplicação que escuta nessa porta. A aplicação de referência usa seu próprio grupo de segurança.
cat > access.tf <<'HCL'
resource "aws_vpc_security_group_ingress_rule" "application" {
security_group_id = var.security_group_id
ip_protocol = "tcp"
from_port = 8081
to_port = 8081
cidr_ipv4 = "198.51.100.10/32"
}
output "security_group_id" {
value = var.security_group_id
}
HCL
Formate e valide e, em seguida, revise o plano. Deve haver uma adição de regra de entrada e nenhuma substituição de instância.
terraform fmt
terraform validate
terraform plan
Aplique a regra e confirme com yes:
terraform apply
Salve e exiba o ID do grupo existente e, em seguida, leia sua permissão de entrada efetiva:
GROUP_ID=$(terraform output -raw security_group_id)
echo "$GROUP_ID"
aws ec2 \
describe-security-groups \
--group-ids "$GROUP_ID" \
--query 'SecurityGroups[].{Group:GroupId,Ingress:IpPermissions}'
A permissão deve descrever a porta TCP 8081 a partir de 198.51.100.10/32. Confirme que o Terraform convergiu:
terraform plan
Espere No changes. Agora faça os três testes no AWS View, escolhendo application-server em cada um:
Selecione User · 198.51.100.10 e Application · 8081. Clique em Send request. Espere Connected · 200 e a mensagem Application network connected.
Altere a origem para Unrelated · 198.51.100.20, mantenha a porta 8081 e envie outra solicitação. Espere Blocked.
Volte à origem User, escolha SSH · 22 e envie outra solicitação. Espere Blocked. Uma solicitação bem-sucedida à aplicação não autoriza o serviço SSH separado da instância convidada.
O resultado identifica a origem real, a instância de destino e a porta. Request service unavailable é um erro do ambiente, não uma prova de rejeição de rede intencional. Evite ampliar a regra para 0.0.0.0/0: isso exporia o mesmo serviço da aplicação ao cliente não relacionado.
A documentação da regra de entrada do provedor AWS descreve os campos do recurso. Sua CLI, o mapeamento do Terraform e os resultados das solicitações efetivas devem concordar.
Remova os recursos de conexão e preserve as aplicações
Nesta etapa, você removerá apenas os recursos de conexão gerenciados pelo Terraform e confirmará que as aplicações fornecidas permanecem intactas.
Este diretório de trabalho é responsável por cinco recursos: um gateway de internet, uma tabela de rotas, uma rota padrão, uma associação de sub-rede e uma regra de entrada. A VPC, a sub-rede, a tabela de rotas principal, a instância de destino e a aplicação de referência foram fornecidas de forma independente. Esses recursos estão fora deste estado e devem permanecer.
Revise o plano de destruição:
terraform plan -destroy
Espere cinco recursos a destruir. Em seguida, execute a exclusão e digite yes:
terraform destroy
Confirme que o estado não contém endereços de recursos gerenciados:
terraform state list
A instância de destino fornecida ainda deve estar em execução com o mesmo ID:
aws ec2 \
describe-instances \
--instance-ids "$TARGET_ID" \
--query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Subnet:SubnetId}'
No AWS View, envie novamente a solicitação User/8081 ao destino. Ela deve ficar Blocked, pois você removeu seus recursos de conexão. Em seguida, selecione reference-server, User e a porta 8081 e envie uma solicitação. A aplicação de referência ainda deve retornar Connected · 200 e Reference application.
Seus arquivos HCL permanecem disponíveis para revisão. Um plano comum posterior proporia recriar os recursos removidos; manter essa configuração é normal após terraform destroy.
Resumo
Você usou referências do Terraform para anexar um gateway de internet, definir uma rota padrão e associar uma tabela de rotas a uma sub-rede da aplicação. Em seguida, adicionou uma regra de entrada com escopo restrito, testou os limites reais de origem e porta, confirmou a convergência e removeu apenas seus recursos de conexão, preservando as aplicações fornecidas.



