Le Blog Amazon Web Services

Intégrer un point d’accès privés Amazon API Gateway avec un réseau privé on-premises

En utilisant AWS Direct Connect ou AWS Site-to-Site VPN, vous pouvez établir une connexion privée depuis votre réseau on-premises vers votre Amazon Virtual Private Cloud (VPC). La connectivité réseau hybride vous permet de bénéficier de la scalabilité, de l’élasticité et de la facilité d’utilisation des services AWS tout en utilisant votre réseau d’entreprise.

Amazon API Gateway permet aux développeurs d’interagir plus facilement avec d’autres services et de les exposer de manière uniforme et sécurisée. Vous pouvez utiliser API Gateway pour interagir avec d’autres services AWS tels que les points de terminaison Amazon SageMaker pour bénéficier de prévisions de Machine Learning en temps réel ou de calculs serverless avec AWS Lambda. API Gateway peut également s’intégrer aux points de terminaison HTTP(S) ainsi qu’aux liens VPC et donc aux ressources s’y trouvant.

Cet article illustre comment configurer un point de terminaison API Gateway privé avec une intégration avec AWS Lambda. Nous utilisons Route 53 resolver, qui permet aux applications clientes on-premises de résoudre les noms DNS privés AWS.

Vue d’ensemble

Les points de terminaison privés API Gateway vous permettent d’utiliser des points de terminaison d’API privées au sein de votre VPC. Lorsqu’il est utilisé avec un résolveur Route 53 et une connectivité hybride, il est possible d’accéder aux API et à leurs services intégrés de manière privée, à partir de clients on-premises.

Vous pouvez déployer l’application de démonstration à l’aide d’AWS Serverless Application Model (AWS SAM). Le déploiement crée un point de terminaison privé API Gateway avec une intégration avec une fonction Lambda et un point de terminaison entrant sur Route 53. Voici l’architecture de la solution :

API Gateway privée avec intégration Lambda “Hello World”.

  1. Le client appelle le point de terminaison de l’API privée (par exemple, GET https://abc123xyz0.execute-api.eu-west-1.amazonaws.com/demostage);
  2. Le client demande au serveur DNS on-premises de résoudre l’hôte (abc123xyz0.execute-api.eu-west-1.amazonaws.com). Vous devez configurer le serveur DNS on-premises pour transférer les requêtes DNS des domaines hébergés par AWS vers les adresses IP du point de terminaison du résolveur entrant. Reportez-vous à la documentation de votre serveur DNS interne pour configurer les redirecteurs DNS;
  3. Lorsque le client a résolu l’hôte DNS privé d’API Gateway, il reçoit l’adresse IP privée du point de terminaison VPC d’API Gateway;

    Remarque : Appelez le point de terminaison DNS d’API Gateway pour que le certificat HTTPS fonctionne. Vous ne pouvez pas appeler directement l’adresse IP du point de terminaison.

  4. Amazon API Gateway transmet la requête à AWS Lambda;
  5. Si l’enregistrement des logs des requêtes du résolveur Route 53 est configurée, les requêtes provenant des ressources on-premises utilisant le point de terminaison seront enregistrées.

Prérequis

Pour déployer notre application de démonstration, vous aurez besoin :

  • Des informations d’identification (identifiants AWS) qui fournissent les autorisations nécessaires pour créer les ressources. Cet exemple se base sur des permissions administrateur.
  • D’une connexion via Amazon VPN ou AWS Direct Connect avec des règles de routage qui permettent au trafic DNS de passer à travers Amazon VPC.
  • Du AWS SAM CLI installé.
  • De cloner le dépôt GitHub de l’application.

Déploiement avec AWS SAM

1. Depuis un terminal, accédez au répertoire du dépôt cloné. Vous pouvez également utiliser la commande sam init et coller l’URL du dépôt :

2. Créez l’application AWS SAM :

sam init

Déployez l’application AWS SAM :

sam deploy —guided

Cette commande crée et configure un VPC avec deux sous-réseaux privés (pour la résilience) et la résolution DNS activée. Elle crée également un point de terminaison VPC avec les paramètres Service Name = “com.amazonaws.{region}.execute-api”, Private DNS Name = enabled ; et un groupe de sécurité défini pour autoriser le port TCP 443 entrant à partir d’une liste de préfixes. Vous pouvez modifier la liste de préfixes avec un ou plusieurs blocs d’adresse CIDR.

La commande déploie également un point de terminaison privé API Gateway et une stratégie de ressources API Gateway qui restreint l’accès à l’API, à l’exception du point de terminaison du VPC. Une fonction Lambda « Hello World » sera également créée ainsi qu’un résolveur Route 53 avec un groupe de sécurité qui autorise le flux entrant sur le port DNS via TCP/UDP à partir de la liste de préfixes on-premises.

Un point de terminaison VPC est une construction logique composée d’une ou plusieurs Elastic Network Interface (ENI) déployées dans des sous-réseaux. Une adresse IP privée est attribuée à chaque ENI dans votre sous-réseau. Pour assurer une haute disponibilité, déployez une ENI dans au moins deux zones de disponibilité différents.

Point de terminaison VPC API Gateway privé.

Point de terminaison entrant du résolveur Route 53

Le résolveur Route 53 est le serveur DNS AWS. Il est parfois appelé « AmazonProvidedDNS » ou « .2 resolver », et est disponible par défaut dans tous les VPC. Le résolveur Route 53 répond aux requêtes DNS provenant de ressources AWS au sein d’un VPC pour les enregistrements DNS publics, les noms DNS spécifiques au VPC et les zones hébergées privées Route 53.

L’intégration de votre serveur DNS on-premises avec le serveur DNS AWS nécessite un point de terminaison entrant du résolveur Route 53 (pour les requêtes DNS que vous transférez vers vos VPC). Lors de la création d’un point de terminaison privé API Gateway, un nom DNS privé est créé par API Gateway. Ce point de terminaison est résolu automatiquement depuis votre VPC.

Toutefois, les serveurs on-premises doivent résoudre ce nom d’hôte auprès d’AWS. Pour cela, créez un point de terminaison entrant du résolveur Route 53 et pointez votre serveur DNS on-premises vers celui-ci. Cela permet à vos ressources réseau internes de résoudre les noms d’hôte DNS privés AWS.

Pour améliorer la fiabilité, le résolveur nécessite que vous spécifiez deux adresses IP pour les requêtes DNS. AWS recommande de configurer les adresses IP dans deux zones de disponibilité différentes. Après avoir ajouté les deux premières adresses IP, vous pouvez éventuellement en ajouter d’autres dans la même zone de disponibilité ou dans une zone de disponibilité différente.

Le résolveur entrant est une ressource logique composée de deux Elastic Network Interface. Elles sont déployées dans deux zones de disponibilité différentes à des fins de résilience.

Résolveur entrant Route 53.

Configuration des groupes de sécurité et de la stratégie de ressources

Dans le pilier sécurité du AWS Well-Architected Framework, l’un des sept principes fondamentaux consiste à appliquer la sécurité à toutes les couches et à adopter une approche de défense en profondeur (Defense in Depth, ou DiD) avec plusieurs contrôles de sécurité. Appliquez-le à toutes les couches (bordure de réseau, VPC, équilibrage de charge, chaque instance et service de calcul, système d’exploitation, application et code).

Quelques configurations de sécurité sont nécessaires au bon fonctionnement de la solution :

  • Le groupe de sécurité du résolveur (appelé « ResolverSG » dans le diagramme de la solution) doit autoriser le trafic TCP et UDP sur le port 53 (DNS) depuis votre liste de préfixes on-premises (origine).

    Remarque : configurez la liste de préfixes avec les blocs d’adresse CIDR de votre réseau interne.

  • Le groupe de sécurité du point de terminaison VPC d’API Gateway « VPCEndpointSG » doit autoriser le trafic HTTPS à partir de votre liste de préfixes on-premises (origine).

    Remarque : configurez la liste de préfixes avec les blocs d’adresse CIDR de votre réseau interne.

  • Pour qu’une API Gateway privée fonctionne, une stratégie de ressources doit être configurée. Le déploiement via AWS SAM définit une stratégie de ressources API Gateway qui permet d’accéder à votre API depuis le point de terminaison du VPC. Nous demandons à API Gateway de refuser explicitement toute demande, sauf si elle provient d’un point de terminaison VPC spécifié.

    Remarque : le modèle AWS SAM crée une stratégie comme la suivante :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:eu-west-1:abc123xyz0:mz0ifwb6nc/DemoStage/GET/hello"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:eu-west-1:abc123xyz0:mz0ifwb6nc/DemoStage/GET/hello",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-xxxxxxxxxxxxxxxxx"
        }
      }
    }
  ]
}

Le déploiement via AWS SAM crée une fonction Lambda “Hello World”. À des fins de démonstration, la fonction Lambda renvoie toujours une réponse positive, conformément à la réponse d’intégration d’API Gateway.

Tester la solution

Pour tester la solution, exécutez une requête curl vers l’API à partir d’un client on-premises. Pour obtenir l’URL de l’API, copiez-la à partir du retour du déploiement AWS SAM sur votre terminal. Sinon, depuis la console, accédez à la section des sorties AWS CloudFormation.

Sorties CloudFormation.

Ensuite, accédez aux résolveurs Route 53, sélectionnez le point de terminaison entrant nouvellement créé et notez les adresses IP du point de terminaison. Configurez votre redirecteur DNS on-premises avec ces adresses IP. Reportez-vous à la documentation de votre serveur DNS interne pour configurer les redirecteurs DNS.

Adresses IP du résolveur Route 53.

Enfin, connectez-vous à votre client interne et appelez le point de terminaison API Gateway. Vous devriez obtenir une réponse de la part d’API Gateway, comme illustré.

$ curl https://mz0ifwb6nc.execute-api.eu-west-1.amazonaws.com/DemoStage/hello
{"response": {"resultStatus": "SUCCESS"}}

Supervision et dépannage

La journalisation des requêtes du résolveur Route 53 vous permet d’enregistrer les requêtes DNS qui proviennent de vos VPC. Les logs indiquent quels noms de domaine sont interrogés, les ressources AWS d’origine (y compris l’adresse IP source et l’ID d’instance) et les réponses.

Vous pouvez enregistrer les requêtes DNS provenant de VPCs que vous spécifiez en plus des réponses à ces requêtes DNS. Vous pouvez également enregistrer les requêtes DNS provenant de ressources internes (on-premises) qui utilisent un point de terminaison de résolveur entrant, et les requêtes DNS qui utilisent un point de terminaison de résolveur sortant pour la résolution DNS récursive.

Après avoir configuré la journalisation des requêtes à partir de la console, vous pouvez utiliser Amazon CloudWatch comme destination des logs de requêtes. Vous pouvez utiliser cette fonctionnalité pour afficher et résoudre les problèmes liés au résolveur.

{
  "version": "1.100000",
  "account_id": "1234567890123",
  "region": "eu-west-1",
  "vpc_id": "vpc-acb123def456g",
  "query_timestamp": "2021-04-25T12:37:34Z",
  "query_name": "mz0ifwb6nc.execute-api.eu-west-1.amazonaws.com.",
  "query_type": "A",
  "query_class": "IN",
  "rcode": "NOERROR",
  "answers": [
    {
      "Rdata": "10.0.140.226", # API Gateway VPC Endpoint IP#1
      "Type": "A",
      "Class": "IN"
    },
    {
      "Rdata": "10.0.12.179", # API Gateway VPC Endpoint IP#2
      "Type": "A",
      "Class": "IN"
    }
  ],
  "srcaddr": "172.31.6.137", # CLIENT ONPREMISES
  "srcport": "32843",
  "transport": "UDP",
  "srcids": {
    "resolver_endpoint": "rslvr-in-40e83850b1504065a",
    "resolver_network_interface": "rni-39ea84db5572415b8"
  }
}

Suppression des ressources

Pour supprimer les ressources AWS créées pour cette application, accédez à CloudFormation et supprimez la stack.

Conclusion

Les points de terminaison privés API Gateway permettent de créer des services basés sur des API privées au sein de vos VPC. Le frontend de votre application (API Gateway) ainsi que le backend peuvent rester privé, à l’intérieur de votre VPC.

Nous avons illustré comment accéder à vos API privées à partir de votre réseau interne via Direct Connect ou AWS Site-to-Site VPN sans exposer vos points de terminaison sur Internet. Vous pouvez déployer l’application de démonstration à l’aide d’AWS Serverless Application Model (AWS SAM). Vous pouvez également modifier le modèle en fonction de vos propres besoins.

Pour en savoir plus, vous pouvez consulter la page des didacticiels et ateliers API Gateway dans le guide des développeurs API Gateway. Vous pouvez également trouver des ressources et des formations dédiées au Serverless sur Serverless Land.

Article original rédigé en anglais par Ahmed ElHaw, Sr. Solutions Architect, et adapté en français par Lionel Gattegno, Senior Solutions Architect dans l’équipe AWS France.