Configuración de integraciones de Lambda personalizadas en API Gateway - Amazon API Gateway

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:

Node.js
export const handler = function(event, context, callback) { var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; if (event.greeter==null) { callback(new Error('Missing the required greeter parameter.')); } else if (event.greeter === "") { res.body = "Hello, World"; callback(null, res); } else { res.body = "Hello, " + event.greeter +"!"; callback(null, res); } };
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

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.
  1. 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.

  2. Llame al comando get-resources para obtener el id 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.

  3. 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 recurso id (2jf6xt) resultante. Lo necesitará para crear un método en el recurso /greeting en el siguiente paso.

  4. Llame a put-method para crear una solicitud de método de API para GET /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.

  5. Llame a put-method-response para configurar la respuesta 200 OK en la solicitud de método para GET /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

  6. Llame a put-integration para configurar la integración del método GET /greeting?greeter={name} con una función de Lambda denominada HelloWorld. Esta función responde a la solicitud con un mensaje de "Hello, {name}!", si se proporciona el parámetro greeter, 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 propiedad greeter 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ámetro uri 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 servicio apigateway invocar funciones de Lambda. En lugar de proporcionar un rol de IAM para credentials, 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.

  7. 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étodo 200 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" }
  8. Llame a create-deployment para implementar la API en una etapa test:

    aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
  9. 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'