Configurazione dell'integrazione proxy Lambda per Gateway API usando AWS CLI - Amazon API Gateway

Configurazione dell'integrazione proxy Lambda per Gateway API usando AWS CLI

In questa sezione viene illustrato come usare AWS CLI per configurare un'API con l'integrazione proxy Lambda. Per istruzioni dettagliate sull'uso della console API Gateway per configurare una risorsa proxy con l'integrazione proxy Lambda, consulta Tutorial: creazione di una REST API con un'integrazione proxy Lambda.

Per questo scenario useremo la funzione Lambda di esempio seguente come back-end dell'API:

export const handler = async(event, context) => { console.log('Received event:', JSON.stringify(event, null, 2)); var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; var greeter = 'World'; if (event.greeter && event.greeter!=="") { greeter = event.greeter; } else if (event.body && event.body !== "") { var body = JSON.parse(event.body); if (body.greeter && body.greeter !== "") { greeter = body.greeter; } } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") { greeter = event.queryStringParameters.greeter; } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") { greeter = event.multiValueHeaders.greeter.join(" and "); } else if (event.headers && event.headers.greeter && event.headers.greeter != "") { greeter = event.headers.greeter; } res.body = "Hello, " + greeter + "!"; return res };

Rispetto alla configurazione dell'integrazione personalizzata Lambda riportata in Configurazione di integrazioni personalizzate Lambda in API Gateway, l'input per questa funzione Lambda può essere espresso nei parametri e nel corpo della richiesta. Avrai maggiore libertà per permettere al client di passare gli stessi dati di input. Qui il client può passare il nome del mittente della formula di saluto come parametro della stringa di query, intestazione o proprietà del corpo. La funzione può anche supportare l'integrazione personalizzata Lambda. La configurazione dell'API è più semplice. Non devi configurare la risposta del metodo o la risposta di integrazione.

Per configurare l'integrazione proxy 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": "HelloWorldProxy (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 {proxy+}

    L'output sarà simile al seguente:

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

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

  3. Utilizza il seguente comando put-method per creare una richiesta di metodo ANY come ANY /{proxy+}:

    aws apigateway put-method --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method ANY \ --authorization-type "NONE"

    L'output sarà simile al seguente:

    { "apiKeyRequired": false, "httpMethod": "ANY", "authorizationType": "NONE" }

    Questo metodo API permette al client di ricevere o inviare formule di saluto dalla funzione Lambda nel back-end.

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

    aws apigateway put-integration \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method ANY \ --type AWS_PROXY \ --integration-http-method POST \ --uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:HelloWorld/invocations \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole
    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 ruolo IAM apigAwsProxyRole deve includere policy che permettono al servizio apigateway di richiamare funzioni Lambda. Per ulteriori informazioni sulle autorizzazioni IAM, consultare Modello di autorizzazione API Gateway per invocare un'API.

    L'output sarà simile al seguente:

    { "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:1234567890:function:HelloWorld/invocations", "httpMethod": "POST", "cacheNamespace": "vvom7n", "credentials": "arn:aws:iam::1234567890:role/apigAwsProxyRole", "type": "AWS_PROXY" }

    Invece di specificare un ruolo IAM per credentials, è possibile utilizzare il comando add-permission per aggiungere autorizzazioni basate su risorse. Questo è ciò che fa la console API Gateway.

  5. 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
  6. Testa l'API usando i comandi cURL seguenti in un terminale.

    Chiamata dell'API con il parametro della stringa di query ?greeter=jane:

    curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=jane'

    Chiamata dell'API con un parametro di intestazione greeter:jane:

    curl -X GET https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \ -H 'content-type: application/json' \ -H 'greeter: jane'

    Chiamata dell'API con un corpo {"greeter":"jane"}:

    curl -X POST https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \ -H 'content-type: application/json' \ -d '{ "greeter": "jane" }'

    In tutti i casi, l'output è una risposta 200 con il corpo seguente:

    Hello, jane!