Comment utiliser API Gateway comme proxy pour un autre service AWS ?
Je souhaite utiliser Amazon API Gateway comme proxy pour un autre service AWS et intégrer d’autres services à API Gateway.
Résolution
Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre les erreurs liées à AWS CLI. Vérifiez également que vous utilisez la version la plus récente de l'interface AWS CLI.
Les API de service AWS sont des API REST auxquelles vous pouvez envoyer une requête HTTPS. Pour intégrer un autre service à API Gateway, créez une requête HTTPS depuis API Gateway vers l’API de service. Lorsque vous utilisez cette méthode, tous les paramètres de requête sont correctement mappés.
Cette résolution décrit un exemple de configuration lorsque vous intégrez l'API de publication Amazon Simple Notification Service (Amazon SNS) à API Gateway. Utilisez l'exemple suivant pour définir les méthodes à utiliser lorsque vous intégrez API Gateway à d'autres services.
Configurer les outils et les ressources obligatoires
Configurez votre environnement et créez toutes les ressources AWS obligatoires pour votre cas d’utilisation. Pour l'exemple de configuration d'Amazon SNS, procédez comme suit :
-
Créez une rubrique Amazon SNS. Notez l’Amazon Resource Name (ARN) de la rubrique.
-
Ouvrez la console de gestion des identités et des accès AWS (IAM), puis créez un rôle d’exécution de proxy de service AWS. Pour l’exemple de configuration d’Amazon SNS, autorisez l’action sns:Publish. Pour plus d'informations, consultez la section Contrôler et gérer l'accès aux API REST dans API Gateway.
-
Pour créer une API REST API Gateway, utilisez une ressource test. Pour en savoir plus et obtenir davantage d’exemples, consultez les didacticiels et ateliers Amazon API Gateway.
-
Pour importer l'API REST, utilisez l'exemple de définition d’OpenAPI 2.0 (Swagger) suivant :
{ "swagger": "2.0", "info": { "version": "2019-10-09T14:10:24Z", "title": "aws-service-integration" }, "basePath": "/dev", "schemes": [ "https" ], "paths": { "/test": { "post": { "produces": [ "application/json" ], "parameters": [ { "name": "Message", "in": "query", "required": true, "type": "string" }, { "name": "TopicArn", "in": "query", "required": true, "type": "string" } ], "responses": { "200": { "description": "200 response", "schema": { "$ref": "#/definitions/Empty" } } }, "x-amazon-apigateway-integration": { "credentials": "arn:aws:iam::account-id:role/apigateway-sns-role", "uri": "arn:aws:apigateway:your-region:sns:action/Publish", "responses": { "default": { "statusCode": "200" } }, "requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates": { "application/json": { "Fn::Sub": "Action=Publish&TopicArn=$util.urlEncode('${**YOUR-TOPIC-ARN**}')&Message=$util.urlEncode($input.body)##" } }, "passthroughBehavior": "when_no_match", "httpMethod": "POST", "type": "aws" } } } }, "definitions": { "Empty": { "type": "object", "title": "Empty Schema" } } }Remarque : remplacez arn:aws:iam::account-id:role/apigateway-sns-role par l'ARN de votre rôle IAM et YOUR-TOPIC-ARN par l'ARN de votre rubrique SNS.
L'option précédente préconfigure les paramètres de l'exemple de configuration d’Amazon SNS. Pour créer votre API REST, remplacez your-region par votre région AWS. Pour plus d'informations, consultez la page Qu'est-ce qu'OpenAPI ? sur le site Web de Swagger.
Obtenir un exemple de requête HTTPS
Un exemple de requête HTTPS provenant de l’API de service que vous intégrez peut vous aider à mapper les paramètres de requête dans API Gateway.
Pour l’API de publication d’Amazon SNS, vous pouvez consulter la référence de l’API de service pour obtenir un exemple de requête.
Pour obtenir une requête HTTPS, exécutez l'exemple de requête suivant :
https://sns.us-west-2.amazonaws.com/?Action=Publish&TargetArn=arn%3Aaws%3Asns%3Aus-west-2%3A803981987763%3Aendpoint%2FAPNS\_SANDBOX%2Fpushapp%2F98e9ced9-f136-3893-9d60-776547eafebb&Message=%7B%22default%22%3A%22This+is+the+default+Message%22%2C%22APNS\_SANDBOX%22%3A%22%7B+%5C%22aps%5C%22+%3A+%7B+%5C%22alert%5C%22+%3A+%5C%22You+have+got+email.%5C%22%2C+%5C%22badge%5C%22+%3A+9%2C%5C%22sound%5C%22+%3A%5C%22default%5C%22%7D%7D%22%7D &Version=2010-03-31 &AUTHPARAMS
- ou -
Générez l'exemple à partir d'un appel d'API. Utilisez l’AWS CLI pour appeler l’API de service, puis analysez la sortie. Déterminez la commande AWS CLI associée à l’API de service que vous intégrez, puis exécutez une requête test avec l’option —debug.
Pour générer un exemple à partir d'un appel d'API, exécutez la commande publish suivante :
aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug
Remarque : remplacez arn:aws:sns:us-east-1:123456789012:test par l’ARN de votre rubrique Amazon SNS.
Exemple de sortie :
2018-11-22 11:56:39,647 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: sns2018-11-22 11:56:39,648 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.sns.Publish: calling handler <function generate\_idempotent\_uuid at 0x11093d320>2018-11-22 11:56:39,649 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=Publish) (verify\_ssl=True) with params: {'body': {'Action': u'Publish', u'Message': u'hello', 'Version': u'2010-03-31', u'TopicArn': u'arn:aws:sns:us-east-1:123456789012:test'}, 'url': u'https://sns.us-east-1.amazonaws.com/', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.15.74 Python/2.7.14 Darwin/16.7.0 botocore/1.9.23'}, 'context': {'auth\_type': None, 'client\_region': 'us-east-1', 'has\_streaming\_input': False, 'client\_config': <botocore.config.Config object at 0x1118437d0>}, 'query\_string': '', 'url\_path': '/', 'method': u'POST'} 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event request-created.sns.Publish: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x111843750>> 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event choose-signer.sns.Publish: calling handler <function set\_operation\_specific\_signer at 0x11093d230> 2018-11-22 11:56:39,650 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth. 2018-11-22 11:56:39,651 - MainThread - botocore.auth - DEBUG - CanonicalRequest: POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:sns.us-east-1.amazonaws.com x-amz-date:20181122T062639Z content-type;host;x-amz-date
La sortie contient la requête HTTPS, les en-têtes transmis et la requête est une méthode HTTP POST.
Créer une méthode pour votre API API Gateway
Procédez comme suit :
- Ouvrez la console API Gateway.
- Dans le volet de navigation, choisissez API, puis sélectionnez le nom de votre API.
- Dans le volet Ressources, sélectionnez une ressource. Pour l’exemple de configuration d’Amazon SNS, choisissez la ressource test que vous avez créée.
- Sélectionnez Créer une méthode.
- Dans la nouvelle fenêtre :
Choisissez la méthode utilisée par votre API de service dans l'exemple de requête HTTPS.
Pour l’exemple de configuration d’Amazon SNS, choisissez POST.
Pour Type d’intégration, choisissez AWS Service.
Pour Région AWS, choisissez la région AWS de la ressource associée à l’API de service que vous intégrez.
Pour l’exemple de configuration d’Amazon SNS, choisissez la région de votre rubrique SNS.
Pour Service AWS, choisissez le service que vous intégrez à API Gateway. Par exemple, utilisez le service Simple Notification Service (SNS).
(Facultatif) Pour Sous-domaine AWS, saisissez le sous-domaine utilisé par le service AWS. Consultez la documentation du service pour confirmer la disponibilité d’un sous-domaine.
Pour l'exemple de configuration d'Amazon SNS, laissez le champ vide.
Pour Méthode HTTP, choisissez la méthode qui correspond à l’API du service AWS que vous intégrez.
Pour l’exemple de configuration d’Amazon SNS, choisissez POST.
Pour Type d’action, si l’API de service que vous intégrez est une action prise en charge, choisissez Utiliser un nom d’action. Consultez la référence d’API du service pour obtenir la liste des actions prises en charge.
Pour Amazon SNS, consultez la section Actions.
Pour Action, saisissez le nom de l’API de service. Pour l’exemple de configuration d’Amazon SNS, saisissez Publier.
-ou-
Pour Type d’action, si l’API de service AWS attend un chemin de ressource dans votre requête, sélectionnez Utiliser un remplacement du chemin. Par exemple, pour l’API Amazon Polly ListLexicons, saisissez /v1/lexicons pour le champ Remplacement du chemin (facultatif).
Pour Rôle d’exécution, saisissez l’ARN du rôle IAM que vous avez créé. - Sélectionnez Créer une méthode.
Créer des paramètres pour la demande de méthode
Identifiez les paramètres de requête obligatoires et facultatifs pour l’API de service que vous intégrez. Pour connaître ces paramètres, consultez l’exemple de requête HTTPS que vous avez reçu précédemment ou la référence d’API pour l’API de service. Pour obtenir un exemple, consultez la section Publier.
Procédez comme suit :
- Ouvrez la console API Gateway.
- Dans le volet de navigation, choisissez API, puis sélectionnez le nom de votre API.
- Sur la page Ressources, choisissez votre type de méthode.
- Cliquez sur l'onglet Demande de méthode, puis sélectionnez Modifier.
- Choisissez la liste déroulante Validateur de demande, puis sélectionnez Valider le corps, les paramètres de chaîne et les en-têtes.
- Développez les paramètres de chaîne de requête d’URL, puis choisissez Ajouter une chaîne de requête.
- Dans Nom, saisissez le nom d’un paramètre de requête pour l’API de service que vous intégrez. Pour l’exemple de configuration d’Amazon SNS, créez un paramètre nommé TopicArn et un autre paramètre nommé Message.
- (Facultatif) Si le paramètre est obligatoire, cochez la case sous Obligatoire.
- Sélectionnez Enregistrer.
Pour plus d’informations, consultez la section Configurer une méthode à l’aide de la console API Gateway.
Remarque : pour certaines API de service, vous devez envoyer les en-têtes et le corps obligatoires dans la requête d’intégration en plus des paramètres obligatoires. Vous pouvez créer les en-têtes et le corps dans le volet Requête d’intégration sous En-têtes de requête HTTP et Corps de la requête.
Par exemple, si vous intégrez l’API ListCollections d’Amazon Rekognition, créez l’en-tête X-Amz-Target: RekognitionService.ListCollections.
Exemple de demande de code :
POST https://rekognition.us-west-2.amazonaws.com/ HTTP/1.1 Host: rekognition.us-west-2.amazonaws.com Accept-Encoding: identity Content-Length: 2 X-Amz-Target: RekognitionService.ListCollections X-Amz-Date: 20170105T155800Z User-Agent: aws-cli/1.11.25 Python/2.7.9 Windows/8 botocore/1.4.82 Content-Type: application/x-amz-json-1.1 Authorization: AWS4-HMAC-SHA256 Credential=XXXXXXXX/20170105/us-west-2/rekognition/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature=XXXXXXXX {}
Si vous intégrez l’API SendMessage d’Amazon Simple Queue Service (Amazon SQS), mappez le corps de la requête qui utilise l’expression de mappage method.request.body.JSONPath_EXPRESSION. (Remplacez JSONPath_EXPRESSION par une expression JSONPath pour un champ JSON du corps de la requête.)
Exemple de demande de code :
{'url_path': '/', 'query_string': '', 'method': 'POST','headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.81 Python/3.6.5 Darwin/18.7.0 botocore/1.12.183'}, 'body': {'Action': 'SendMessage', 'Version': '2012-11-05', 'QueueUrl': 'https://sqs.ap-southeast-2.amazonaws.com/123456789012/test01', 'MessageBody': 'Hello'}, 'url': 'https://ap-southeast-2.queue.amazonaws.com/', 'context': {'client_region': 'ap-southeast-2', 'client_config': <botocore.config.Config object at 0x106862da0>, 'has_streaming_input': False, 'auth_type': None}}
Créer des paramètres pour la requête d’intégration
Mappez les paramètres que vous avez créés pour la demande de méthode aux paramètres de la requête d’intégration.
Procédez comme suit :
- Ouvrez la console API Gateway.
- Dans le volet de navigation, choisissez API, puis sélectionnez le nom de votre API.
- Sur la page Ressources, choisissez votre type de méthode.
- Cliquez sur l'onglet Requête d’intégration, puis sélectionnez Modifier.
- Développez les paramètres de chaîne de requête URL, puis sélectionnez Ajouter un paramètre de chaîne de requête.
- Dans Nom, saisissez le nom d’un paramètre de requête pour l’API de service que vous intégrez.
Remarque : le nom est sensible à la casse et doit apparaître exactement comme prévu par l’API de service. - Dans Mappage à partir de, saisissez method.request.querystring.param_name. Remplacez param_name par le nom du paramètre correspondant que vous avez créé pour la demande de méthode. Par exemple, method.request.querystring.TopicArn.
- Répétez les étapes 3 à 6 pour créer des paramètres pour la requête d’intégration qui correspondent à chacun des paramètres que vous avez créés pour la demande de méthode.
- Sélectionnez Enregistrer.
Remarque : si vous avez créé des en-têtes et un corps obligatoires pour la demande de méthode, mappez-les également à la requête d’intégration. Pour créer les en-têtes requis et un corps pour la requête de méthode, accédez au volet Requête d'intégration, sous En-têtes HTTP et Modèles de mappage.
Pour en savoir plus, consultez la section Configurer une requête d’intégration d’API à l’aide de la console API Gateway.
(Facultatif) Vérifier votre configuration d’intégration
Pour vérifier que votre configuration d'intégration est correctement configurée, exécutez la commande get-integration suivante :
aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST
Pour l'exemple de configuration Amazon SNS, la sortie se présente comme dans l'exemple de code suivant :
{ "integrationResponses": { "200": { "responseTemplates": { "application/json": null }, "statusCode": "200" } }, "passthroughBehavior": "WHEN_NO_MATCH", "timeoutInMillis": 29000, "uri": "arn:aws:apigateway:us-east-2:sns:action/Publish", "httpMethod": "POST", "cacheNamespace": "y9h6rt", "credentials": "arn:aws:iam::1234567890:role/apigateway-sns-role", "type": "AWS", "requestParameters": { "integration.request.querystring.TopicArn": "method.request.querystring.TopicArn", "integration.request.querystring.Message": "method.request.querystring.Message" }, "cacheKeyParameters": [] }
Pour les données utiles de messages plus importants, exécutez l'intégration Amazon SNS suivante sur votre API :
"requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates" : { "application/json" : "Action=Publish&TopicArn=$util.urlEncode('<ourTopicArn>')&Message=$util.urlEncode($input.body)" }
Remarque : Amazon SNS prend en charge la taille d'en-tête maximale de 16 Ko. Avant d'envoyer la requête à votre intégration, utilisez un modèle de mappage de requêtes pour convertir une requête HTTP entrante dans un autre format. Étant donné que l'ARN de la rubrique Amazon SNS est codé en dur dans le modèle de mappage, les clients ne passent pas par l'ARN de la rubrique SNS dans leur requête.
Pour vérifier votre configuration d'intégration, procédez comme suit :
- Ouvrez la console API Gateway.
- Dans le volet de navigation, choisissez API, puis sélectionnez le nom de votre API.
- Sur la page Ressources, choisissez votre ** type de méthode**, puis cliquez sur l'onglet Test.
- Sur la page Méthode de test, procédez comme suit :
Pour Chaînes de requête, saisissez une chaîne de requête qui inclut les paramètres de requête et leurs valeurs pour les chaînes de requête.
Pour l'intégration à Amazon SNS, saisissez TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello". Remplacez arn:aws:sns:us-east-1:123456789012:test par l’ARN de votre rubrique Amazon SNS.
Pour une intégration Amazon SNS qui utilise le modèle de mappage, saisissez les données JSON des données utiles du message dans le corps de la requête, puis sélectionnez Tester.
Remarque : les données utiles varient en fonction de votre configuration. - Lorsque vous recevez une réponse positive, déployez votre API REST.
Informations connexes
Didacticiel : Créer une API REST avec une intégration AWS
Méthodes pour les API REST dans API Gateway
Intégrations pour les API REST dans API Gateway
Exemples de mappage de paramètres pour les API REST dans API Gateway
- Balises
- Amazon API Gateway
- Langue
- Français

Contenus pertinents
demandé il y a 3 ans
demandé il y a 2 ans
demandé il y a un an
demandé il y a 3 ans