Configurazione di integrazioni personalizzate Lambda in API Gateway - Amazon API Gateway

Configurazione di integrazioni personalizzate Lambda in API Gateway

Per mostrare come si configura l’integrazione personalizzata, o non proxy, Lambda, si crea un’API di Gateway API per esporre il metodo GET /greeting?greeter={name} in modo da invocare una funzione Lambda. Usa uno dei seguenti esempi di funzioni Lambda per l'API.

Usa uno dei seguenti esempi di funzioni Lambda:

Node.js
'use strict'; var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; var times = ['morning', 'afternoon', 'evening', 'night', 'day']; export const handler = async(event) => { console.log(event); // Parse the input for the name, city, time and day property values let name = event.name === null || event.name === undefined || event.name === "" ? 'you' : event.name; let city = event.city === undefined ? 'World' : event.city; let time = times.indexOf(event.time)<0 ? 'day' : event.time; let day = days.indexOf(event.day)<0 ? null : event.day; // Generate a greeting let greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. '; if (day) greeting += 'Happy ' + day + '!'; // Log the greeting to CloudWatch console.log('Hello: ', greeting); // Return a greeting to the caller return greeting; };
Python
import json def lambda_handler(event, context): print(event) res = { "statusCode": 200, "headers": { "Content-Type": "*/*" } } if event['greeter'] == "": res['body'] = "Hello, World" elif (event['greeter']): res['body'] = "Hello, " + event['greeter'] + "!" else: raise Exception('Missing the required greeter parameter.') return res

Questa funzione risponde con un messaggio "Hello, {name}!" se il valore del parametro greeter è una stringa non vuota. La funzione restituisce un messaggio "Hello, World!" se il valore di greeter è una stringa vuota. La funzione restituisce un messaggio di errore "Missing the required greeter parameter." se il parametro greeter non è impostato nella richiesta in ingresso. Denominiamo la funzione HelloWorld.

Puoi crearla nella console Lambda o tramite la AWS CLI. In questa sezione faremo riferimento alla funzione usando l'ARN seguente:

arn:aws:lambda:us-east-1:123456789012:function:HelloWorld

Con la funzione Lambda impostata nel back-end, procedi a configurare l'API.

Per configurare l'integrazione personalizzata Lambda tramite la AWS CLI
  1. Utilizza il seguente comando create-rest-api per creare un’API:

    aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)'

    L'output sarà simile al seguente:

    { "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "rootResourceId" : "krznpq9xpg", "createdDate": 1508461860 }

    In questo esempio si utilizza id dell’API (te6si5ach7) e rootResourceId (krznpq9xpg).

  2. Utilizza il seguente comando create-resource per creare una risorsa /greeting di Gateway API:

    aws apigateway create-resource \ --rest-api-id te6si5ach7 \ --parent-id krznpq9xpg \ --path-part greeting

    L'output sarà simile al seguente:

    { "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }

    Nel passaggio successivo si utilizza il valore id (2jf6xt) della risorsa greeting per creare un metodo sulla risorsa /greeting.

  3. Utilizza il seguente comando put-method per creare una richiesta di metodo API GET /greeting?greeter={name}:

    aws apigateway put-method --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=false

    L'output sarà simile al seguente:

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }

    Questo metodo API permette al client di ricevere una formula di saluto dalla funzione Lambda nel back-end. Il parametro greeter è facoltativo perché il back-end deve gestire un chiamante anonimo o un chiamante autoidentificato.

  4. Utilizza il seguente comando put-method-response per configurare la risposta 200 OK sulla richiesta di metodo GET /greeting?greeter={name}:

    aws apigateway put-method-response \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200

  5. Utilizza il seguente comando put-integration per configurare l’integrazione del metodo GET /greeting?greeter={name} con una funzione Lambda denominata HelloWorld. La funzione risponde alla richiesta con un messaggio "Hello, {name}!" se è specificato il parametro greeter, altrimenti con "Hello, World!" se il parametro della stringa di query non è impostato.

    aws apigateway put-integration \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --type AWS \ --integration-http-method POST \ --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations \ --request-templates '{"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}' \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

    Il modello di mappatura fornito qui traduce il parametro della stringa di query greeter nella proprietà greeter del payload JSON. Questo è necessario perché l'input di una funzione Lambda deve essere espresso nel corpo.

    Importante

    Per le integrazioni Lambda, devi usare il metodo HTTP POST per la richiesta di integrazione, secondo la specifica dell'operazione del servizio Lambda per le chiamate della funzione. Il parametro uri è l'ARN dell'operazione di chiamata della funzione.

    L'output sarà simile al seguente:

    { "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations", "httpMethod": "POST", "requestTemplates": { "application/json": "{\"greeter\":\"$input.params('greeter')\"}" }, "cacheNamespace": "krznpq9xpg", "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole", "type": "AWS" }

    Il ruolo IAM apigAwsProxyRole deve includere policy che permettono al servizio apigateway di richiamare funzioni Lambda. Invece di specificare un ruolo IAM per credentials, puoi chiamare il comando add-permission per aggiungere autorizzazioni basate su risorse. Questo è il modo in cui la console API Gateway aggiunge queste autorizzazioni.

  6. Utilizza il seguente comando put-integration-response per configurare la risposta di integrazione in modo da passare l’output della funzione Lambda al client come risposta di metodo 200 OK:

    aws apigateway put-integration-response \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""

    Impostando il modello di selezione su una stringa vuota, la risposta predefinita è 200 OK.

    L'output sarà simile al seguente:

    { "selectionPattern": "", "statusCode": "200" }
  7. Utilizza il seguente comando create-deployment per distribuire l’API in una fase test.

    aws apigateway create-deployment \ --rest-api-id te6si5ach7 \ --stage-name test
  8. Testa l'API usando il comando cURL seguente in un terminale:

    curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=me' \ -H 'authorization: AWS4-HMAC-SHA256 Credential={access_key}/20171020/us-west-2/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=f327...5751'