Comment résoudre les problèmes de connexion à un point de terminaison d'une API privée d'API Gateway ?

Dernière mise à jour : 25/02/2022

Je rencontre des problèmes pour me connecter au point de terminaison de mon API privée Amazon API Gateway qui se trouve dans un cloud privé virtuel Amazon (VPC Amazon). Comment résoudre ce problème ?

Brève description

Les ressources AWS de votre VPC Amazon peuvent ne pas se connecter à un point de terminaison d'API privée pour l'une des raisons suivantes :

Si la journalisation Amazon CloudWatch est activée pour votre API, un message d'erreur indiquant la cause de l'erreur s'affiche dans vos journaux d'exécution.

Si la demande d'API ne produit aucun journal CloudWatch après l'activation de la journalisation, cela signifie que la demande n'a pas atteint le point de terminaison. Si vos demandes d'API n'atteignent pas le point de terminaison, assurez-vous que l'URL d'appel de l'API privée est correctement formatée.

Remarque : pour les problèmes de connexion liés à un client externe, tel qu'un VPC Amazon dans un autre compte AWS ou un réseau sur site, le problème est probablement dû à une politique de ressources API Gateway mal configurée ou à des noms DNS incorrects dans l'URL d'appel du point de terminaison de l'API privée.

Solution

Confirmer la cause de l'erreur

1.    Si ce n'est déjà fait, activez la journalisation CloudWatch pour votre API REST privée. Assurez-vous de configurer la journalisation d'exécution.

Conseil : lorsque vous configurez les paramètres de journalisation, procédez comme suit :
Pour Log level (Niveau de journalisation), choisissez INFO.
Choisissez également Log full requests/responses data (Consigner les données complètes des requêtes/réponses).

2.    Identifiez la cause des erreurs en consultant les journaux d'exécution de l'API REST dans CloudWatch. Si les demandes d'API atteignent le point de terminaison, un message d'erreur similaire à l'un des exemples suivants s'affiche :

  • « User: anonymous is not authorized to perform: execute-api:Invoke on resource: » (« L'utilisateur anonyme n'est pas autorisé à exécuter execute-api:Invoke sur la ressource: »)
  • « Connection timed out » (« La connexion a expiré »)

Si la demande d'API ne produit aucun journal CloudWatch après l'activation de la journalisation, assurez-vous que l'URL d'appel de l'API privée est correctement formatée. Pour obtenir des instructions, consultez la section Si la demande d'API ne produit aucun journal CloudWatch après l'activation de la journalisation de cet article.

Pour plus d'informations, consultez la section Comment trouver les erreurs d'API REST API Gateway dans mes journaux CloudWatch ?

Pour résoudre le message d'erreur « User: anonymous is not authorized to perform: execute-api:Invoke on resource: » (« L'utilisateur anonyme n'est pas autorisé à exécuter execute-api:Invoke sur la ressource »)

1.    Vérifiez que la politique de ressources API Gateway du point de terminaison de l'API privée autorise le trafic du point de terminaison du VPC d'interface ou du VPC source vers le point de terminaison de l'API privée. Pour obtenir un exemple de politique de ressources, consultez la section Exemple : autoriser le trafic de l'API privée basé sur le VPC source ou le point de terminaison d'un VPC.

2.    Vérifiez que la politique du point de terminaison du VPC autorise le client à accéder au point de terminaison de l'API privée. Pour obtenir des exemples de politiques de point de terminaison de VPC, consultez la section Exemples de politiques de points de terminaison de VPC.

Pour obtenir des instructions sur la façon de tester les politiques de ressources API Gateway, consultez la section Tester la politique de ressource de l'article suivant : Comment autoriser uniquement des adresses IP spécifiques à accéder à mon API REST API Gateway ?

Important : si vous modifiez la politique de ressources de votre API, vous devez déployer votre API pour valider les modifications.

Pour résoudre les erreurs « Connection timed out » (« La connexion a expiré »)

Vérifiez que les règles relatives aux groupes de sécurité de votre VPC Amazon sont correctement configurées.

Pour tester les groupes de sécurité de votre VPC Amazon

Exécutez la commande suivante à partir du client qui envoie des demandes au point de terminaison de l'API privée :

Important : Remplacez {public-dns-hostname} par les noms d'hôte DNS publics contenant l'ID de point de terminaison du VPC pour votre API. Remplacez {region} par la Région AWS où se trouve le point de terminaison de votre VPC d'interface.

$ telnet {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com 443

Si la connexion expire, cela signifie que les règles des groupes de sécurité de votre VPC Amazon ne sont pas correctement configurées.

Conseil : si la connexion expire, assurez-vous de vérifier les éléments suivants :

  • Le groupe de sécurité de la ressource à l'origine de la demande comprend une règle qui autorise le trafic sortant du port TCP 443 vers la plage d'adresses IP ou le groupe de sécurité du point de terminaison du VPC.
  • Le groupe de sécurité du point de terminaison du VPC comprend une règle qui autorise le trafic entrant sur le port TCP 443 à partir de la plage d'adresses IP ou du groupe de sécurité de la ressource à l'origine de la demande.

Pour plus d'informations, consultez la section Contrôle du trafic vers les ressources à l'aide de groupes de sécurité.

Si la demande d'API ne produit aucun journal CloudWatch après l'activation de la journalisation

1.    Vérifiez que la politique de ressources API Gateway du point de terminaison de l'API privée est correctement configurée. Pour plus d'informations, consultez la section suivante de cet article :Pour résoudre les erreurs « User: anonymous is not authorized to perform: execute-api:Invoke on resource: » (« L'utilisateur anonyme n'est pas autorisé à exécuter execute-api:Invoke sur la ressource »).

2.    Vérifiez que l'URL d'appel de votre API privée est correctement formatée.

Remarque : un DNS privé doit être activé pour le point de terminaison du VPC pour que le format soit correct. Si le DNS privé n'est pas activé, vous devez utiliser des noms d'hôte DNS publics spécifiques au point de terminaison pour accéder au point de terminaison de l'API privée. Si le DNS privé est activé, vous devez utiliser des noms de DNS privés pour accéder au point de terminaison de l'API privée. Pour plus d'informations, consultez Procédure d'appel d'une API privée.

Pour confirmer que le domaine du point de terminaison de l'API privée est correctement résolu à l'adresse IP du point de terminaison du VPC

1.    Exécutez la commande nslookup suivante à partir du client qui envoie des demandes au point de terminaison de l'API privée :

Important : remplacez {restapi-id} par l'ID de votre API privée. Remplacez {region} par la Région AWS où se trouve le point de terminaison de votre API privée.

$ nslookup {restapi-id}.execute-api.{region}.amazonaws.com

Une sortie réussie indique les adresses IP privées du point de terminaison du VPC.

2.    Exécutez la commande nslookup suivante :

Important : Remplacez {public-dns-hostname} par les noms d'hôte DNS publics contenant l'ID de point de terminaison du VPC pour votre API. Remplacez {region} par la Région AWS où se trouve le point de terminaison de votre VPC d'interface.

$ nslookup {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com

Une sortie réussie indique les adresses IP privées du point de terminaison du VPC.

3.    Comparez les adresses IP dans les sorties de chaque commande. Si les adresses IP de chaque sortie de commande correspondent, la configuration fonctionne comme prévu.

Remarque : vous pouvez activer le DNS privé pour le point de terminaison du VPC à tout moment dans la console du VPC Amazon en procédant comme suit :
Dans le volet Endpoints (Points de terminaison), sélectionnez le point de terminaison de votre VPC d'interface.
Choisissez Actions (Actions).
Choisissez Modify Private DNS names (Modifier les noms DNS privés).
Cochez la caseEnable Private DNS Name (Activer le nom DNS privé). Choisissez ensuite Save Changes (Enregistrer les modifications).
Choisissez Modify Private DNS names (Modifier les noms DNS privés).