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:
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
-
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
) erootResourceId
(krznpq9xpg
). -
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 risorsagreeting
per creare un metodo sulla risorsa/greeting
. -
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. -
Utilizza il seguente comando put-method-response per configurare la risposta
200 OK
sulla richiesta di metodoGET /greeting?greeter={name}
:aws apigateway put-method-response \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200
-
Utilizza il seguente comando put-integration per configurare l’integrazione del metodo
GET /greeting?greeter={name}
con una funzione Lambda denominataHelloWorld
. La funzione risponde alla richiesta con un messaggio"Hello, {name}!"
se è specificato il parametrogreeter
, 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 parametrouri
è 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 servizioapigateway
di richiamare funzioni Lambda. Invece di specificare un ruolo IAM percredentials
, puoi chiamare il comando add-permission per aggiungere autorizzazioni basate su risorse. Questo è il modo in cui la console API Gateway aggiunge queste autorizzazioni. -
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" }
-
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
-
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'