Quiero transferir datos entre Amazon API Gateway, los autorizadores de AWS Lambda y los servicios de backend. Además, quiero gestionar las limitaciones de acceso a los datos de las solicitudes en los autorizadores.
Solución
Nota: Asegúrate de activar los registros de ejecución de Amazon CloudWatch con el seguimiento de datos. Además, despliega tu API después de cambiar las plantillas de integración o asignación.
Creación de un autorizador de Lambda en API Gateway
Requisito previo: Crea una función de Lambda. Para obtener instrucciones sobre Python, consulta Creación de funciones de Lambda con Python. Para obtener instrucciones sobre Node.js, consulta Creación de funciones de Lambda con Node.js.
Crea un autorizador de Lambda REQUEST. En Tipo de origen de identidad, asegúrate de mantenerlo como encabezado. En Clave, introduce un nombre para la clave, como Authorizationtoken.
Configuración del autorizador de Lambda y acceso al cuerpo de la solicitud
Los autorizadores de solicitudes solo pueden acceder a los encabezados, los parámetros de consulta, las variables de etapa y las variables de contexto. En API Gateway, los datos del cuerpo de la solicitud no pasan a las funciones del autorizador. Para acceder al cuerpo de la solicitud, configura tu autorizador de Lambda y utiliza encabezados HTTP o parámetros de cadena de consulta para enviar los datos necesarios para la autorización.
Sigue estos pasos:
-
Abre la consola de API Gateway.
-
Selecciona tu API y, a continuación, selecciona tu recurso.
-
En Métodos, selecciona el método y, a continuación, configura el autorizador de Lambda.<br id=hardline_break/>
Nota: Al configurar el autorizador, los nombres de los encabezados deben estar en minúsculas.
-
Ejemplo de código para un autorizador de Lambda:
exports.handler = async (event) => {
console.log('Authorizer event:', JSON.stringify(event, null, 2));
const headers = event.headers || {};
const queryParams = event.queryStringParameters || {};
const requestContext = event.requestContext || {};
evaluation_logic_returned_policy
return {
principalId: 'user',
policyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn
}]
},
context: {
userId: '123',
headerData: headers['validation-data-via-header'] || 'no-header-data',
queryData: queryParams.validationData || 'no-query-data',
contextresourcePath: requestContext.resourcePath || 'no-context-resource-path'
}
};
};
Nota: El código de ejemplo muestra un autorizador que tiene acceso a los datos del cliente enviados a través de los encabezados y los parámetros de consulta. El autorizador usa los datos del cliente para evaluar la autorización de acceso. Además, el código de ejemplo permite todas las solicitudes. Para devolver una política diferente, sustituye evaluation_logic_returned_policy por tu lógica de evaluación.
-
Ejecuta el siguiente comando para enviar información a la API y probar el acceso del autorizador.
curl -i -X POST "https://api-id.execute-api.region.amazonaws.com/stage_name/resource_path?validationData=test-query-value" \
-H "Authorizationtoken: allow" -H "Validation-Data-Via-Header: test-header-value" \
-H "Content-Type: application/json" \
--data '{"test":"data"}'
Nota: Sustituye api-id por tu ID de API, region por tu región de AWS, stage_name por el nombre de tu etapa de API y resource_path por la ruta para tu API. Además, si has introducido un nombre diferente para tu clave, sustituye Authorizationtoken por el nombre de tu clave.
-
Consulta los registros de la función de Lambda o de API Gateway para confirmar que tu autorizador tiene acceso.
Para obtener más información, consulta Salida de un autorizador de Lambda de API Gateway.
Uso de una integración de Lambda o HTTP para acceder al contexto de los servicios de backend
Cuando tu autorizador devuelva información de contexto, es posible que no tengas acceso a la información de contexto en tus servicios de backend. Si no tienes acceso, debes usar una integración de Lambda o HTTP como backend.
Uso de una función de Lambda con una integración de proxy
Si usas una función de Lambda con una integración de proxy, el evento que reciba tu función de Lambda agregará automáticamente datos de contexto.
Ejemplo de evento:
{
"httpMethod": "POST",
"headers": {
...
},
...
"requestContext": {
"resourceId": "o8nevr",
"authorizer": {
"principalId": "user",
"integrationLatency": 348,
},
...
},
"body": "{\"test\":\"data\"}",
...
}
Uso de una función de Lambda con una integración que no sea de proxy
Si usas una función de Lambda con una integración que no sea de proxy, debes usar una plantilla de asignación. La plantilla de asignación incluye la información de contexto de la carga útil enviada a la función de Lambda.
Para usar una plantilla de asignación, sigue estos pasos:
-
Abre la consola de API Gateway.
-
Selecciona tu API y, a continuación, selecciona tu recurso.
-
En Métodos, selecciona tu método y, a continuación, elige Solicitud de integración.
-
En Plantillas de asignación, agrega content-type: application/json y, a continuación, introduce la siguiente plantilla:
{
"body": $input.json('$'),
"authorizer-context": {
"context-key": "$context.authorizer.context-key"
}
}
Nota: Sustituye context-key por el nombre que desees para la clave de contexto.
Uso de una integración HTTP con una integración de proxy
Si usas una integración de proxy, debes usar encabezados o parámetros de cadena de consulta en la solicitud de integración para incluir la información de contexto.
Sigue estos pasos:
- Abre la consola de API Gateway.
- Selecciona tu API y, a continuación, selecciona tu recurso.
- En Métodos, selecciona tu método.
- Selecciona Solicitud de integración y, a continuación, selecciona Editar.
- En Parámetros de cadena de consulta URL, selecciona Agregar parámetro de cadena de consulta.
- En Nombre, introduce header-with-context-information.
- En Asignado desde, escribe context.authorizer.context-key.<br id=hardline_break/>
Nota: Sustituye context-key por el nombre de tu clave de contexto.
- Selecciona Guardar.
El backend HTTP agrega la información de contexto a los encabezados o parámetros de la cadena de consulta en función de la sección a la que agregaste la información de contexto en tu integración.
Uso de una integración HTTP con una integración que no sea de proxy
Si usas una integración que no sea de proxy, debes agregar un encabezado o parámetros de cadena de consulta. O bien, utiliza una plantilla de asignación. Para obtener instrucciones sobre cómo agregar un encabezado o parámetros de cadena de consulta, consulta la sección Configuración del autorizador de Lambda y acceso al cuerpo de la solicitud de este artículo. Para obtener instrucciones sobre cómo usar una plantilla de asignación, consulta la sección Uso de una función de Lambda con una integración que no sea de proxy de este artículo.