¿Cómo paso los encabezados personalizados con API Gateway a una función de Lambda con la integración personalizada (sin proxy) de Lambda?

6 minutos de lectura
0

Quiero configurar una función de AWS Lambda con una integración personalizada (sin proxy) para procesar encabezados personalizados que se pasan con mi API de Amazon API Gateway. ¿Cómo se configura esto?

Descripción corta

De manera predeterminada, una función Lambda solo procesa el cuerpo de la solicitud de método que recibe de una solicitud de API Gateway. Para pasar encabezados personalizados desde una API Gateway a una función Lambda, utilice una plantilla de mapeo del cuerpo. La API envía la solicitud de API actualizada a una función Lambda para procesar los encabezados. A continuación, la función Lambda devuelve uno o varios valores del encabezado de la solicitud original de la API.

Resolución

Configure los permisos de AWS Identity and Access Management (IAM) requeridos

Siga las instrucciones de Control access to an API with IAM permissions (Control del acceso a una API con permisos de IAM).

Para probar este procedimiento, puede crear un rol de IAM y adjuntar las siguientes políticas administradas de AWS:

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

Cree una función Lambda para manejar encabezados personalizados desde su API Gateway

1.    Abra la consola de Lambda.

2.    Elija Create function (Crear función). La página Create function (Crear función) se abre con la opción Author from scratch (Crear desde cero) seleccionada.

3.    En el panel Basic information (Información básica), haga lo siguiente:
En Function name (Nombre de la función), ingrese un nombre que describa el propósito de su función. Por ejemplo, CustomHeaders.
En Runtime (Tiempo de ejecución), elija Node.js 14.x.

4.    En Permissions (Permisos), expanda Change default execution role (Cambiar el rol de ejecución predeterminado).

5.    Elija Use an existing role (Usar un rol existente). Aparece una lista desplegable de los roles existentes.

6.    En Existing role (Rol existente), elija el rol de ejecución de Lambda que creó anteriormente.

7.    Elija Create function (Crear función).

8.    En el panel Code source (Código fuente), sustituya el código del panel del editor (index.js) por lo siguiente:

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    Elija Save (Guardar).

Para más información, consulte Creación de funciones de Lambda con Node.js.

Crear una API REST de API Gateway

1.    Abra la consola de API Gateway.

2.    Elija Create API (Crear API).

-o bien-

(Si es la primera vez que utiliza API Gateway) Aparece una página que le presenta las características del servicio. En REST API (API REST), elija Build (Crear). Cuando aparezca la ventana emergente Create Example API (Crear API de ejemplo), elija OK (Aceptar).

3.    En Choose an API type (Elegir un tipo de API), en el panel de REST API (API REST), elija Build (Crear).

4.    En Create new API (Crear una API nueva), elija New API (Nueva API).

5.    En Settings (Configuración), haga lo siguiente:
En API name (Nombre de la API), ingrese un nombre que describa el propósito de su API. Por ejemplo, SendtoLambda.
(Opcional) En Description (Descripción), ingrese una breve descripción del propósito de su API.
En Endpoint Type (Tipo de punto de enlace), elija Regional (Regional).

6.    Elija Create API (Crear API).

Configurar el punto de integración de su API y la plantilla de mapeo del cuerpo

1.    En la consola de API Gateway, elija el nombre de la API que creó en el paso anterior. Se abre la página Resources (Recursos) de su API.

2.    En la página Resources (Recursos), elija Actions (Acciones). Luego, elija Create Resource (Crear recurso).

3.    En el panel New Child Resource (Nuevo recurso secundario), haga lo siguiente:
En Resource Name (Nombre del recurso), ingrese un nombre que describa el recurso. Por ejemplo, HeadersResource.
Elija Create Resource (Crear recurso).

4.    Elija Actions (Acciones). Luego, elija Create Method (Crear método).

5.    En la lista desplegable de /headersresource, elija POST. A continuación, elija el icono de la marca de verificación.

6.    En la página /headersresource - POST - Setup, haga lo siguiente:
En Integration type (Tipo de integración), elija Lambda Function (Función Lambda).
En Lambda Region (Región de Lambda), elija la región de AWS que aloja su función.
En Lambda Function (Función Lambda), ingrese el nombre de su función.
Elija Save (Guardar). Aparecerá la ventana emergente Add Permission to Lambda Function (Agregar permiso a función Lambda).
En la ventana emergente, elija OK (Aceptar).

7.    En la página /headersresource - POST - Method Execution, elija Integration Request (Solicitud de integración).

8.    En la página /headersresource - POST - Integration Request, haga lo siguiente:
Expanda Mapping Templates (Plantillas de mapeo).
En Request body passthrough (Paso directo del cuerpo de la solicitud), elija When there are no templates defined (recommended) (Cuando no hay plantillas definidas (recomendado)).
Elija Add mapping template (Agregar plantilla de mapeo).
En Content-Type (Tipo de contenido), ingrese application/json. A continuación, elija el icono de la marca de verificación.

9.    En el editor de plantillas de mapeo, ingrese lo siguiente:

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))"
    #if($foreach.hasNext),#end
    #end
  }
}

10.    Elija Save (Guardar).

Implementar la API en una nueva fase

1.    Siga las instrucciones de Implementación de una API de REST en una etapa. Para obtener más información, consulte Configuración de una etapa con la consola de API Gateway.

2.    En el panel Stage Editor (Editor de la fase), copie la Invoke URL (URL de invocación) al portapapeles.

Ejemplo de URL de invocación de la API de REST

https://1a2bc3d456.execute-api.region.amazonaws.com/test

Prueba de configuración

Para confirmar que su API y su función Lambda procesan los encabezados de los mensajes, ejecute el siguiente comando curl:

Importante: Sustituya https://restApiId.execute-api.region.amazonaws.com/stageName por la URL de invocación de su API.

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

Salida de ejemplo

"This message header was processed by Amazon API Gateway and AWS Lambda"

Nota: Para instalar curl en Windows, consulte Downloads (Descargas) en el sitio web de Git. Para más información sobre curl, consulte el sitio web del proyecto curl.


Información relacionada

Setting up data transformations for REST APIs (Configuración de transformaciones de datos para las API de REST)

Lambda permissions (Permisos de Lambda)

Control access to an API with IAM permissions (Control del acceso a una API con permisos de IAM)