Comment puis-je accéder à une API REST privée d'API Gateway située dans un autre compte AWS à l'aide d'un point de terminaison d'un VPC d'interface ?

Dernière mise à jour : 08/05/2020

Je souhaite utiliser un point de terminaison d'un VPC d'interface pour accéder à une API REST privée d'Amazon API Gateway qui se trouve dans un autre compte AWS. Comment dois-je procéder ?

Brève description

Créez un point de terminaison d'interface dans un Amazon Virtual Private Cloud (Amazon VPC) au sein d'un compte (« compte A »). Dans un autre compte (« compte B »), créez une API REST privée API Gateway dotée d'une stratégie de ressources autorisant le point de terminaison d'interface à appeler l'API.

Solution

Créer un point de terminaison d'interface dans le compte A

1.    Dans le compte A, ouvrez la page Points de terminaison de la console Amazon VPC.

2.    Choisissez Create Endpoint (Créer un point de terminaison).

3.    Une fois la page Create Endpoint (Créer un point de terminaison) ouverte, effectuez les actions suivantes :
Dans Service category (Catégorie de services), sélectionnez AWS services (Services AWS).
Dans VPC, choisissez l'Amazon VPC au sein duquel vous souhaitez créer le point de terminaison d'interface.
Dans Subnets (Sous-réseaux), sélectionnez les sous-réseaux dans lesquels vous souhaitez créer les interfaces réseau de point de terminaison. Sélectionnez plusieurs sous-réseaux situés dans différentes zones de disponibilité pour vous assurer que le point de terminaison de votre interface résiste aux éventuelles défaillances des zones de disponibilité.
Dans Enable DNS name (Activer le nom DNS), vérifiez que la case Enable for this endpoint (Activer pour ce point de terminaison) est bien cochée. La fonction DNS privé sera ainsi activée pour le point de terminaison d'interface. Lorsque le DNS privé est activé, vous pouvez vous connecter à votre API privée à l'aide d'un DNS privé ou public.
Remarque : en activant le DNS privé pour un point de terminaison d'un VPC d'interface, vous ne pouvez plus accéder aux API publiques API Gateway depuis votre Amazon VPC. Pour plus d'informations, consultez la section Pourquoi l'erreur HTTP 403 Forbidden (HTTP 403 Interdit) est-elle générée lorsque je me connecte à mes API d'API Gateway à partir d'un VPC ?
Dans Groupe de sécurité, sélectionnez au moins un groupe de sécurité à associer aux interfaces réseau du point de terminaison. Le groupe de sécurité choisi doit comporter une règle qui autorise le trafic HTTPS entrant du port TCP 443 à partir d'une plage d'adresses IP de votre Amazon VPC ou d'un autre groupe de sécurité de votre Amazon VPC. Si aucun de vos groupes de sécurité ne remplit ces exigences, choisissez l'option Create a new security group (Créer un nouveau groupe de sécurité). Si vous ne spécifiez pas de groupe de sécurité, un groupe de sécurité par défaut sera associé aux interfaces réseau du point de terminaison.
Dans Policy (Stratégie), choisissez Full Access (Accès complet).
Choisissez Create endpoint (Créer un point de terminaison).
Dans Service Name (Nom du service), choisissez le point de terminaison du service API Gateway. Le nom adopte le format com.amazonaws.region.execute-api, où l'élément region est remplacé par votre région AWS actuelle. Par exemple : com.amazonaws.us-east-1.execute-api.

4.    Copiez l'ID de point de terminaison de VPC de votre nouveau point de terminaison d'interface. Il se présente sous ce format : vpce-1a2b3c456d7e89012. Cet ID est nécessaire lors de la création et de la configuration de votre API privée.

5.    Sélectionnez Close (Fermer).

6.    Sur la page Endpoints (Points de terminaison) de la console Amazon VPC, sous l'onglet Details (Détails), notez les noms DNS. Copiez le nom DNS public de votre point de terminaison d'interface. Exemple : vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com.

Pour plus d'informations, consultez la section Création d'un point de terminaison de VPC d'interface pour API Gateway execute-api.

Créer une API REST privée dans le compte B

1.    Depuis le compte B, ouvrez la console API Gateway.

2.    Sélectionnez Create API (Créer une API).

3.    Sous API REST privée, choisissez Générer.

4.    Sur la page Create (Créer), l'option Choose the protocol (Choisir le protocole) doit être définie sur REST.

5.    Sous Create new API (Créer une nouvelle API), choisissez New API (Nouvelle API).

6.    Sous Settings (Paramètres), procédez comme suit :
Dans API name (Nom de l'API), saisissez un nom pour votre API.
(Facultatif) Dans le champ Description, saisissez la description de votre API.
L'option Endpoint Type (Type de point de terminaison) doit être définie sur Private (Privé).
Dans VPC Endpoint IDs (ID de point de terminaison du VPC), collez l'ID de point de terminaison d'interface précédemment copié, puis choisissez Add (Ajouter).
Remarque : lorsque vous associez votre point de terminaison d'interface à votre API REST privée, API Gateway génère un nouvel enregistrement d'alias Amazon Route 53. Vous pouvez utiliser l'alias Route 53 pour accéder à votre API privée.

7.    Sélectionnez Create API (Créer une API).

Pour plus d'informations, consultez la section Création d'une API privée dans Amazon API Gateway.

Configurer une stratégie de ressources pour votre API REST privée

1.    Dans le volet de navigation de gauche de la console API Gateway, choisissez Stratégie de ressources.

2.    Sur la page Resource Policy (Stratégie de ressources) collez l'exemple de stratégie de ressources suivant dans la zone de texte :

Remarque : remplacez vpce-1a2b3c456d7e89012 par l'ID du point de terminaison d'interface précédemment copié.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-1a2b3c456d7e89012"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*"
        }
    ]
}

Pour plus d'informations, consultez la section Configurez une stratégie de ressources pour une API privée.

Configurer une méthode pour votre API REST privée

1.    Dans le volet de navigation de gauche de la console API Gateway, choisissez Resources (Ressources).

2.    Dans le volet Resources, choisissez Actions, puis Create Method (Créer une méthode).

3.    Dans la liste déroulante sous le nœud de ressource /, choisissez ANY (TOUT), puis sélectionnez l'icône de coche.

4.    Dans le volet / - ANY - Setup (/ - TOUT - Configuration), pour Integration type (Type d'intégration), choisissez Mock (Fictif). Une intégration fictive répond à toutes les requêtes qui l’atteignent, ce qui nous permettra d'effectuer des tests ultérieurs.

5.    Choisissez Save (Enregistrer).

Pour plus d'informations, consultez la section Configuration des méthodes de l'API REST dans API Gateway.

Déployer votre API REST privée

1.    Dans le volet Resources (Ressources) de la console API Gateway, choisissez Actions, puis Deploy API (Déployer l'API).

2.    Dans la boîte de dialogue Deploy API (Déployer l'API), procédez comme suit :
Dans Deployment stage (Étape de déploiement), choisissez [New Stage] (Nouvelle étape).
Saisissez un nom dans le champ Stage name (Nom de l’étape). Par exemple, dev ou test.
Choisissez Deploy (Déployer).

3.    Dans le volet Stage Editor (Éditeur d'étape), notez le message (« If Private DNS is enabled, use this URL » – « Si le DNS privé est activé, utilisez cette URL : ») contenant l'URL d'appel de votre API privée. Copiez cette URL, que nous utiliserons à des fins de test.

Pour plus d'informations, consultez la section Déploiement d'une API privée à l'aide de la console API Gateway.

Tester votre API privée à partir du compte A

1.    Dans le compte A, lancez une instance Amazon Elastic Compute Cloud (Amazon EC2) dans le même Amazon VPC que votre point de terminaison d'interface. Lors de la configuration, choisissez le groupe de sécurité que vous avez associé à votre point de terminaison d'interface.

2.    Connectez-vous à l'instance EC2.

Remarque : l'utilisation d'une instance EC2 peut entraîner des frais sur votre compte AWS. Si vous créez une instance uniquement pour cet exemple, pensez à la résilier une fois la procédure terminée, afin d'éviter des frais récurrents.

3.    Ouvrez l'interface de ligne de commande de votre instance EC2, puis exécutez l'une des commandes curl suivantes pour appeler l'API privée dans le compte B. Pour plus d'informations sur curl, consultez le site Web du projet curl.

Nom DNS privé :

curl -i https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name

Remarque : remplacez https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name par l'URL d'appel de votre API privée, précédemment copiée à partir de la console API Gateway. Cette commande fonctionne uniquement si vous avez activé le DNS privé pour votre point de terminaison d'interface. Pour plus d'informations, consultez la section Appel de votre API privée à l'aide de noms DNS privés.

Alias Route 53 :

curl -i https://a1bc234d5e-vpce-1a2b3c456d7e89012.execute-api.region.amazonaws.com/stage-name

Remarque : remplacez a1bc234d5e par l'ID de votre API.
Remplacez vpce-1a2b3c456d7e89012 par l'ID du point de terminaison d'interface.
Remplacez region par la région de votre API. (Par exemple, us-east-1.)
Remplacez stage-name par le nom de l'étape où vous avez déployé votre API privée. Pour plus d'informations, consultez la section Accès à votre API privée à l'aide d'un alias Route 53.

Nom DNS public avec un en-tête Host :

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "Host: https://a1bc234d5e.execute-api.region.amazonaws.com"

Remarque : remplacez vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com par le nom DNS public que vous avez noté dans la console Amazon VPC.
Remplacez stage-name par le nom de l'étape où vous avez déployé votre API privée.
Remplacez https://a1bc234d5e.execute-api.region.amazonaws.com par l'URL d'appel de votre API récupérée dans la console API Gateway.

Nom DNS public avec l'en-tête x-apigw-api-id :

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "x-apigw-api-id:a1bc234d5e"

Remarque : remplacez vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com par le nom DNS public que vous avez noté dans la console Amazon VPC.
Remplacez stage-name par le nom de l'étape où vous avez déployé votre API privée.
Remplacez a1bc234d5e par l'ID de votre API.

Pour plus d'informations, consultez la section Appel de votre API privée à l'aide de noms d'hôte DNS publics spécifiques aux points de terminaison.

4.    Vérifiez la sortie de la commande. Lorsque la connexion aboutit, vous recevez une réponse 200 OK de la part d'API Gateway.