Conectar ao S3 de forma privada com um endpoint de VPC

AWSBeginner
Pratique Agora

Introdução

Uma aplicação privada de entregas lê um manifesto do S3 por NAT. Ela precisa de um caminho específico do serviço sem acesso geral à Internet. Você criará um endpoint de gateway do S3, comparará solicitações reais, diagnosticará uma associação incorreta e restaurará a rede fornecida.

Conclua primeiro Give a Private Subnet Outbound Access. Este ambiente novo fornece sua própria aplicação, objeto S3, sub-redes pública e privada, gateway NAT e regras de segurança. A CLI está configurada. Preserve esses recursos e a rede de referência; crie e exclua apenas seu endpoint e restaure a rota NAT padrão privada removida temporariamente.

Relação com certificações

Este laboratório oferece prática básica nos seguintes temas:

Criar um endpoint de gateway do S3 para a aplicação privada

Inspecione o caminho NAT inicial, identifique os intervalos S3 e crie o endpoint para a tabela privada.

Use Terminal e abra AWS View ao lado. A aplicação mantém 10.20.2.10. O bucket fornecido parcel-delivery-storage contém message.txt com Parcel manifest ready.

cd /home/labex/project

Selecione a VPC pela tag Name. Filtros selecionam recursos, a consulta extrai o ID e $(...) o guarda:

VPC_ID=$(aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=application-network \
  --query 'Vpcs[0].VpcId' \
  --output text)

Guarde os IDs das tabelas privada e pública. Suas associações com sub-redes já estão corretas:

PRIVATE_RT_ID=$(aws ec2 describe-route-tables \
  --filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=private-routes \
  --query 'RouteTables[0].RouteTableId' \
  --output text)
PUBLIC_RT_ID=$(aws ec2 describe-route-tables \
  --filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=public-routes \
  --query 'RouteTables[0].RouteTableId' \
  --output text)

Leia as rotas e associações:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
  --query 'RouteTables[].{ID:RouteTableId,Routes:Routes,Associations:Associations}' \
  --output json

A rota privada 0.0.0.0/0 aponta para NAT; a pública aponta para o gateway de Internet. Ambas mantêm local. Guarde o ID NAT para a restauração:

NAT_ID=$(aws ec2 describe-nat-gateways \
  --filter "Name=vpc-id,Values=$VPC_ID" Name=state,Values=available \
  --query 'NatGateways[0].NatGatewayId' \
  --output text)

Leia seus endereços para comparar solicitações:

aws ec2 describe-nat-gateways \
  --nat-gateway-ids "$NAT_ID" \
  --query 'NatGateways[].{State:State,Addresses:NatGatewayAddresses}' \
  --output json

No AWS View, clique em Read storage object: a resposta contém Success e o manifesto. Source address é o endereço público NAT. Request outbound service também funciona com o mesmo endereço. Esse é o comportamento inicial a restaurar.

Uma lista de prefixos gerenciada pela AWS agrupa intervalos do serviço em uma região. Um endpoint de gateway do S3 adiciona uma rota à lista nas tabelas associadas, sem atribuir endereço público à aplicação nem oferecer Internet geral. Selecione a lista S3 e leia os intervalos IPv4:

PREFIX_ID=$(aws ec2 describe-prefix-lists \
  --filters Name=prefix-list-name,Values=com.amazonaws.us-east-1.s3 \
  --query 'PrefixLists[0].PrefixListId' \
  --output text)
aws ec2 get-managed-prefix-list-entries \
  --prefix-list-id "$PREFIX_ID" \
  --query 'Entries[].Cidr' \
  --output json

Crie o endpoint S3 de us-east-1, associado somente à tabela privada. --vpc-endpoint-type Gateway escolhe o tipo baseado em rotas; --service-name, o serviço regional; --route-table-ids, a tabela da aplicação. Tags identificam seu recurso de prática:

ENDPOINT_ID=$(aws ec2 create-vpc-endpoint \
  --vpc-id "$VPC_ID" \
  --vpc-endpoint-type Gateway \
  --service-name com.amazonaws.us-east-1.s3 \
  --route-table-ids "$PRIVATE_RT_ID" \
  --tag-specifications 'ResourceType=vpc-endpoint,Tags=[{Key=Name,Value=parcel-s3-endpoint},{Key=Project,Value=parcel}]' \
  --query 'VpcEndpoint.VpcEndpointId' \
  --output text)

Leia o estado e a associação:

aws ec2 describe-vpc-endpoints \
  --vpc-endpoint-ids "$ENDPOINT_ID" \
  --query 'VpcEndpoints[].{ID:VpcEndpointId,State:State,Type:VpcEndpointType,Service:ServiceName,Tables:RouteTableIds}' \
  --output json

Continue quando State for available. Caso contrário, aguarde alguns segundos e repita a consulta. O tipo é Gateway, o serviço é S3 e apenas a tabela privada está associada. Mantenha Terminal aberto para preservar as variáveis.

Clique novamente em Read storage object. O manifesto é o mesmo, mas a origem agora é 10.20.2.10. A rota S3 é mais específica que a rota NAT padrão: S3 usa o endpoint e outras saídas usam NAT.

Manter S3 sem a rota NAT padrão

Remova o caminho geral de saída e verifique o caminho específico do serviço.

Exclua apenas a rota NAT padrão privada. Preserve gateway, endereço, rota pública e endpoint:

aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0

Uma exclusão bem-sucedida não produz saída. Leia as rotas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

Permanecem local e S3 DestinationPrefixListId, mas não a rota padrão. GatewayId é o ID do endpoint e o estado é active. Associações do endpoint gerenciam essas rotas; não as edite ou exclua com comandos comuns de rotas.

Uma nova Read storage object retorna Parcel manifest ready de 10.20.2.10. Request outbound service falha porque 198.51.100.20:9000 está fora do prefixo S3 e sem rota padrão. Request private application from outside também falha. O endpoint fornece S3 privado, sem endereço público nem rotas para outros destinos da Internet.

A aplicação privada lê S3 sem uma rota NAT padrão

Exemplo: a tabela privada tem local e o prefixo S3, sem 0.0.0.0/0. A resposta real contém o manifesto e origem 10.20.2.10. NAT continua disponível, mas não participa desse caminho S3. IDs e endereços gerados podem variar.

Observar a associação com a tabela errada

Mova o endpoint para fora da tabela da aplicação e observe por que um recurso disponível pode ser inacessível.

Associação endpoint–tabela é diferente de associação sub-rede–tabela. Altere somente a primeira:

aws ec2 modify-vpc-endpoint \
  --vpc-endpoint-id "$ENDPOINT_ID" \
  --add-route-table-ids "$PUBLIC_RT_ID" \
  --remove-route-table-ids "$PRIVATE_RT_ID"

A resposta informa Return: true. Leia o endpoint:

aws ec2 describe-vpc-endpoints \
  --vpc-endpoint-ids "$ENDPOINT_ID" \
  --query 'VpcEndpoints[].{State:State,Tables:RouteTableIds}' \
  --output json

Continua available, mas apenas a tabela pública aparece. Leia ambas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
  --query 'RouteTables[].{ID:RouteTableId,Routes:Routes,Associations:Associations}' \
  --output json

A rota S3 automática passou à tabela pública. A privada contém só local; sua rota NAT já foi removida. As associações das sub-redes continuam intactas. Compartilhar uma VPC não disponibiliza uma rota de endpoint a todas as sub-redes.

Quando AWS View mostrar a mudança, clique em Read storage object. A nova solicitação retorna Connection failed e Storage unavailable: falta o caminho S3 na tabela da aplicação. Request outbound service também falha. O sucesso anterior é histórico. Preserve essa falha para a verificação do passo; depois você a corrigirá.

Restaurar a rota privada do serviço

Repare a associação sem recriar o endpoint, atribuir endereço público ou restaurar NAT.

Devolva o mesmo endpoint à tabela privada e remova a pública:

aws ec2 modify-vpc-endpoint \
  --vpc-endpoint-id "$ENDPOINT_ID" \
  --add-route-table-ids "$PRIVATE_RT_ID" \
  --remove-route-table-ids "$PUBLIC_RT_ID"

Leia a associação:

aws ec2 describe-vpc-endpoints \
  --vpc-endpoint-ids "$ENDPOINT_ID" \
  --query 'VpcEndpoints[].{State:State,Tables:RouteTableIds}' \
  --output json

Somente a privada deve aparecer. Inspecione as rotas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
  --query 'RouteTables[].{ID:RouteTableId,Routes:Routes}' \
  --output json

A rota S3 privada retorna automaticamente e desaparece da pública. A rota pública de Internet permanece; a privada ainda não tem rota padrão.

Uma nova Read storage object retorna o manifesto original de 10.20.2.10. Request outbound service continua falhando, pois S3 não fornece conectividade geral à Internet. Request private application from outside segue bloqueada. Endereço privado e regras fornecidas são preservados.

Excluir o endpoint e restaurar NAT

Exclua seu endpoint, confira a retirada das rotas automáticas e restaure a rota privada para o NAT fornecido.

Exclua apenas seu endpoint:

aws ec2 delete-vpc-endpoints --vpc-endpoint-ids "$ENDPOINT_ID"

Unsuccessful deve estar vazio. Leia o inventário completo, sem filtrar por tags removíveis:

aws ec2 describe-vpc-endpoints \
  --query 'VpcEndpoints[].{ID:VpcEndpointId,State:State,Tables:RouteTableIds}' \
  --output json

Pode restar um registro deleted, mas nenhum endpoint de prática ativo. O registro não encaminha tráfego. Se aparecer deleting, aguarde alguns segundos e repita a consulta. Leia as tabelas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
  --query 'RouteTables[].{ID:RouteTableId,Routes:Routes}' \
  --output json

Nenhuma deve conter o prefixo S3. Read storage object falha enquanto a privada contém só local, confirmando que não há caminho alternativo oculto.

Restaure a rota padrão com o ID NAT salvo. Não exclua NAT, endereço, aplicação ou dados S3:

aws ec2 create-route \
  --route-table-id "$PRIVATE_RT_ID" \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id "$NAT_ID"

Leia as rotas restauradas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

local e NAT ativo correspondem ao estado inicial. Uma consulta de inventário com falha não prova exclusão: a consulta autenticada deve funcionar e confirmar ausência ou deleted, sem rotas automáticas.

Clique novamente em Read storage object: o manifesto retorna por NAT, cujo endereço público aparece em Source address. Request outbound service funciona com o mesmo endereço; Request private application from outside segue bloqueada. Preserve VPC, sub-redes, NAT, regras, objeto S3 e rede de referência.

Execute a verificação de conclusão desta etapa.

Resumo

Você criou um endpoint S3 e verificou leituras reais com origem privada. Sem a rota NAT padrão, S3 continuou acessível e outros destinos foram bloqueados. A associação pública interrompeu o acesso; a privada o reparou sem mudar aplicação ou regras.

Você excluiu o endpoint e suas rotas e restaurou NAT.