Wie verwende ich API Gateway als Proxy für einen anderen AWS-Service?
Ich möchte Amazon API Gateway als Proxy für einen anderen AWS-Service verwenden und andere Services in API Gateway integrieren.
Behebung
**Hinweis:**Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler erhältst, findest du weitere Informationen unter Beheben von AWS-CLI-Fehlern. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
AWS-Service-APIs sind REST-APIs, an die du eine HTTPS-Anfrage stellen kannst. Um einen anderen Dienst in API Gateway zu integrieren, erstelle eine HTTPS-Anfrage von API Gateway an die Service-API. Wenn du diese Methode verwendest, werden alle Anforderungsparameter korrekt zugeordnet.
In dieser Lösung wird ein Beispiel-Setup dafür beschrieben, wenn du die Publish-API von Amazon Simple Notification Service (Amazon SNS) mit API Gateway integrierst. Verwende das folgende Beispiel als Überblick über die Methoden, die du verwenden kannst, wenn du API Gateway mit anderen Diensten integrierst.
Einrichten der erforderlichen Tools und Ressourcen
Konfiguriere deine Umgebung und erstelle alle AWS-Ressourcen, die für deinen Anwendungsfall erforderlich sind. Führe für das Amazon SNS-Beispiel-Setup die folgenden Schritte aus:
-
Erstelle ein Amazon-SNS-Thema. Notiere den Amazon-Ressourcennamen (ARN) des Themas.
-
Öffne die AWS Identity and Access Management (IAM)-Konsole und erstelle dann eine AWS-Service-Proxy-Ausführungsrolle. Lasse für das Amazon-SNS-Beispiel-Setup die Aktion sns:Publish zu. Weitere Informationen findest du unter Steuern und Verwalten des Zugriffs auf REST-APIs in API Gateway.
-
Zur Erstellung einer API-Gateway-REST-API, verwende eine Test-Ressource. Weitere Informationen und Beispiele findest du in den Amazon-API-Gateway-Tutorials und -Workshops.
-
Verwende die folgende OpenAPI 2.0-Beispieldefinition (Swagger), um die REST-API zu importieren:
{ "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" } } }Hinweis: Ersetze arn:aws:iam::account-id:role/apigateway-sns-role durch den ARN der IAM-Rolle und YOUR-TOPIC-ARN durch den ARN des SNS-Themas.
Mit der vorherigen Option werden die Einstellungen für das Amazon-SNS-Beispiel-Setup vorkonfiguriert. Um die REST-API zu erstellen, ersetze **your-region ** durch deine AWS-Region. Weitere Informationen findest du unter Was ist OpenAPI? auf der Swagger-Website.
Abrufen einer beispielhaften HTTPS-Anfrage
Eine beispielhafte HTTPS-Anfrage von der Service-API, die du integrierst, kann dir helfen, die Anforderungsparameter in API Gateway zuzuordnen.
Für die Publish-API von Amazon SNS findest du in der API-Referenz des Diensts eine Beispielanfrage.
Um eine HTTPS-Anfrage zu erhalten, führe die folgende Beispielanfrage aus:
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
- oder -
Generiere das Beispiel aus einem API-Aufruf. Verwende die AWS-CLI, um die Service-API aufzurufen, und analysiere dann die Ausgabe. Ermittele den zugehörigen AWS-CLI-Befehl für die Service-API, die du integrierst, und führe dann eine Testanfrage mit der Option —debug aus.
Um ein Beispiel aus einem API-Aufruf zu generieren, führe den folgenden Befehl Publish aus:
aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug
Hinweis: Ersetze arn:aws:sns:us-east-1:123456789012:test durch den ARN deines Amazon-SNS-Themas.
Beispielausgabe:
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
Die Ausgabe enthält die HTTPS-Anfrage, die übergebenen Header, und die Anfrage ist eine POST-HTTP-Methode.
Erstellen einer Methode für deine API-Gateway-API
Führe die folgenden Schritte aus:
- Öffne die API Gateway-Konsole.
- Wähle im Navigationsbereich APIs und dann den Namen deiner API aus.
- Wähle im Bereich Ressourcen eine Ressource aus. Wähle für das Amazon-SNS-Beispiel-Setup die Testressource aus, die du erstellt hast.
- Wähle Methode erstellen aus.
- Im neuen Fenster:
Wähle die Methode, die deine Service-API in der Beispiel-HTTPS-Anfrage verwendet.
Wähle für das Amazon-SNS-Beispiel-Setup POST aus.
Wähle für Integrationstyp AWS Service aus.
Wähle für die AWS-Region die AWS-Region der Ressource aus, die mit der Service-API verknüpft ist, die du integrierst.
Wähle für das Amazon-SNS-Beispiel-Setup die Region deines SNS-Themas aus.
Wähle für AWS Service den Service aus, den du in API Gateway integrierst. Verwende beispielsweise den Simple Notification Service (SNS)-Dienst.
Gib für AWS Subdomain die vom AWS Service verwendete Subdomain ein. Überprüfe die Verfügbarkeit einer Subdomain in der Dokumentation des Diensts.
Lasse das Feld für das Amazon SNS-Beispiel-Setup leer.
Wähle für die HTTP-Methode die Methode aus, die der AWS-Service-API entspricht, mit der du integrierst.
Wähle für das Amazon-SNS-Beispiel-Setup POST aus.
Wenn es sich bei der Service-API, mit der du integrierst, um eine unterstützte Aktion handelt, dann wähle unter Aktionstyp die Option Aktionsnamen verwenden aus. In der API-Referenz des Diensts findest du eine Liste der unterstützten Aktionen.
Für Amazon SNS, siehe Aktionen.
Gib für Aktion den Namen der Service-API ein. Gib für das Amazon-SNS-Beispiel-Setup Veröffentlichen ein.
-oder-
Wenn die AWS-Service-API einen Ressourcenpfad in deiner Anforderung erwartet, dann wähle für Aktionstyp die Option Pfadüberschreibung verwenden aus. Gib beispielsweise für die ListLexicons-API von Amazon Polly /v1/lexicons für Pfadüberschreibung (optional) ein.
Gib für die Ausführungsrolle den ARN der IAM-Rolle ein, die du erstellt hast. - Wähle Methode erstellen aus.
Erstellen von Parametern für die Methodenanfrage
Ermittle die erforderlichen und optionalen Anforderungsparameter für die Service-API, die du integrierst. Informationen zur Identifizierung dieser Parameter findest du in der Beispiel-HTTPS-Anfrage, die du zuvor erhalten hast, oder in der API-Referenz für die Service-API. Siehe beispielsweise Veröffentlichen.
Führe die folgenden Schritte aus:
- Öffne die API Gateway-Konsole.
- Wähle im Navigationsbereich APIs und dann den Namen deiner API aus.
- Wähle auf der SeiteRessourcen deinen Methodentyp aus.
- Wähle die Registerkarte Methoden und dann Bearbeiten aus.
- Wähle die Dropdownliste Anforderungsvalidierung und wähle Text, Zeichenfolgenparameter und Header validieren aus.
- Erweitere URL-Abfragezeichenfolgenparameter und wähle die Option Abfragezeichenfolge hinzufügen aus.
- Gib unter Name den Namen eines Anforderungsparameters für die Service-API ein, die du integrierst. Erstelle für das Amazon-SNS-Beispiel-Setup einen Parameter mit dem Namen TopicArn und einen weiteren Parameter mit dem Namen Message.
- (Optional) Wenn der Parameter erforderlich ist, dann aktiviere das Kontrollkästchen unter Erforderlich.
- Wähle Speichern aus.
Weitere Informationen findest du unter Einrichten einer Methode mithilfe der API-Gateway-Konsole.
Hinweis: Für einige Service-APIs musst du zusätzlich zu den erforderlichen Parametern die erforderlichen Header und einen Text in der Integrationsanfrage senden. Du kannst die Header und den Text im Bereich Integrationsanforderung unter HTTP-Anforderungs-Header und Anforderungstext erstellen.
Wenn du beispielsweise die ListCollections-API von Amazon Rekognition integrierst, dann erstelle den Header X-Amz-Target: RekognitionService.ListCollections.
Beispiel für eine Code-Anfrage:
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 {}
Wenn du die SendMessage-API von Amazon Simple Queue Service (Amazon SQS) integrierst, ordne den Anforderungstext, der den Mapping-Ausdruck method.request.body.JSONPath_EXPRESSION verwendet, zu. (Ersetze JSONPath_EXPRESSION durch einen JSONPath-Ausdruck für ein JSON-Feld im Hauptteil der Anfrage.)
Beispiel für eine Code-Anfrage:
{'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}}
Erstellen von Parametern für die Integrationsanfrage
Ordne die Parameter, die du für die Methodenanfrage erstellt hast, den Parametern für die Integrationsanforderung zu.
Führe die folgenden Schritte aus:
- Öffne die API Gateway-Konsole.
- Wähle im Navigationsbereich APIs und dann den Namen deiner API aus.
- Wähle auf der SeiteRessourcen deinen Methodentyp aus.
- Wähle die Registerkarte Integrationsanforderung und dann Bearbeiten aus.
- Erweitere URL-Abfragezeichenfolgenparameter und wähle dann die Option Abfragezeichenfolgenparameter hinzufügen aus.
- Gib unter Name den Namen eines Anforderungsparameters für die Service-API ein, die du integrierst.
Hinweis: Beim Namen wird zwischen Groß- und Kleinschreibung unterschieden und er muss genau so eingegeben werden, wie es die Service-API erfordert - Gib für Zugeordnet von method.request.querystring.param_name ein. Ersetze param_name durch den Namen des entsprechenden Parameters, den du für die Methodenanfrage erstellt hast. Zum Beispiel method.request.querystring.TopicArn.
- Erstelle Parameter für die Integrationsanforderung, die den einzelnen Parametern entsprechen, die du für die Methodenanfrage erstellt hast.
- Wähle Speichern aus.
Hinweis: Wenn du die erforderlichen Header und einen Text für die Methodenanfrage erstellt hast, ordne diese ebenfalls der Integrationsanfrage zu. Um die erforderlichen Header und einen Text für die Methodenanforderung zu erstellen, navigiere zum Bereich Integrationsanforderung unter HTTP-Header und Mapping-Vorlagen.
Weitere Informationen findest du unter Einrichten eine API-Integrationsanfrage mithilfe der API-Gateway-Konsole.
(Optional) Überprüfen deiner Integrationskonfiguration
Führe den folgenden Befehl get-integration aus, um zu überprüfen, ob dein Integrationssetup richtig konfiguriert ist:
aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST
Für das Amazon SNS-Beispiel-Setup ähnelt die Ausgabe dem folgenden Codebeispiel:
{ "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": [] }
Führe für größere Nachrichtennutzdaten die folgende Amazon SNS-Integration auf deiner API aus:
"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)" }
**Hinweis:**Amazon SNS unterstützt die maximale Header-Größe von 16 KB. Bevor du die Anfrage an deine Integration sendest, verwende eine Vorlage für das Anforderungs-Mapping, um eine eingehende HTTP-Anfrage in ein anderes Format zu konvertieren. Da der ARN des Amazon SNS-Themas in der Mapping-Vorlage fest codiert ist, gib Kunden den ARN des SNS-Themas in deiner Anfrage nicht weiter.
Führe folgende Schritte aus, um die Konfiguration deiner Integration zu überprüfen:
- Öffne die API Gateway-Konsole.
- Wähle im Navigationsbereich APIs und dann den Namen deiner API aus.
- Wähle auf der Seite Ressourcen deinen Methodentyp aus und wähle dann die Registerkarte Test.
- Führe auf der Seite Testmethode die folgenden Schritte aus:
Gib für Abfragezeichenfolgen eine Abfragezeichenfolge ein, die Anforderungsparameter und Werte für die Abfragezeichenfolge enthält.
Gib für die Amazon SNS-Integration TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello" ein. Ersetze arn:aws:sns:us-east-1:123456789012:test durch den ARN deines Amazon-SNS-Themas.
Gib für die Amazon SNS-Integration, die die Mapping-Vorlage verwendet, JSON-Daten zu Nachrichtennutzdaten in den Anforderungstext ein und wähle dann Test aus.
Hinweis: Die Nutzdaten variiert je nach Konfiguration. - Wenn du eine erfolgreiche Antwort erhältst, stelle deine REST-API bereit.
Ähnliche Informationen
Tutorial: Erstelle eine REST-API mit einer AWS-Integration
Methoden für REST-APIs im API Gateway
Integrationen für REST-APIs im API Gateway
Beispiele für Parameter-Mapping für REST-APIs in API Gateway
- Sprache
- Deutsch
