Adicionei um VPC endpoint ao meu VPC usando o CloudFormation e permiti o uso do s3. As rotas são visÃveis no console AWS, mas não nas tabelas de roteamento local das instâncias do EC2:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.29.4.129 0.0.0.0 UG 0 0 0 eth0
169.254.169.254 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
172.29.4.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
Como verifico se as instâncias do EC2 no VPC realmente usam o VPC endpoint para S3, e não a conexão de internet disponÃvel?
Eu acho que a maneira direta é realmente investigar essas rotas.
Você pode rastrear a rota para s3 e ver se o IP interno do Gateway NAT está em algum lugar na saÃda (por exemplo, o primeiro salto).
Primeiro, verifique os IPs internos do Gateway NAT no console .
SaÃda de exemplo com o endpoint definido - nenhum IP de gateway mostrado. Isto é o que você quer ver.
Exemplo de saÃda de um destino diferente, passando por NAT (veja o primeiro salto)
Encontrei um método para verificar o uso do VPC endpoint.
aws ec2 describe-prefix-lists
; para Windows PowerShell ,Get-EC2PrefixList
O resultado deve conter o ID da lista de prefixos de VPC endpoints no atributo
PrefixListId
.Para verificação adicional, você pode aplicar a seguinte polÃtica a um bucket do S3:
com seu vpc ID em vez de vpc-121212. Você só poderá acessar o bucket S3 da VPC fornecida
Você pode ativar o log do S3 e verificar se os arquivos estão sendo acessados ​​de seu IP privado em vez de público. Se o registro mostrar que IPs privados estão acessando os depósitos, você o configurou corretamente. Boa sorte!
Eu recomendaria iniciar a instância ec2 (com a função IAM permitida para listar os baldes s3) na sub-rede sem acesso à Internet.
Basicamente, apenas 2 regras ativas na tabela de rotas (seu intervalo de sub-rede VPC e endpoint s3).
Conecte-se à instância e execute o comando:
Ele deve falhar com o tempo limite porque o boto, por padrão, criará uma solicitação para o URL s3 global (s3.amazonaws.com).
deve listar seus baldes na região us-east-1 (o roteador vpc encaminhará sua solicitação para s3.us-east-1.amazonaws.com).
Sua instância encaminha pacotes destinados ao S3 para o gateway local e, a partir daÃ, o 'roteador' da VPC os encaminha para o endpoint S3. Nenhuma configuração ou conhecimento do cliente é necessário.
Você pode configurar o endpoint S3 com um conjunto muito restritivo de ACLs de forma que negue todas as solicitações e observe seu cliente receber a falha também.
A resposta de @m-glatki (que por algum motivo é a aceita) é factualmente incorreta.
Em primeiro lugar, você deve habilitar explicitamente uma interface ec2 VPC para poder realizar a
aws ec2 describe-prefix-lists
chamada, caso contrário, você obterá um tempo limite.Em segundo lugar, mesmo que você possa chamar essa API, ela não informará se você está roteando seu tráfego por meio desse endpoint. Ele apenas fornece detalhes sobre uma lista de prefixos (PL) especÃfica na região atual.
O que você precisa fazer é associar um S3 VPC endpoint à tabela de rotas da sub-rede e garantir que sua instância do EC2 ou grupo de segurança do serviço permita conectividade de saÃda por meio desse endpoint (você deve estar bem com a regra de saÃda padrão "permitir todos"). Isso roteará o tráfego S3 por meio do endpoint, mesmo se você tiver um gateway NAT conectado a ele.
Você pode verificar se seu tráfego não é roteado por meio do NAT verificando seus logs cloudwatch associados (Consulte as métricas BytesOutToDestination , BytesOutToSource , BytesInFromDestination e BytesInFromSource )
Verifique também os logs do bucket S3 como @michael apontou corretamente.
Elaborando a solução @m-glatki, adicione uma polÃtica no bucket que restrinja o acesso S3 a um determinado VPC Endpoint:
Você só poderá listar o conteúdo do bucket de um processo que usa o VPC endpoint. Caso contrário, você receberá uma mensagem:
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
Para obter o ID do VPC Endpoint, use este comando:
aws ec2 describe-vpc-endpoints
Veja este link