Recebo um erro HTTP “403 Forbidden” quando chamo minha API pública do Amazon API Gateway a partir da minha Amazon Virtual Private Cloud (Amazon VPC).
Breve descrição
Como os endpoints da interface da Amazon VPC direcionam o tráfego somente para APIs privadas, é possível receber um erro HTTP “403 Forbidden” ao tentar acessar as APIs públicas do API Gateway.
O erro HTTP “403 Forbidden” ocorre quando você tenta acessar uma API pública do API Gateway a partir de uma VPC com nomes de DNS privados ativados. Se você ativar nomes de DNS privados, todas as solicitações da Amazon VPC para as APIs do API Gateway serão resolvidas para o endpoint da interface da VPC.
No entanto, não é possível usar um endpoint da VPC de interface para se conectar a APIs públicas porque o nome DNS privado do endpoint está no formato *.execute-api.{region}.amazonaws.com. O caractere * é um espaço reservado para o ID da API. Esse formato corresponde ao URL de invocação padrão do API Gateway para APIs públicas e privadas.
Quando você ativa os nomes de DNS privados, chama os URLs da API do API Gateway no formato *.execute-api.{region}.amazonaws.com resolva os endereços IP privados do endpoint da VPC da interface. Essa configuração encaminha todo o tráfego para o API Gateway por meio da interface do endpoint da VPC para APIs públicas e privadas.
Você também recebe um erro “403 Forbidden” ao usar o AWS Direct Connect para invocar a URL execute-api padrão para se conectar a APIs privadas a partir de uma rede on-premises.
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Verifique se sua Amazon VPC usa configurações de DNS privadas
Para resolver o erro HTTP “403 Forbidden”, primeiro determine se sua Amazon VPC usa configurações de DNS públicas ou privadas. É possível usar a AWS CLI ou o console da Amazon VPC.
AWS CLI
Execute o seguinte comando describe-vpc-endpoints:
export VPC_ID=YOUR_VPC_ID
export REGION=YOUR_REGION
aws ec2 describe-vpc-endpoints \
--filters "Name=vpc-id,Values=${VPC_ID}" \
"Name=service-name,Values=com.amazonaws.${REGION}.execute-api" \
--query 'Amazon VPC endpointndpoints[].{Name:Tags[?Key==`Name`].Value|[0],Amazon VPC endpointndpointId:Amazon VPC endpointndpointId,PrivateDnsEnabled:PrivateDnsEnabled}' \
--output table
Observação: substitua YOUR_VPC_ID pelo seu ID de VPC e YOUR_REGION pela sua região da AWS.
Console Amazon VPC
Verifique se você ativou o nome DNS privado na configuração do endpoint da VPC da sua interface. Além disso, verifique se há uma interface endpoint da VPC para acessar uma API REST privada em sua VPC. Se houver uma interface endpoint da VPC, verifique se você ativou os atributos de DNS.
Conecte-se a APIs públicas com nomes DNS privados ativados
Se você ativou o DNS privado, configure nomes de domínio personalizados otimizados para a borda ou nomes de domínio personalizados regionais para se conectar às suas APIs públicas. Em seguida, é possível invocar a API pública do API Gateway com o nome de domínio personalizado, como api.example.com. A conectividade com suas APIs REST privadas continua funcionando por meio do endpoint privado da API REST.
Se os clientes se conectarem a partir de uma rede on-premises, configure um endpoint de entrada do Amazon Route 53 Resolver. Para usar a URL de invocação execute-api, encaminhe todas as consultas de DNS privadas da sua rede on-premises para o endpoint de entrada.
Observação: seus recursos de VPC devem ter conectividade com a Internet para se conectar às suas APIs públicas.
Conecte-se a APIs públicas com nomes DNS privados desativados
Para permitir tráfego de saída para suas APIs públicas, use grupos de segurança para sua VPC. Além disso, modifique a política de recursos anexada à sua API para permitir o acesso da VPC.
Se sua VPC tiver permissão para acessar suas APIs REST públicas, use o comando execute-api padrão para se conectar às suas APIs REST públicas. Também é possível usar o nome de domínio personalizado para se conectar à sua API REST pública. Para obter mais informações, consulte Controlar e gerenciar o acesso a APIs REST no API Gateway.
Se você desativar os nomes de DNS privados para o endpoint da interface da VPC, o URL de invocação execute-api padrão não se conectará mais às APIs REST privadas.
Para invocar APIs REST privadas, execute uma das seguintes ações:
-
Use cabeçalhos de host com seu endpoint da Amazon VPC como DNS, como no exemplo a seguir:
curl -H "Host: {your-api-id}.execute-api.{region}.amazonaws.com" \
https://Amazon VPC endpoint-xxxxx-xxxxx.execute-api.{region}.Amazon VPC endpoint.amazonaws.com/stage/path
-
Crie uma zona hospedada privada para execute-api.{region}.amazonaws.com. Na zona hospedada privada, adicione um registro A para seu identificador de API. Aponte o registro A para os endereços IP do endpoint da VPC da interface para que você possa usar a URL de invocação execute-api padrão da API REST privada.
Alterar os atributos de DNS privado para um endpoint da VPC de interface
É possível alterar os atributos de DNS privados de um endpoint de interface. As alterações afetam como a URL de um estágio da API é resolvida para o endereço IP privado do endpoint de interface da VPC. Além disso, as mudanças afetam a forma como é possível se conectar a APIs privadas e APIs públicas a partir de uma VPC. Para mais informações, consulte Atributos de DNS para sua VPC.
Informações relacionadas
Acessar um serviço da AWS usando um endpoint da VPC de interface