Cómo configurar un Path en API Gateway con AWS SAM sin Lambda Proxy Integration
¿Sabías que con API Gateway puedes manejar solicitudes HTTP sin necesidad de preocuparte por servidores? En arquitecturas serverless, este servicio no solo expone tus endpoints, sino que también transforma y controla cómo llegan los datos a tu backend. En este tutorial, te enseñaré cómo llevarlo al siguiente nivel configurando integraciones personalizadas con OpenAPI. ¿Qué es Lambda Proxy Integration y cuándo evitarlo? Cuando utilizamos AWS SAM para definir nuestra arquitectura serverless, la integración predeterminada entre Lambda y API Gateway es Lambda Proxy Integration. Esto significa que toda la solicitud HTTP (headers, body, query parameters) se pasa directamente como un evento JSON a la función Lambda. Aunque este enfoque es conveniente, no siempre es ideal. Si necesitas transformar las solicitudes o conectarte a otros servicios directamente desde API Gateway, una integración personalizada es la mejor opción. 1. Definiendo la función Lambda Comencemos creando nuestra función Lambda en el template de AWS SAM. Configuraremos sus propiedades principales. Como queremos usar una integración personalizada, omitiremos la propiedad Events. Resources: MyFunction: Type: AWS::Lambda::Function Properties: Handler: app.lambdaHandler Runtime: nodejs18.x CodeUri: ./src/ Timeout: 10 2. Definiendo el API Gateway A continuación, configuraremos nuestro API Gateway manualmente para evitar el comportamiento por defecto de Lambda Proxy Integration. Utilizaremos la propiedad DefinitionBody para definir la API en formato OpenAPI: Resources: MyApi: Type: AWS::Serverless::Api Properties: Name: MyCustomApi StageName: Prod DefinitionBody: openapi: 3.0.1 info: title: My API version: 3.0.1 paths: /example: 3. Configurando una integración personalizada Ahora especificaremos la integración personalizada para nuestro path. Usaremos la extensión x-amazon-apigateway-integration: paths: /example: get: x-amazon-apigateway-integration: type: "AWS" # Tipo de integración personalizada para servicios AWS uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations" # URI de la Lambda httpMethod: "POST" # Método HTTP usado para invocar el backend passthroughBehavior: "WHEN_NO_MATCH" # Manejo de solicitudes sin modelo de mapeo definido requestTemplates: # Mapping template que nos ayuda a transformar la data para luego pasarla a nuestro backend application/json: | { "statusCode": 200 } responses: # Tambien es posible mapear la respuesta que nos devuelve nuestro backend default: statusCode: "200" Conclusión Con esta configuración, hemos configurado una integración personalizada que nos permite un control total sobre cómo se manejan las solicitudes y respuestas. Esto nos abre la puerta a arquitecturas más avanzadas y flexibles en AWS. Si deseas profundizar más en las propiedades como passthroughBehavior o x-amazon-apigateway-integration, consulta la documentación oficial de AWS. Si tienes dudas o comentarios, ¡déjalos abajo!
¿Sabías que con API Gateway puedes manejar solicitudes HTTP sin necesidad de preocuparte por servidores? En arquitecturas serverless, este servicio no solo expone tus endpoints, sino que también transforma y controla cómo llegan los datos a tu backend. En este tutorial, te enseñaré cómo llevarlo al siguiente nivel configurando integraciones personalizadas con OpenAPI.
¿Qué es Lambda Proxy Integration y cuándo evitarlo?
Cuando utilizamos AWS SAM para definir nuestra arquitectura serverless, la integración predeterminada entre Lambda y API Gateway es Lambda Proxy Integration. Esto significa que toda la solicitud HTTP (headers, body, query parameters) se pasa directamente como un evento JSON a la función Lambda.
Aunque este enfoque es conveniente, no siempre es ideal. Si necesitas transformar las solicitudes o conectarte a otros servicios directamente desde API Gateway, una integración personalizada es la mejor opción.
1. Definiendo la función Lambda
Comencemos creando nuestra función Lambda en el template de AWS SAM. Configuraremos sus propiedades principales. Como queremos usar una integración personalizada, omitiremos la propiedad Events
.
Resources:
MyFunction:
Type: AWS::Lambda::Function
Properties:
Handler: app.lambdaHandler
Runtime: nodejs18.x
CodeUri: ./src/
Timeout: 10
2. Definiendo el API Gateway
A continuación, configuraremos nuestro API Gateway manualmente para evitar el comportamiento por defecto de Lambda Proxy Integration. Utilizaremos la propiedad DefinitionBody
para definir la API en formato OpenAPI:
Resources:
MyApi:
Type: AWS::Serverless::Api
Properties:
Name: MyCustomApi
StageName: Prod
DefinitionBody:
openapi: 3.0.1
info:
title: My API
version: 3.0.1
paths:
/example:
3. Configurando una integración personalizada
Ahora especificaremos la integración personalizada para nuestro path. Usaremos la extensión x-amazon-apigateway-integration
:
paths:
/example:
get:
x-amazon-apigateway-integration:
type: "AWS" # Tipo de integración personalizada para servicios AWS
uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations" # URI de la Lambda
httpMethod: "POST" # Método HTTP usado para invocar el backend
passthroughBehavior: "WHEN_NO_MATCH" # Manejo de solicitudes sin modelo de mapeo definido
requestTemplates: # Mapping template que nos ayuda a transformar la data para luego pasarla a nuestro backend
application/json: |
{
"statusCode": 200
}
responses: # Tambien es posible mapear la respuesta que nos devuelve nuestro backend
default:
statusCode: "200"
Conclusión
Con esta configuración, hemos configurado una integración personalizada que nos permite un control total sobre cómo se manejan las solicitudes y respuestas. Esto nos abre la puerta a arquitecturas más avanzadas y flexibles en AWS.
Si deseas profundizar más en las propiedades como passthroughBehavior o x-amazon-apigateway-integration, consulta la documentación oficial de AWS.
Si tienes dudas o comentarios, ¡déjalos abajo!
What's Your Reaction?