Configuración de integraciones de Lambda personalizadas en API Gateway
Para mostrar cómo configurar la integración de Lambda personalizada, creamos una API de API Gateway, para exponer el método GET /greeting?greeter={name}
para invocar una función de Lambda. Utilice uno de los siguientes ejemplos de funciones de Lambda para su API.
Utilice uno de los siguientes ejemplos de funciones de Lambda:
La función responde con un mensaje de "Hello, {name}!"
si el valor del parámetro greeter
es una cadena no vacía. Si el valor "Hello, World!"
es una cadena vacía, devuelve un mensaje de greeter
. La función devuelve un mensaje de error de "Missing the required greeter
parameter."
si el parámetro greeter no se ha establecido en la solicitud entrante. Asignamos un nombre a la función HelloWorld
.
Puede crearla en la consola de Lambda o mediante la AWS CLI. En esta sección, hacemos referencia a esta función mediante los siguientes ARN:
arn:aws:lambda:us-east-1:123456789012:function:HelloWorld
Una vez establecida la función de Lambda en el backend, proceda a configurar la API.
Para configurar la integración personalizada de Lambda mediante la AWS CLI.
-
Llame al comando
create-rest-api
para crear una API:aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2
Anote el valor
id
(te6si5ach7
) de la API resultante en la respuesta:{ "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }
Necesitará el
id
de la API en esta sección. -
Llame al comando
get-resources
para obtener elid
del recurso raíz:aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2
La respuesta correcta es la siguiente:
{ "items": [ { "path": "/", "id": "krznpq9xpg" } ] }
Anote el valor
id
(krznpq9xpg
) del recurso raíz. Lo necesitará en el siguiente paso y más adelante. -
Llame a
create-resource
para crear un recurso de API Gateway para/greeting
:aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part greeting
La respuesta correcta será similar a la que se muestra a continuación:
{ "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }
Anote el valor
greeting
del recursoid
(2jf6xt
) resultante. Lo necesitará para crear un método en el recurso/greeting
en el siguiente paso. -
Llame a
put-method
para crear una solicitud de método de API paraGET /greeting?greeter={name}
:aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=false
La respuesta correcta será similar a la que se muestra a continuación:
{ "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }
Este método de API permite al cliente recibir saludos de la función de Lambda al backend. El parámetro
greeter
es opcional, ya que el backend debería administrar un intermediario anónimo o bien un intermediario identificado. -
Llame a
put-method-response
para configurar la respuesta200 OK
en la solicitud de método paraGET /greeting?greeter={name}
:aws apigateway put-method-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200
-
Llame a
put-integration
para configurar la integración del métodoGET /greeting?greeter={name}
con una función de Lambda denominadaHelloWorld
. Esta función responde a la solicitud con un mensaje de"Hello, {name}!"
, si se proporciona el parámetrogreeter
, o bien"Hello, World!"
, si no se ha establecido el parámetro de cadena de consulta.aws apigateway put-integration \ --region us-west-2 \ --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
La plantilla de mapeo proporcionada aquí traslada el parámetro de cadena de consulta
greeter
a la propiedadgreeter
de la carga de JSON. Esto es necesario porque la entrada a una función de Lambda se debe expresar en el cuerpo.importante
Para las integraciones Lambda, debe utilizar el método HTTP de
POST
para la solicitud de integración, según la especificación de la acción del servicio de Lambda para las invocaciones de funciones. El parámetrouri
es el ARN de la acción que invoca las funciones.La salida correcta es similar a la siguiente:
{ "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" }
El rol de IAM de
apigAwsProxyRole
debe tener políticas que permiten al servicioapigateway
invocar funciones de Lambda. En lugar de proporcionar un rol de IAM paracredentials
, puede llamar al comando add-permission para agregar permisos basados en recursos. De este modo es como la consola de API Gateway agrega estos permisos. -
Llame a
put-integration-response
para configurar la respuesta de integración para transferir la salida de la función de Lambda al cliente como respuesta del método200 OK
.aws apigateway put-integration-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""
Si se establece el patrón de selección en una cadena vacía, la respuesta
200 OK
es la opción predeterminada.La respuesta correcta debería ser similar a la siguiente:
{ "selectionPattern": "", "statusCode": "200" }
-
Llame a
create-deployment
para implementar la API en una etapatest
:aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
-
Pruebe la API mediante el siguiente comando cURL en un terminal:
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'