Configuración de una integración de proxy de Lambda para API Gateway mediante la AWS CLI - Amazon API Gateway

Configuración de una integración de proxy de Lambda para API Gateway mediante la AWS CLI

En esta sección mostramos cómo configurar una API con la integración de proxy de Lambda mediante la AWS CLI. Para obtener instrucciones detalladas acerca de cómo utilizar la consola de API Gateway para configurar un recurso de proxy con la integración de proxy de Lambda, consulte Tutorial: Creación de una API de REST con una integración de proxy de Lambda.

Como ejemplo, utilizaremos la siguiente función de Lambda de muestra como el backend de la API:

export const handler = function(event, context, callback) { 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 + "!"; callback(null, res); };

Si se compara con la configuración de la integración personalizada de Lambda en Configuración de integraciones de Lambda personalizadas en API Gateway, la entrada de esta función de Lambda se puede expresar en los parámetros de la solicitud y en el cuerpo. Tiene más libertad para permitir al cliente transferir los mismos datos de entrada. En este caso el cliente puede transferir el nombre de greeter como un parámetro de cadena de consulta, un encabezado o una propiedad del cuerpo. La función también puede admitir la integración de Lambda personalizada. La configuración de la API es más sencilla. No se configura ninguna respuesta de método ni de integración.

Para configurar una integración de proxy 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": "HelloWorldProxy (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 se muestra del modo 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 {proxy+}

    La respuesta correcta será similar a la que se muestra a continuación:

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

    Anote el valor {proxy+} del recurso id (2jf6xt) resultante. Lo necesitará para crear un método en el recurso /{proxy+} en el siguiente paso.

  4. Llame a put-method para crear una solicitud de método ANY para ANY /{proxy+}:

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

    La respuesta correcta será similar a la que se muestra a continuación:

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

    Este método de API permite al cliente recibir o enviar saludos de la función de Lambda al backend.

  5. Llame a put-integration para configurar la integración del método ANY /{proxy+} 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 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

    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 rol de IAM de apigAwsProxyRole debe tener políticas que permitan al servicio apigateway invocar funciones Lambda. Para obtener más información sobre los permisos de IAM, consulte Modelo de permisos de API Gateway para invocar una API.

    La salida correcta será similar a la que se muestra a continuación:

    { "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" }

    En lugar de proporcionar un rol de IAM para credentials, puede llamar al comando add-permission para agregar permisos basados en recursos. Esto es lo que hace la consola de API Gateway.

  6. 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
  7. Pruebe la API mediante los siguientes comandos cURL en un terminal.

    Llame a la API con el parámetro de cadena de consulta de ?greeter=jane:

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

    Llame a la API con un parámetro de encabezado de greeter:jane:

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

    Llame a la API con un cuerpo de {"greeter":"jane"}:

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

    En todos estos casos, la salida es una respuesta 200 con el siguiente cuerpo de respuesta:

    Hello, jane!