Tutorial: modificare la richiesta e la risposta di integrazione per le integrazioni ai servizi AWS
Il seguente tutorial mostra come utilizzare le trasformazioni dei modelli di mappatura per configurare i modelli di mappatura per trasformare le richieste e le risposte di integrazione utilizzando la console e AWS CLI.
Argomenti
Configurare la trasformazione dei dati utilizzando la console Gateway Amazon API
In questo tutorial, verranno create un'API e una tabella DynamoDB incomplete utilizzando il seguente file.zip data-transformation-tutorial-console.zip. Questa API incompleta dispone di una risorsa /pets
con i metodi GET
e POST
.
-
Il metodo
GET
otterrà i dati dall'endpoint HTTPhttp://petstore-demo-endpoint.execute-api.com/petstore/pets
. I dati di output verranno trasformati in base al modello di mappatura in Trasformazioni dei modelli di mappatura per REST API in Gateway API. Il metodo
POST
consentirà all'utente di pubblicare (POST
) le informazioni sugli animali domestici in una tabella Amazon DynamoDB utilizzando un modello di mappatura.
Scarica e decomprimi il modello di creazione dell'applicazione app per AWS CloudFormation. Verrà utilizzato questo modello per creare una tabella DynamoDB per pubblicare informazioni sugli animali domestici e un'API incompleta. Il resto della procedura verrà completato nella console Gateway Amazon API.
Creazione di uno stack AWS CloudFormation
Apri la console di AWS CloudFormation all'indirizzo https://console.aws.amazon.com/cloudformation
. -
Scegliere Create stack (Crea stack), quindi With new resources (standard) (Con nuove risorse (standard)).
-
In Specificare modello, scegliere Carica un file modello.
-
Selezionare il modello scaricato.
-
Scegli Next (Successivo).
-
Per Stack name (Nome stack), inserire
data-transformation-tutorial-console
, quindi scegliere Next (Avanti). -
Per Configure stack options (Configura opzioni di stack), scegliere Next (Successivo).
-
Per Capabilities (Funzionalità), conferma che AWS CloudFormation può creare risorse IAM nel tuo account.
-
Scegli Invia.
AWS CloudFormation effettua il provisioning delle risorse specificate nel modello. Per completare il provisioning delle risorse, potrebbero essere necessari alcuni minuti. Quando lo stato dello stack AWS CloudFormation è CREATE_COMPLETE, puoi passare alla fase successiva.
Test della risposta di integrazione GET
-
Nella scheda Risorse dello stack AWS CloudFormation per
data-transformation-tutorial-console
, selezionare l'ID fisico dell'API. -
Nel pannello di navigazione principale scegli Risorse, quindi seleziona il metodo GET.
-
Seleziona la scheda Test. Potrebbe essere necessario scegliere il pulsante freccia destra per visualizzare la scheda.
L'output del test mostrerà quanto segue:
[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
Questo output verrà trasformato in base al modello di mappatura in Trasformazioni dei modelli di mappatura per REST API in Gateway API.
Trasformazione della risposta di integrazione GET
-
Scegli la scheda Risposta di integrazione.
Attualmente non sono definiti modelli di mappatura, quindi la risposta di integrazione non verrà trasformata.
-
Per Predefinito - Risposta scegli Modifica.
-
Scegli Modelli di mappatura e procedi come indicato di seguito:
Scegliere Add mapping template (Aggiungi modello di mappatura).
Per Tipo di contenuto inserisci
application/json
.Per Corpo del modello inserisci quanto segue:
#set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description" : "Item $elem.id is a $elem.type.", "askingPrice" : $elem.price }#if($foreach.hasNext),#end #end ]
Selezionare Salva.
Test della risposta di integrazione GET
-
Scegli la scheda Test, quindi seleziona Test.
L'output del test mostrerà la risposta trasformata.
[ { "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 } ]
Trasformazione dei dati di input dal metodo POST
-
Scegli il metodo POST.
-
Scegli la scheda Richiesta di integrazione, quindi seleziona Modifica per Impostazioni della richiesta di integrazione.
Il modello AWS CloudFormation ha popolato alcuni campi della richiesta di integrazione.
-
Il tipo di integrazione è Servizio AWS.
-
Il Servizio AWS è DynamoDB.
-
Il metodo HTTP è
POST
. -
L'operazione è
PutItem
. -
Il ruolo di esecuzione che consente a Gateway Amazon API di inserire un elemento nella tabella DynamoDB è
data-transformation-tutorial-console-APIGatewayRole
. AWS CloudFormation ha creato questo ruolo per consentire a Gateway Amazon API di disporre delle autorizzazioni minime per interagire con DynamoDB.
Il nome della tabella DynamoDB non è stato specificato. Il nome verrà specificato nei passaggi seguenti.
-
Per Richiesta corpo passthrough seleziona Mai.
Ciò significa che l'API rifiuterà i dati con Content-Types che non dispongono di un modello di mappatura.
Scegli Modelli di mappatura.
Tipo di contenuto è impostato su
application/json
. Ciò significa che i tipi di contenuto diversi da application/json verranno rifiutati dall'API. Per ulteriori informazioni sui comportamenti passthrough di integrazione, consultare Comportamento della richiesta di metodo per i payload senza modelli di mappatura per REST API in Gateway API.-
Inserire il codice seguente nell'editor di testo.
{ "TableName":"data-transformation-tutorial-console-ddb", "Item": { "id": { "N": $input.json("$.id") }, "type": { "S": $input.json("$.type") }, "price": { "N": $input.json("$.price") } } }
Questo modello specifica la tabella come
data-transformation-tutorial-console-ddb
e imposta gli elementi comeid
,type
eprice
. Gli elementi proverranno dal corpo del metodoPOST
. È anche possibile utilizzare un modello di dati per creare un modello di mappatura. Per ulteriori informazioni, consultare Convalida delle richieste per REST API in Gateway API. -
Scegliere il pulsante Salva per salvare il modello di mappatura.
Aggiunta di un metodo e una risposta di integrazione dal metodo POST
In AWS CloudFormation sono stati creati un metodo e una risposta di integrazione vuoti. Questa risposta verrà modificata per fornire ulteriori informazioni. Per ulteriori informazioni su come modificare le risposte, consultare Esempi di mappatura dei parametri per REST API in Gateway API.
-
Nella scheda Risposta di integrazione scegli Modifica per Predefinito - Risposta.
Scegli Modelli di mappatura, quindi seleziona Aggiungi modello di mappatura.
Per Content-type immetti
application/json
.Nell'editor di codice, inserire il seguente modello di mappatura di output per inviare un messaggio di output:
{ "message" : "Your response was recorded at $context.requestTime" }
Per ulteriori informazioni sulle variabili di contesto, consultare Variabili di contesto per le trasformazioni dei dati.
Scegliere il pulsante Salva per salvare il modello di mappatura.
Test del metodo POST
Seleziona la scheda Test. Potrebbe essere necessario scegliere il pulsante freccia destra per visualizzare la scheda.
-
Nel corpo della richiesta, inserire il seguente esempio.
{ "id": "4", "type" : "dog", "price": "321" }
-
Scegli Test (Esegui test).
L'output dovrebbe mostrare il messaggio di operazione riuscita.
È possibile aprire la console DynamoDB all'indirizzo https://console.aws.amazon.com/dynamodb/
per verificare che l'elemento di esempio sia nella tabella.
Per eliminare uno stack AWS CloudFormation
Apri la console di AWS CloudFormation all'indirizzo https://console.aws.amazon.com/cloudformation
. -
Seleziona lo stack AWS CloudFormation.
-
Scegli Elimina e conferma la tua scelta.
Configurazione della trasformazione dei dati utilizzando la CLI AWS
In questo tutorial, verranno create un'API e una tabella DynamoDB incomplete utilizzando il seguente file.zip data-transformation-tutorial-cli.zip. Questa API incompleta dispone di una risorsa /pets
con un metodo GET
integrato con l'endpoint HTTP http://petstore-demo-endpoint.execute-api.com/petstore/pets
. Verrà creato un metodo POST
per connettersi a una tabella DynamoDB e si useranno modelli di mappatura per inserire dati in una tabella DynamoDB.
-
I dati di output verranno quindi trasformati in base al modello di mappatura in Trasformazioni dei modelli di mappatura per REST API in Gateway API.
-
Verrà creato un metodo
POST
per consentire all'utente di pubblicare (POST
) le informazioni sugli animali domestici in una tabella Amazon DynamoDB utilizzando un modello di mappatura.
Creazione di uno stack AWS CloudFormation
Scarica e decomprimi il modello di creazione dell'applicazione app per AWS CloudFormation.
Per completare il tutorial seguente, è necessario disporre della AWS Command Line Interface (AWS CLI) versione 2.
Per i comandi lunghi viene utilizzato un carattere di escape (\
) per dividere un comando su più righe.
Nota
In Windows, alcuni comandi della CLI Bash utilizzati comunemente (ad esempio, zip
) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, installa il sottosistema Windows per Linux
Utilizzare il seguente comando per creare lo stack AWS CloudFormation.
aws cloudformation create-stack --stack-name data-transformation-tutorial-cli --template-body file://data-transformation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM
-
AWS CloudFormation effettua il provisioning delle risorse specificate nel modello. Per completare il provisioning delle risorse, potrebbero essere necessari alcuni minuti. Utilizzare il seguente comando per visualizzare lo stato del task AWS CloudFormation.
aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli
-
Quando lo stato dello stack AWS CloudFormation è
StackStatus: "CREATE_COMPLETE"
, utilizzare il seguente comando per recuperare i valori di output rilevanti per i passaggi futuri.aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"
Di seguito sono riportati i valori di output:
-
APIRole, che è il nome del ruolo che consente a Gateway Amazon API di inserire elementi nella tabella DynamoDB. Per questo tutorial, il nome del ruolo è
data-transformation-tutorial-cli-APIGatewayRole-ABCDEFG
. DDBTableName, ovvero il nome della tabella DynamoDB. Per questo tutorial il nome della tabella è
data-transformation-tutorial-cli-ddb
.ResourceID, ovvero l'ID della risorsa relativa agli animali domestici in cui sono esposti i metodi
GET
ePOST
. Per questo tutorial, l'ID risorsa èefg456
.ApiId, ovvero l'ID dell'API. Per questo tutorial, l'ID API è
abc123
.
-
Test del metodo GET
prima della trasformazione dei dati
Utilizzare il seguente comando per eseguire il test del metodo
GET
.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GETL'output del test riporterà le seguenti informazioni.
[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
Questo output verrà trasformato in base al modello di mappatura in Trasformazioni dei modelli di mappatura per REST API in Gateway API.
Trasformazione della risposta di integrazione GET
-
Utilizzare il comando seguente per aggiornare una risposta di integrazione per il metodo
GET
. Sostituirerest-api-id
eresource-id
con i valori desiderati.Per creare una risposta di integrazione, utilizzare il comando seguente.
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]"}'
Test del metodo GET
Utilizzare il seguente comando per eseguire il test del metodo
GET
.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET \L'output del test mostrerà la risposta trasformata.
[ { "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 } ]
Creazione di un metodo POST
-
Utilizzare il seguente comando per creare un nuovo metodo nella risorsa
/pets
.aws apigateway put-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --authorization-type "NONE" \Questo metodo consentirà di inviare informazioni sugli animali domestici alla tabella DynamoDB creata nello stack AWS CloudFormation.
-
Utilizzare il comando seguente per creare un'integrazione Servizio AWS nel metodo
POST
.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\")} }}"}' -
Utilizzare il comando seguente per creare una risposta del metodo per una corretta chiamata del metodo
POST
.aws apigateway put-method-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --status-code 200 -
Utilizzare il comando seguente per creare una risposta dell'integrazione per una corretta chiamata del metodo
POST
.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\"}"}'
Test del metodo POST
Utilizzare il seguente comando per eseguire il test del metodo
POST
.aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --body '{\"id\": \"4\", \"type\": \"dog\", \"price\": \"321\"}'L'output mostrerà il messaggio di operazione riuscita.
Per eliminare uno stack AWS CloudFormation
Usare il seguente comando per eliminare le risorse AWS CloudFormation.
aws cloudformation delete-stack --stack-name data-transformation-tutorial-cli
Modello AWS CloudFormation di trasformazione dei dati completo
L'esempio seguente è un modello AWS CloudFormation completo, che crea un'API e una tabella DynamoDB con una risorsa /pets
con i metodi GET
e POST
.
-
Il metodo
GET
recupererà i dati dall'endpoint HTTPhttp://petstore-demo-endpoint.execute-api.com/petstore/pets
. I dati di output verranno trasformati in base al modello di mappatura in Trasformazioni dei modelli di mappatura per REST API in Gateway API. Il metodo
POST
consentirà all'utente di pubblicare (POST
) le informazioni sugli animali domestici in una tabella DynamoDB utilizzando un modello di mappatura.
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