Salta al contenuto

Come posso utilizzare Gateway API come proxy per un altro servizio AWS?

11 minuti di lettura
0

Desidero utilizzare Gateway Amazon API come proxy per un altro servizio AWS e integrare altri servizi con Gateway API.

Risoluzione

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta la sezione Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Le API dei servizi AWS sono REST API a cui puoi inviare una richiesta HTTPS. Per integrare un altro servizio con Gateway API, crea una richiesta HTTPS da Gateway API all'API del servizio. Quando utilizzi questo metodo, tutti i parametri della richiesta vengono mappati correttamente.

La risoluzione di seguito descrive un esempio di configurazione per l'integrazione dell'API Publish di Amazon Simple Notification Service (Amazon SNS) con Gateway API. Utilizza l'esempio come schema per i metodi da utilizzare quando integri Gateway API con altri servizi.

Configura gli strumenti e le risorse necessari

Configura l'ambiente e crea tutte le risorse AWS necessarie per il caso d'uso. Per l'esempio di configurazione di Amazon SNS, completa i seguenti passaggi:

  1. Installa AWS CLI.

  2. Crea un topic in Amazon SNS. Annota il nome della risorsa Amazon (ARN) del topic.

  3. Crea una sottoscrizione al topic.

  4. Apri la console AWS Identity and Access Management (AWS IAM) e crea un ruolo di esecuzione per il proxy del servizio AWS. Per l'esempio di configurazione di Amazon SNS, autorizza l'azione sns:Publish. Per ulteriori informazioni, consulta Controlla e gestisci l'accesso a REST API in Gateway API.

  5. Per creare una REST API di Gateway API, utilizza una risorsa di test. Per ulteriori informazioni ed esempi, consulta Tutorial e workshop di Gateway Amazon API.

  6. Per importare la REST API, utilizza il seguente esempio di definizione di OpenAPI 2.0 (Swagger):

    {  "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"
        }
      }
    }

    Nota: sostituisci arn:aws:iam::account-id:role/apigateway-sns-role con l'ARN del tuo ruolo IAM e YOUR-TOPIC-ARN con l'ARN del tuo topic SNS.

L'opzione precedente preconfigura le impostazioni per l'esempio di configurazione di Amazon SNS. Per creare la REST API, sostituisci your-region con la tua Regione AWS. Per ulteriori informazioni, consulta What is OpenAPI? (Cos'è OpenAPI?) sul sito web Swagger.

Consulta un esempio di richiesta HTTPS

Un esempio di richiesta HTTPS dall'API del servizio che stai integrando può aiutarti a mappare i parametri della richiesta in Gateway API.

Per un esempio di richiesta relativo all'API Publish di Amazon SNS, consulta il documento di riferimento sull'API del servizio.
Per ottenere una richiesta HTTPS, esegui questo esempio:

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

- oppure -
Genera l'esempio da una chiamata API. Utilizza AWS CLI per richiamare l'API del servizio e analizzare l'output. Determina il comando AWS CLI associato per l'API del servizio che stai integrando, quindi esegui una richiesta di test con l'opzione —debug.

Per generare un esempio da una chiamata API, esegui questo comando publish:

aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug

Nota: sostituisci arn:aws:sns:us-east-1:123456789012:test con l'ARN del tuo topic Amazon SNS.

Esempio di output:

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

L'output contiene la richiesta HTTPS e le intestazioni passate. La richiesta è un metodo HTTP POST.

Crea un metodo per l'API di Gateway API

Completa i seguenti passaggi:

  1. Apri la console Gateway API.
  2. Nel pannello di navigazione, scegli API, quindi seleziona il nome dell'API.
  3. Nel pannello Risorse, scegli una risorsa. Per l'esempio di configurazione di Amazon SNS, scegli la risorsa di test che hai creato.
  4. Scegli Crea metodo.
  5. Nella nuova finestra:
    Scegli il metodo utilizzato dall'API del servizio nell'esempio di richiesta HTTPS.
    Per esempio di configurazione di Amazon SNS, scegli POST.
    Per Tipo di integrazione, scegli Servizio AWS.
    Per Regione AWS, scegli la Regione AWS della risorsa associata all'API del servizio con cui stai eseguendo l'integrazione.
    Per l'esempio di configurazione di Amazon SNS, scegli la Regione del topic SNS.
    Per Servizio AWS, scegli il servizio che stai integrando con Gateway API. Ad esempio, utilizza il servizio Simple Notification Service (SNS).
    Per Sottodominio AWS, inserisci il sottodominio utilizzato dal servizio AWS. Consulta la documentazione del servizio per verificare la disponibilità di un sottodominio.
    Per l'esempio di configurazione di Amazon SNS, lascia il campo vuoto.
    In Metodo HTTP, scegli il metodo che corrisponde all'API del servizio AWS che stai integrando.
    Per esempio di configurazione di Amazon SNS, scegli POST.
    Per Tipo di operazione, se l'API del servizio che stai integrando è un'operazione supportata, scegli Usa nome operazione. Controlla il documento di riferimento sull'API del servizio per l'elenco delle operazioni supportate.
    Per Amazon SNS, consulta Actions (Operazioni).
    Per Action (Azione), inserisci il nome dell'API del servizio. Per l'esempio di configurazione di Amazon SNS, inserisci Publish.
    -oppure-
    Per Tipo di operazione, se l'API del servizio AWS prevede un percorso di risorse nella richiesta, scegli Utilizza sostituzione percorso. Ad esempio, per l'API ListLexicons di Amazon Polly, inserisci /v1/lexicons come Sostituzione percorso (facoltativo).
    Per Ruolo di esecuzione, inserisci l'ARN del ruolo IAM che hai creato.
  6. Scegli Crea metodo.

Crea i parametri per la richiesta del metodo

Determina i parametri obbligatori e facoltativi della richiesta per l'API del servizio che stai integrando. Per identificare i parametri, fai riferimento all'esempio di richiesta HTTPS che hai ottenuto in precedenza o al documento di riferimento sull'API per l'API del servizio. Ad esempio, consulta Publish.

Completa i seguenti passaggi:

  1. Apri la console Gateway API.
  2. Nel pannello di navigazione, scegli API, quindi seleziona il nome dell'API.
  3. Nella pagina Risorse, scegli un metodo per Tipo di metodo.
  4. Scegli la scheda Richiesta metodo, quindi seleziona Modifica.
  5. Scegli l'elenco a discesa Validatore richiesta, quindi seleziona Convalida corpo, parametri di stringa query e intestazioni.
  6. Espandi Nessun parametro della stringa di query URL e scegli Aggiungi stringa di query.
  7. In Nome, inserisci il nome di un parametro della richiesta per l'API del servizio che stai integrando. Per l'esempio di configurazione di Amazon SNS, crea un parametro denominato TopicArn e un altro denominato Message.
  8. (Facoltativo) Se il parametro è obbligatorio, seleziona la casella di controllo corrispondente a Obbligatorio.
  9. Scegli Salva.

Per ulteriori informazioni, consulta Configurazione di un metodo mediante la console Gateway API.

Nota: per le API di alcuni servizi, nella richiesta di integrazione, oltre ai parametri obbligatori, devi inviare anche le intestazioni e il corpo necessari. Puoi creare le intestazioni e il corpo nel pannello Richiesta di integrazione alle voci Intestazioni di richiesta HTTP e Corpo della richiesta.

Ad esempio, se integri l'API ListCollections di Amazon Rekognition, crea l'intestazione X-Amz-Target: RekognitionService.ListCollections.

Esempio di richiesta di codice:

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

    {}

Se stai integrando l'API SendMessage di Amazon Simple Queue Service (Amazon SQS), mappa il corpo della richiesta che utilizza l'espressione di mappatura method.request.body.JSONPath_EXPRESSION. (Sostituisci JSONPath_EXPRESSION con un'espressione JSONPath per un campo JSON del corpo della richiesta.)

Esempio di richiesta di codice:

{'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}}

Crea i parametri per la richiesta di integrazione

Mappa i parametri che hai creato per la richiesta del metodo sui parametri per la richiesta di integrazione.

Completa i seguenti passaggi:

  1. Apri la console Gateway API.
  2. Nel pannello di navigazione, scegli API, quindi seleziona il nome dell'API.
  3. Nella pagina Risorse, scegli un metodo per Tipo di metodo.
  4. Scegli la scheda Richiesta di integrazione, quindi seleziona Modifica.
  5. Espandi Parametri della stringa di query URL, quindi scegli Aggiungi parametro della stringa di query.
  6. In Nome, inserisci il nome di un parametro della richiesta per l'API del servizio che stai integrando.
    Nota: il nome fa distinzione tra maiuscole e minuscole e deve apparire esattamente come richiesto dall'API del servizio.
  7. In Mappato da, inserisci method.request.querystring.param_name. Sostituisci param_name con il nome del parametro corrispondente che hai creato per la richiesta del metodo. Ad esempio, method.request.querystring.TopicArn.
  8. Crea i parametri per la richiesta di integrazione corrispondenti a ciascun parametro creato per la richiesta del metodo.
  9. Scegli Salva.

Nota: se hai creato le intestazioni e il corpo necessari per la richiesta del metodo, mappali anche sulla richiesta di integrazione. Per creare le intestazioni e un corpo obbligatori per la richiesta del metodo, utilizza le voci Intestazioni HTTP e Modelli di mappatura del pannello Richiesta di integrazione.

Per ulteriori informazioni, consulta Configurazione di una richiesta di integrazione API tramite la console Gateway API.

(Facoltativo) Controlla la configurazione dell'integrazione

Per verificare che la configurazione dell'integrazione sia corretta, esegui questo comando get-integration:

aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST

Per l'esempio di configurazione di Amazon SNS, l'output appare simile al seguente esempio di codice:

{    "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": []
}

Per payload di messaggi di grandi dimensioni, esegui questa integrazione di Amazon SNS sull'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)"
}

Nota: Amazon SNS supporta una dimensione massima dell'intestazione di 16 KB. Prima di inviare la richiesta all'integrazione, utilizza un modello di mappatura delle richieste per convertire una richiesta HTTP in entrata in un formato diverso. Poiché l'ARN del topic Amazon SNS è codificato nel modello di mappatura, i client non lo trasmettono nella loro richiesta.

Per verificare la configurazione dell'integrazione, completa i seguenti passaggi:

  1. Apri la console Gateway API.
  2. Nel pannello di navigazione, scegli API, quindi seleziona il nome dell'API.
  3. Nella pagina Risorse, scegli un metodo per Tipo di metodo, quindi seleziona la scheda Test.
  4. Nella pagina Metodo di test, completa i seguenti passaggi:
    In Stringhe di query, inserisci una stringa di query che includa i parametri della richiesta e i valori per le stringhe di query.
    Per l'integrazione di Amazon SNS, inserisci TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello". Sostituisci arn:aws:sns:us-east-1:123456789012:test con l'ARN del tuo topic Amazon SNS.
    Per l'integrazione di Amazon SNS che utilizza il modello di mappatura, inserisci i dati JSON del payload del messaggio in Corpo richiesta, quindi scegli Test.
    Nota: il payload varia a seconda della configurazione.
  5. Quando ricevi una risposta positiva, distribuisci la REST API.

Informazioni correlate

Tutorial: creazione di una REST API con un'integrazione AWS

Metodi per REST API in Gateway API

Integrazioni per REST API in Gateway API

Esempi di mappatura dei parametri per REST API in Gateway API