Conecte a rede aos seus usuários

AWSBeginner
Pratique Agora

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

Visão conceitual: um cliente autorizado alcança a sub-rede da aplicação por meio do gateway de internet e da rota padrão, enquanto um grupo de segurança restringe a porta da aplicação.

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.

Ponto de verificação em execução: a rede de destino real, a origem selecionada e a porta da aplicação produzem uma resposta bem-sucedida. Os IDs dos recursos são exemplos. 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.