Einrichten von Datentransformationen in API Gateway
In diesem Abschnitt wird gezeigt, wie Sie Zuweisungsvorlagen einrichten, um Integrationsanfragen und -antworten mithilfe der Konsole und der AWS-CLI zu transformieren.
Themen
Einrichten einer Datentransformation mithilfe der API-Gateway-Konsole
In diesem Tutorial erstellen Sie eine unvollständige API- und DynamoDB-Tabelle mithilfe der folgenden ZIP-Datei data-transformation-tutorial-console.zip. Diese unvollständige API hat eine /pets
-Ressource mit den Methoden GET
und POST
.
-
Die
GET
-Methode ruft Daten vomhttp://petstore-demo-endpoint.execute-api.com/petstore/pets
-HTTP-Endpunkt ab. Die Ausgabedaten werden gemäß der Zuweisungsvorlage zu PetStore-Zuweisungsvorlage transformiert. Die
POST
-Methode ermöglicht dem Benutzer diePOST
-Aktion von Haustierinformationen mithilfe einer Zuweisungsvorlage an eine Amazon-DynamoDB-Tabelle.
Laden Sie die Vorlage für die App-Erstellung für AWS CloudFormation herunter und entzippen Sie diese. Sie verwenden diese Vorlage, um eine DynamoDB-Tabelle zum Posten von Haustierinformationen und einer unvollständigen API zu erstellen. Sie schließen die restlichen Schritte in der API-Gateway-Konsole ab.
So erstellen Sie einen AWS CloudFormation-Stack
Öffnen Sie die AWS CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation
. -
Wählen Sie Stack erstellen und dann Mit neuen Ressourcen (Standard) aus.
-
Wählen Sie unter Vorlage angeben die Option Vorlagendatei hochladen aus.
-
Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.
-
Wählen Sie Weiter aus.
-
Geben Sie für Stack-Name die Zeichenfolge
data-transformation-tutorial-console
ein und klicken Sie auf Weiter. -
Wählen Sie in Stack-Optionen konfigurieren die Option Weiter aus.
-
Bestätigen Sie in Funktionen, dass AWS CloudFormation IAM-Ressourcen in Ihrem Konto erstellen darf.
-
Wählen Sie Absenden aus.
AWS CloudFormation stellt die in der Vorlage angegebenen Ressourcen bereit. Die Bereitstellung der Ressourcen kann einige Minuten dauern. Wenn der Status Ihres AWS CloudFormation-Stacks CREATE_COMPLETE ist, können Sie mit dem nächsten Schritt fortfahren.
So testen Sie die GET
-Integrationsantwort
-
Wählen Sie auf der Registerkarte Ressourcen des AWS CloudFormation-Stacks für
data-transformation-tutorial-console
die physische ID Ihrer API aus. -
Klicken Sie im Hauptnavigationsbereich auf Ressourcen und wählen Sie dann die GET-Methode in der Ressourcenstruktur aus.
-
Wählen Sie die Registerkarte Test. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.
Das Ergebnis des Tests wird Folgendes zeigen:
[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
Sie transformieren diese Ausgabe gemäß der Zuweisungsvorlage in PetStore-Zuweisungsvorlage.
So transformieren Sie die GET
-Integrationsantwort
-
Klicken Sie auf die Registerkarte Integrationsantwort.
Derzeit sind keine Zuweisungsvorlagen definiert, sodass die Integrationsantwort nicht transformiert wird.
-
Klicken Sie unter Standard - Antwort auf Bearbeiten.
-
Wählen Sie Vorlagen zuordnen aus und gehen Sie dann wie folgt vor:
Wählen Sie Add mapping template.
Geben Sie für Content type (Inhaltstyp)
application/json
ein.Geben Sie für Vorlagentext Folgendes ein:
#set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description" : "Item $elem.id is a $elem.type.", "askingPrice" : $elem.price }#if($foreach.hasNext),#end #end ]
Wählen Sie Save (Speichern) aus.
So testen Sie die GET
-Integrationsantwort
-
Wählen Sie die Registerkarte Test und dann Test aus
Die Ausgabe des Tests zeigt die transformierte Antwort.
[ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]
So transformieren Sie Eingabedaten aus der POST
-Methode
-
Wählen Sie die POST-Methode aus.
-
Wählen Sie die Registerkarte Integrationsanfrage aus und klicken Sie dann unter Einstellungen für Integrationsanforderungen auf Bearbeiten.
In der AWS CloudFormation-Vorlage sind einige der Felder für Integrationsanfragen ausgefüllt.
-
Der Integrationstyp ist AWS-Service.
-
Der AWS-Service ist DynamoDB.
-
Die HTTP-Methode ist
POST
. -
Die Aktion ist
PutItem
. -
Die Ausführungsrolle, die API Gateway ermöglicht, ein Element in die DynamoDB-Tabelle einzufügen, ist
data-transformation-tutorial-console-APIGatewayRole
. AWS CloudFormation hat diese Rolle erstellt, damit API Gateway über die Mindestberechtigungen für die Interaktion mit DynamoDB verfügt.
Der Name der DynamoDB-Tabelle wurde nicht angegeben. In den folgenden Schritten geben Sie den Namen an.
-
Für Text-Passthrough anfordern wählen Sie Nie aus.
Dies bedeutet, dass die API Daten mit Inhaltstypen ablehnt, die keine Zuweisungsvorlage haben.
Wählen Sie Zuordnungsvorlagen aus.
Der Inhaltstyp ist auf
application/json
gesetzt. Das bedeutet, dass alle Inhaltstypen, die nicht „application/json“ sind, von der API abgelehnt werden. Weitere Informationen zu Integrations-Passthrough-Verhaltensweisen finden Sie unter Integrations-Pass-Through-Verhalten.-
Geben Sie den folgenden Code in den Texteditor ein.
{ "TableName":"data-transformation-tutorial-console-ddb", "Item": { "id": { "N": $input.json("$.id") }, "type": { "S": $input.json("$.type") }, "price": { "N": $input.json("$.price") } } }
Diese Vorlage spezifiziert die Tabelle als
data-transformation-tutorial-console-ddb
und legt die Elemente alsid
,type
undprice
fest. Die Elemente kommen aus dem Hauptteil derPOST
-Methode. Sie können auch ein Datenmodell verwenden, um eine Zuweisungsvorlage zu erstellen. Weitere Informationen finden Sie unter Anforderungsvalidierung für REST-APIs in API Gateway. -
Betätigen Sie die Schaltfläche Speichern, um die Zuweisungsvorlage zu speichern.
So fügen Sie eine Methode und eine Integrationsantwort aus der POST
-Methode hinzu
AWS CloudFormation hat eine leere Methode und eine leere Integrationsantwort erstellt. Sie werden diese Antwort bearbeiten, um weitere Informationen bereitzustellen. Weitere Informationen zum Bearbeiten von Antworten finden Sie unter Daten-Mapping-Referenz für Amazon API Gateway-API-Anfragen und Antworten.
-
Klicken Sie auf der Registerkarte Integrationsantwort unter Standard - Antwort auf Bearbeiten.
Wählen Sie Zuordnungsvorlagen aus und klicken Sie dann auf Zuordnungsvorlage hinzufügen.
Geben Sie für Inhaltstyp
application/json
ein.Geben Sie im Code-Editor die folgende Ausgabe–Zuweisungsvorlage ein, um eine Ausgabenachricht zu senden:
{ "message" : "Your response was recorded at $context.requestTime" }
Weitere Informationen zu Kontextvariablen finden Sie unter $context Variablen für Datenmodelle, Genehmiger, Mapping-Vorlagen und die CloudWatch-Zugriffsprotokolle.
Betätigen Sie die Schaltfläche Speichern, um die Zuweisungsvorlage zu speichern.
Testen der POST
-Methode
Wählen Sie die Registerkarte Test. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.
-
Geben Sie im Anforderungstext das folgende Beispiel ein.
{ "id": "4", "type" : "dog", "price": "321" }
-
Wählen Sie Test aus.
Die Ausgabe sollte Ihre Erfolgsmeldung enthalten.
Sie können die DynamoDB-Konsole unter https://console.aws.amazon.com/dynamodb/
öffnen, um zu überprüfen, ob sich das Beispielelement in Ihrer Tabelle befindet.
So löschen Sie einen AWS CloudFormation-Stack
Öffnen Sie die AWS CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation
. -
Wählen Sie Ihren AWS CloudFormation-Stack aus.
-
Wählen Sie Löschen und bestätigen Sie dann Ihre Auswahl.
Einrichten der Datentransformation mit der AWS-CLI
In diesem Tutorial erstellen Sie eine unvollständige API- und DynamoDB-Tabelle mithilfe der folgenden ZIP-Datei data-transformation-tutorial-cli.zip. Diese unvollständige API verfügt über eine /pets
-Ressource mit einer GET
-Methode, die in den http://petstore-demo-endpoint.execute-api.com/petstore/pets
-HTTP-Endpunkt integriert ist. Sie erstellen eine POST
-Methode, um eine Verbindung zu einer DynamoDB-Tabelle herzustellen, und verwenden Zuweisungsvorlagen, um Daten in eine DynamoDB-Tabelle einzugeben.
-
Sie transformieren die Ausgabedaten gemäß der Zuweisungsvorlage zu PetStore-Zuweisungsvorlage.
-
Sie erstellen eine
POST
-Methode, die es dem Benutzer ermöglicht, mithilfe einer Zuweisungsvorlage diePOST
-Aktion an eine Amazon-DynamoDB-Tabelle durchzuführen.
So erstellen Sie einen AWS CloudFormation-Stack
Laden Sie die Vorlage für die App-Erstellung für AWS CloudFormation herunter und entzippen Sie diese.
Um die folgenden Schritte durchzuführen, benötigen Sie die AWS Command Line Interface (AWS CLI) Version 2.
Bei langen Befehlen wird ein Escape-Zeichen (\
) verwendet, um einen Befehl auf mehrere Zeilen aufzuteilen.
Anmerkung
In Windows werden einige Bash-CLI-Befehle, die Sie häufig verwenden (z. B. zip
), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, installieren Sie das Windows-Subsystem für Linux
Verwenden Sie den folgenden Befehl, um den AWS CloudFormation-Stack zu erstellen.
aws cloudformation create-stack --stack-name data-transformation-tutorial-cli --template-body file://data-transformation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM
-
AWS CloudFormation stellt die in der Vorlage angegebenen Ressourcen bereit. Die Bereitstellung der Ressourcen kann einige Minuten dauern. Sie können den folgenden Befehl verwenden, um den Status Ihres AWS CloudFormation-Stacks anzuzeigen.
aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli
-
Wenn der Status Ihres AWS CloudFormation-Stacks
StackStatus: "CREATE_COMPLETE"
ist, verwenden Sie den folgenden Befehl, um relevante Ausgabewerte für zukünftige Schritte abzurufen.aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"
Die Ausgabewerte sind die folgenden:
-
ApiRole, dies ist der Rollenname, der es API Gateway ermöglicht, Elemente in die DynamoDB-Tabelle einzufügen. Für dieses Tutorial ist der Rollenname
data-transformation-tutorial-cli-APIGatewayRole-ABCDEFG
. DDBTableName, dies ist der Name der DynamoDB-Tabelle. Für dieses Tutorial ist der Name der Tabelle
data-transformation-tutorial-cli-ddb
.ResourceId, dies ist die ID der Ressource für Haustiere, in der die Methoden
GET
undPOST
verfügbar sind. Für dieses Tutorial lautet die Ressourcen-IDefg456
.ApiId, dies ist die ID für die API. Für dieses Tutorial lautet die API-ID
abc123
.
-
So testen Sie die GET
-Methode vor der Datentransformation
Geben Sie den folgenden Befehl ein, um die
GET
-Methode zu testen.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GETDie Ausgabe des Tests wird Folgendes zeigen.
[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
Sie transformieren diese Ausgabe gemäß der Zuweisungsvorlage in PetStore-Zuweisungsvorlage.
So transformieren Sie die GET
-Integrationsantwort
-
Führen Sie den folgenden Befehl aus, um die Integrationsantwort für die
GET
-Methode zu aktualisieren. Ersetzen Sie dierest-api-id
und dieresource-id
durch Ihre Werte.Verwenden Sie den folgenden Befehl, um die Integrationsantwort zu erstellen.
aws apigateway put-integration-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET \ --status-code 200 \ --selection-pattern "" \ --response-templates '{"application/json": "#set($inputRoot = $input.path(\"$\"))\n[\n#foreach($elem in $inputRoot)\n {\n \"description\": \"Item $elem.id is a $elem.type\",\n \"askingPrice\": \"$elem.price\"\n }#if($foreach.hasNext),#end\n\n#end\n]"}'
So testen Sie die GET
-Methode
Geben Sie den folgenden Befehl ein, um die
GET
-Methode zu testen.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET \Die Ausgabe des Tests zeigt die transformierte Antwort.
[ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]
So erstellen Sie eine POST
-Methode
-
Führen Sie den folgenden Befehl aus, um eine neue Methode für die
/pets
-Ressource zu erstellen.aws apigateway put-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --authorization-type "NONE" \Mit dieser Methode können Sie Haustierinformationen an die DynamoDB-Tabelle senden, die Sie im AWS CloudFormation-Stack erstellt haben.
-
Verwenden Sie den folgenden Befehl, um eine AWS-Service-Integration für die
POST
-Methode zu erstellen.aws apigateway put-integration --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --type AWS \ --integration-http-method POST \ --uri "arn:aws:apigateway:us-east-2
:dynamodb:action/PutItem" \ --credentials arn:aws:iam::111122223333
:role/data-transformation-tutorial-cli-APIGatewayRole-ABCDEFG
\ --request-templates '{"application/json":"{\"TableName\":\"data-transformation-tutorial-cli-ddb\",\"Item\":{\"id\":{\"N\":$input.json(\"$.id\")},\"type\":{\"S\":$input.json(\"$.type\")},\"price\":{\"N\":$input.json(\"$.price\")} }}"}' -
Verwenden Sie den folgenden Befehl, um eine Methodenantwort für einen erfolgreichen Aufruf der
POST
-Methode zu erstellen.aws apigateway put-method-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --status-code 200 -
Verwenden Sie den folgenden Befehl, um eine Integrationsantwort für den erfolgreichen Aufruf der
POST
-Methode zu erstellen.aws apigateway put-integration-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --status-code 200 \ --selection-pattern "" \ --response-templates '{"application/json": "{\"message\": \"Your response was recorded at $context.requestTime\"}"}'
So testen Sie die POST
-Methode
Geben Sie den folgenden Befehl ein, um die
POST
-Methode zu testen.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --body '{\"id\": \"4\", \"type\": \"dog\", \"price\": \"321\"}'In der Ausgabe wird die Erfolgsmeldung angezeigt.
So löschen Sie einen AWS CloudFormation-Stack
Verwenden Sie den folgenden Befehl, um Ihre AWS CloudFormation-Ressourcen zu löschen.
aws cloudformation delete-stack --stack-name data-transformation-tutorial-cli
Fertige AWS CloudFormation-Vorlage für die Datentransformation
Das folgende Beispiel ist eine fertige AWS CloudFormation-Vorlage, die eine API und eine DynamoDB-Tabelle mit einer /pets
-Ressource mit den Methoden GET
und POST
erstellt.
-
Die
GET
-Methode ruft Daten vomhttp://petstore-demo-endpoint.execute-api.com/petstore/pets
-HTTP-Endpunkt ab. Die Ausgabedaten werden gemäß der Zuweisungsvorlage zu PetStore-Zuweisungsvorlage transformiert. Die
POST
-Methode ermöglicht es dem Benutzer, mithilfe einer Zuweisungsvorlage diePOST
-Aktion zu einer DynamoDB-Tabelle durchzuführen.
AWSTemplateFormatVersion: 2010-09-09 Description: A completed Amazon API Gateway REST API that uses non-proxy integration to POST to an Amazon DynamoDB table and non-proxy integration to GET transformed pets data. Parameters: StageName: Type: String Default: v1 Description: Name of API stage. Resources: DynamoDBTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: !Sub data-transformation-tutorial-complete AttributeDefinitions: - AttributeName: id AttributeType: N KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 APIGatewayRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Action: - 'sts:AssumeRole' Effect: Allow Principal: Service: - apigateway.amazonaws.com Policies: - PolicyName: APIGatewayDynamoDBPolicy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - 'dynamodb:PutItem' Resource: !GetAtt DynamoDBTable.Arn Api: Type: 'AWS::ApiGateway::RestApi' Properties: Name: data-transformation-complete-api ApiKeySourceType: HEADER PetsResource: Type: 'AWS::ApiGateway::Resource' Properties: RestApiId: !Ref Api ParentId: !GetAtt Api.RootResourceId PathPart: 'pets' PetsMethodGet: Type: 'AWS::ApiGateway::Method' Properties: RestApiId: !Ref Api ResourceId: !Ref PetsResource HttpMethod: GET ApiKeyRequired: false AuthorizationType: NONE Integration: Type: HTTP Credentials: !GetAtt APIGatewayRole.Arn IntegrationHttpMethod: GET Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/ PassthroughBehavior: WHEN_NO_TEMPLATES IntegrationResponses: - StatusCode: '200' ResponseTemplates: application/json: "#set($inputRoot = $input.path(\"$\"))\n[\n#foreach($elem in $inputRoot)\n {\n \"description\": \"Item $elem.id is a $elem.type\",\n \"askingPrice\": \"$elem.price\"\n }#if($foreach.hasNext),#end\n\n#end\n]" MethodResponses: - StatusCode: '200' PetsMethodPost: Type: 'AWS::ApiGateway::Method' Properties: RestApiId: !Ref Api ResourceId: !Ref PetsResource HttpMethod: POST ApiKeyRequired: false AuthorizationType: NONE Integration: Type: AWS Credentials: !GetAtt APIGatewayRole.Arn IntegrationHttpMethod: POST Uri: arn:aws:apigateway:us-west-1:dynamodb:action/PutItem PassthroughBehavior: NEVER RequestTemplates: application/json: "{\"TableName\":\"data-transformation-tutorial-complete\",\"Item\":{\"id\":{\"N\":$input.json(\"$.id\")},\"type\":{\"S\":$input.json(\"$.type\")},\"price\":{\"N\":$input.json(\"$.price\")} }}" IntegrationResponses: - StatusCode: 200 ResponseTemplates: application/json: "{\"message\": \"Your response was recorded at $context.requestTime\"}" MethodResponses: - StatusCode: '200' ApiDeployment: Type: 'AWS::ApiGateway::Deployment' DependsOn: - PetsMethodGet Properties: RestApiId: !Ref Api StageName: !Sub '${StageName}' Outputs: ApiId: Description: API ID for CLI commands Value: !Ref Api ResourceId: Description: /pets resource ID for CLI commands Value: !Ref PetsResource ApiRole: Description: Role ID to allow API Gateway to put and scan items in DynamoDB table Value: !Ref APIGatewayRole DDBTableName: Description: DynamoDB table name Value: !Ref DynamoDBTable
Nächste Schritte
Informationen zu komplexeren Mapping-Vorlagen finden Sie in den folgenden Beispielen:
-
Komplexere Modelle und Zuweisungsvorlagen finden Sie im Beispiel-Fotoalbum Beispiel eines Fotoalbums.
-
Weitere Hinweise zu -Modellen finden Sie unter Datenmodelle für REST-APIs.
-
Informationen zur Zuordnung verschiedener Antwortcode-Ausgaben finden Sie unter Mappings von Anfrage- und Antwortdaten über die API Gateway-Konsole einrichten.
-
Informationen zum Festlegen von Datenzuordnungen anhand der Methodenanforderungsdaten einer API finden Sie unter Referenz zu API Gateway-Mapping-Vorlage und -Zugriffsprotokollierungsvariablen.