Apigateway DG
Apigateway DG
Las marcas comerciales y la imagen comercial de Amazon no se pueden utilizar en relación con ningún producto
o servicio que no sea de Amazon, de ninguna manera que pueda causar confusión entre los clientes y de ninguna
manera que menosprecie o desacredite a Amazon. Todas las demás marcas comerciales que no son propiedad de
Amazon son propiedad de sus respectivos propietarios, que pueden o no estar afiliados, conectados o patrocinados
por Amazon.
Amazon API Gateway Guía del desarrollador
Table of Contents
¿Qué es Amazon API Gateway? .......................................................................................................... 1
Arquitectura de API Gateway ....................................................................................................... 1
Características de API Gateway ................................................................................................... 2
Casos de uso de API Gateway ..................................................................................................... 3
Uso de API Gateway para crear API HTTP ............................................................................ 3
Uso de API Gateway para crear API REST ............................................................................ 3
Uso de API Gateway para crear API de WebSocket ................................................................ 4
¿Quiénes utilizan API Gateway? ........................................................................................... 4
Acceso a API Gateway ............................................................................................................... 5
Parte de la infraestructura sin servidor de AWS .............................................................................. 5
Cómo comenzar a usar Amazon API Gateway ................................................................................ 6
Conceptos de API Gateway ......................................................................................................... 6
Elección entre API HTTP o API de REST ...................................................................................... 9
........................................................................................................................................ 9
Precios de API Gateway ............................................................................................................ 11
Requisitos previos ............................................................................................................................. 13
Introducción ..................................................................................................................................... 14
Paso 1: Crear una función Lambda ............................................................................................. 14
Paso 2: crear una API HTTP ...................................................................................................... 15
Paso 3: probar la API ................................................................................................................ 15
(Opcional) Paso 4: limpiar .......................................................................................................... 16
Pasos siguientes ....................................................................................................................... 17
Tutoriales y talleres ........................................................................................................................... 18
Tutoriales sobre API HTTP ......................................................................................................... 18
API CRUD con Lambda y DynamoDB ................................................................................. 18
Tutoriales sobre API REST ........................................................................................................ 26
Desarrollo de una API con la integración de Lambda ............................................................. 26
Tutorial: Crear una API de REST importando un ejemplo ........................................................ 43
Desarrollo de una API con integración de HTTP .................................................................... 51
Tutorial: Creación de una API con integración privada ............................................................ 87
Tutorial: Creación de una API con integración de AWS ........................................................... 89
Tutorial: API Calc con tres integraciones ............................................................................. 94
Tutorial: Crear una API de REST como proxy de Amazon S3 en API Gateway .......................... 113
Tutorial: Creación de una API de REST como proxy de Amazon Kinesis .................................. 139
Uso de API HTTP ........................................................................................................................... 179
Desarrollo .............................................................................................................................. 179
Creación de una API HTTP .............................................................................................. 179
Rutas ............................................................................................................................ 180
Control de acceso ........................................................................................................... 182
Integraciones .................................................................................................................. 190
CORS ............................................................................................................................ 203
Asignación de parámetros ................................................................................................ 204
OpenAPI ........................................................................................................................ 209
Publicación ............................................................................................................................. 215
Etapas ........................................................................................................................... 215
Nombres de dominio personalizados .................................................................................. 217
Proteger ................................................................................................................................. 219
Limitación controlada ....................................................................................................... 220
TLS mutua ..................................................................................................................... 221
Monitoreo ............................................................................................................................... 224
Métricas ......................................................................................................................... 225
Registro de .................................................................................................................... 226
Solución de problemas ............................................................................................................. 232
Integraciones de Lambda ................................................................................................. 232
iii
Amazon API Gateway Guía del desarrollador
iv
Amazon API Gateway Guía del desarrollador
v
Amazon API Gateway Guía del desarrollador
vi
Amazon API Gateway Guía del desarrollador
............................................................................................................................................... dccclxvi
vii
Amazon API Gateway Guía del desarrollador
Arquitectura de API Gateway
• Se basan en HTTP.
• Habilitan la comunicación entre cliente y servidor sin estado.
• Implementan métodos HTTP estándar como, por ejemplo, GET, POST, PUT, PATCH y DELETE.
Para obtener más información acerca de las API REST de API Gateway y las API HTTP, consulte
the section called “Elección entre API HTTP o API de REST ” (p. 9), Uso de API HTTP (p. 179),
the section called “Uso de API Gateway para crear API REST” (p. 3) y the section called “Crear y
configurar” (p. 236).
• Cumplen el protocolo WebSocket, que permite la comunicación entre el cliente y el servidor de dúplex
completo con estado.
• Dirigen mensajes entrantes en función del contenido de los mensajes.
Para obtener más información sobre las API de WebSocket de API Gateway, consulte the section called
“Uso de API Gateway para crear API de WebSocket” (p. 4) y the section called “Acerca de las API de
WebSocket” (p. 717).
Temas
• Arquitectura de API Gateway (p. 1)
• Características de API Gateway (p. 2)
• Casos de uso de API Gateway (p. 3)
• Acceso a API Gateway (p. 5)
• Parte de la infraestructura sin servidor de AWS (p. 5)
• Cómo comenzar a usar Amazon API Gateway (p. 6)
• Conceptos de Amazon API Gateway (p. 6)
• Elección entre API HTTP y API de REST (p. 9)
• Precios de API Gateway (p. 11)
1
Amazon API Gateway Guía del desarrollador
Características de API Gateway
Este diagrama ilustra cómo las API que crea en Amazon API Gateway le proporcionan a usted o a sus
clientes desarrolladores una experiencia de desarrollador integrada y coherente para crear aplicaciones
sin servidor de AWS. API Gateway gestiona todas las tareas relacionadas con la aceptación y el
procesamiento de centenares de miles de llamadas simultáneas a la API. Estas tareas incluyen la
administración del tráfico, el control de la autorización y el acceso, el monitoreo y la administración de
versiones de la API.
API Gateway actúa como una "puerta principal" para que las aplicaciones accedan a datos, lógica
empresarial o funcionalidad desde sus servicios backend, como cargas de trabajo que se ejecutan en
Amazon Elastic Compute Cloud (Amazon EC2), código que se ejecuta en AWS Lambda, cualquier
aplicación web o aplicaciones de comunicación en tiempo real.
• Compatibilidad con las API con estado (WebSocket (p. 717)) y las API (HTTP (p. 179) y
REST (p. 236)).
• Mecanismos de autenticación (p. 269) potentes y flexibles, como las políticas de AWS Identity and
Access Management, las funciones de autorización de Lambda y los grupos de usuarios de Amazon
Cognito.
• Portal para desarrolladores (p. 649) para la publicación de sus API.
• Implementaciones de la versión Canary (p. 529) para el despliegue de cambios de forma segura.
• Registro de CloudTrail (p. 824) y monitoreo del uso y de los cambios en las API.
• Registro de acceso y registro de ejecución de CloudWatch, que incluye la posibilidad de establecer
alarmas. Para obtener más información, consulte the section called “Métricas de CloudWatch” (p. 696)
y the section called “Métricas” (p. 760).
• Posibilidad de utilizar plantillas de AWS CloudFormation para habilitar la creación de las API. Para
obtener más información, consulte Referencia de tipos de recursos de Amazon API Gateway y
Referencia de tipos de recursos de Amazon API Gateway V2.
• Soporte para los nombres de dominio personalizados (p. 542).
• Integración con AWS WAF (p. 683) para la protección de sus API frente a ataques web comunes.
• Integración con AWS X-Ray (p. 706) para comprender y cribar latencias de rendimiento.
2
Amazon API Gateway Guía del desarrollador
Casos de uso de API Gateway
Para obtener una lista completa de lanzamientos de características de API Gateway, consulte Historial de
revisión (p. 852).
Puede utilizar API HTTP para enviar solicitudes a funciones de AWS Lambda o a cualquier punto de
enlace HTTP públicamente direccionable.
Por ejemplo, puede crear una API HTTP que se integre con una función de Lambda en el backend.
Cuando un cliente llama a la API, API Gateway envía la solicitud a la función de Lambda y devuelve la
respuesta de la función al cliente.
Las API HTTP son compatibles con la autorización de OpenID Connect y OAuth 2.0. Vienen con soporte
integrado para el uso compartido de recursos entre orígenes (CORS) y las implementaciones automáticas.
Para obtener más información, consulte the section called “Elección entre API HTTP o API de REST
” (p. 9).
Por ejemplo, /incomes podría ser la ruta de un recurso que representa los ingresos del usuario de
la aplicación. Un recurso puede tener una o varias operaciones, las cuales definen los verbos HTTP
correspondientes, por ejemplo, GET, POST PUT, PATCH y DELETE. Una combinación de una ruta de
recurso y una operación identifica un método de la API. Por ejemplo, un método POST /incomes podría
añadir una ganancia devengada por el intermediario y un método GET /expenses podría consultar los
gastos en los que ha incurrido el intermediario.
La aplicación no necesita saber dónde se almacenan y de dónde se obtienen los datos solicitados en el
backend. En las API REST de API Gateway, el frontend se encapsula mediante solicitudes de métodos
y respuestas de métodos. La API se conecta con el backend por medio de solicitudes de integración y
respuestas de integración.
Por ejemplo, con DynamoDB como backend, el desarrollador de la API configura la solicitud de integración
para reenviar la solicitud del método de entrada al backend elegido. La configuración incluye las
especificaciones de acción de DynamoDB adecuadas y los roles y políticas de IAM necesarios, así como
la transformación de los datos de entrada correcta. El backend devuelve el resultado a API Gateway como
una respuesta de integración.
Para dirigir la respuesta de integración a una respuesta de método adecuada (de un determinado código
de estado HTTP) al cliente, puede configurar la respuesta de integración para que mapee los parámetros
3
Amazon API Gateway Guía del desarrollador
Uso de API Gateway para crear API de WebSocket
de respuesta necesarios desde la integración del método. A continuación, si fuera necesario, convierta el
formato de los datos de salida del backend al del frontend. API Gateway le permite definir un esquema o
modelo de carga para facilitar la configuración de la plantilla de mapeo de cuerpo.
• Soporte para generar SDK y crear la documentación de API mediante extensiones de OpenAPI de API
Gateway
• Limitación controlada de solicitudes HTTP
Por ejemplo, podría crear una aplicación sin servidor utilizando una API de WebSocket de API Gateway y
AWS Lambda para enviar y recibir mensajes entre usuarios individuales o grupos de usuarios de una sala
de chat. También puede invocar servicios de backend como por ejemplo AWS Lambda, Amazon Kinesis o
un punto de enlace HTTP basándose en el contenido de los mensajes.
Puede utilizar la API de WebSocket de API Gateway para crear aplicaciones seguras de comunicación
en tiempo real sin tener que aprovisionar ni administrar servidores para administrar las conexiones o los
intercambios de datos a gran escala. Los casos de uso focalizados incluyen aplicaciones en tiempo real,
como la siguiente:
• Aplicaciones de chat
• Paneles en tiempo real como los de cotizaciones bursátiles
• Alertas y notificaciones en tiempo real
Un desarrollador de API crea e implementa una API para habilitar la funcionalidad necesaria en API
Gateway. El desarrollador de API debe ser un usuario de IAM en la cuenta de AWS que posee la API.
Un desarrollador de aplicaciones diseña una aplicación funcional que llama a los servicios de AWS
invocando una API de WebSocket o de REST creada por un desarrollador de API en API Gateway.
4
Amazon API Gateway Guía del desarrollador
Acceso a API Gateway
Como desarrollador de API, puede crear y administrar una API mediante la consola de API Gateway tal
y como se describe en Introducción a la API de API Gateway (p. 14) o llamando a la Referencias de
API (p. 839). Existen varias maneras de llamar a esta API. Incluyen el uso de la interfaz de línea de
comandos (CLI) de AWS o un SDK de AWS. Además, puede habilitar la creación de la API con plantillas
de AWS CloudFormation o (en el caso de las API REST y API HTTP) Trabajar con extensiones de API
Gateway para OpenAPI (p. 771).
Para obtener una lista de las regiones en las que API Gateway está disponible, así como los puntos de
enlace del servicio de control asociados, consulte Cuotas y puntos de enlace de Amazon API Gateway.
• Consola de administración de AWS: los procedimientos de esta guía explican cómo utilizar la consola de
administración de AWS para realizar tareas de la consola de administración de AWS.
• SDK de AWS: si utiliza un lenguaje de programación para el que AWS proporciona un SDK, puede
usar un SDK para obtener acceso a API Gateway. Los SDK simplifican la autenticación, se integran
fácilmente con su entorno de desarrollo y proporcionan acceso a los comandos de API Gateway. Para
obtener más información, consulte Herramientas para Amazon Web Services.
• API de API Gateway V1 y V2: si utiliza un lenguaje de programación para el que no haya un SDK
disponible, consulte la Referencia de la API de Amazon API Gateway versión 1 y la Referencia de la API
de Amazon API Gateway versión 2.
• Interfaz de la línea de comandos de AWS: para obtener más información, consulte Configuración de la
interfaz de la línea de comandos de AWS en la guía del usuario de la interfaz de la línea de comandos
de AWS.
• Herramientas de AWS para Windows PowerShell: para obtener más información, consulte Configuración
de las herramientas de AWS para Windows PowerShell en la guía del usuario de AWS Tools for
Windows PowerShell.
Para que una aplicación llame a los servicios de AWS disponibles públicamente, puede utilizar Lambda
para interactuar con los servicios necesarios y exponer las funciones de Lambda a través de los métodos
de API de API Gateway. AWS Lambda ejecuta el código en una infraestructura informática de alta
disponibilidad. Realiza todos los procesos de ejecución y administración que necesitan los recursos
5
Amazon API Gateway Guía del desarrollador
Cómo comenzar a usar Amazon API Gateway
informáticos. Para habilitar las aplicaciones sin servidor, API Gateway es compatible con las integraciones
de proxy optimizadas (p. 336) con puntos de enlace de AWS Lambda y HTTP.
• Introducción (p. 14), que proporciona una explicación para crear una API HTTP.
• Serverless land, que proporciona videos instructivos.
Una colección de recursos y métodos HTTP que se integran con puntos de enlace HTTP del backend,
funciones de Lambda u otros servicios de AWS. Puede implementar esta colección en una o más
etapas. Normalmente, los recursos de la API están organizados en un árbol de recursos de acuerdo
con la lógica de la aplicación. Cada recurso de la API puede exponer uno o varios métodos de la API
que tienen verbos HTTP únicos admitidos por API Gateway.
API HTTP de API Gateway
Colección de rutas y métodos integrados con los puntos de enlace HTTP de backend o funciones de
Lambda. Puede implementar esta colección en una o más etapas. Cada ruta puede exponer uno o
varios métodos de la API que tienen verbos HTTP únicos admitidos por API Gateway.
API de WebSocket de API Gateway
Una colección de rutas y claves de ruta de WebSocket que se integran con puntos de enlace HTTP
del backend, funciones de Lambda u otros servicios de AWS. Puede implementar esta colección en
una o más etapas. Los métodos de la API se invocan a través de conexiones WebSocket del frontend
que se pueden asociar a un nombre de dominio personalizado registrado.
Implementación de API
Una instantánea de un momento dado de la API de API Gateway. Para que los clientes puedan utilizar
la implementación, esta debe asociarse a una o más etapas de API.
Desarrollador de la API
Su cuenta de AWS que posee una implementación de API Gateway (por ejemplo, un proveedor de
servicios que también admite el acceso mediante programación).
Punto de enlace de la API
Un nombre de host para una API de API Gateway que se implementa en una región específica.
El nombre de host tiene el formato {api-id}.execute-api.{region}.amazonaws.com. Se
admiten los siguientes tipos de puntos de enlace de API:
6
Amazon API Gateway Guía del desarrollador
Conceptos de API Gateway
Cadena alfanumérica que API Gateway utiliza para identificar a un desarrollador de aplicaciones que
utiliza su API REST o de WebSocket. API Gateway puede generar claves de API en su nombre o
usted puede importarlas desde un archivo CSV. Puede utilizar claves de API junto con autorizadores
de Lambda (p. 305) o planes de uso (p. 574) para controlar el acceso a sus API.
Una referencia lógica a un estado del ciclo de vida de la API (por ejemplo, 'dev', 'prod', 'beta', 'v2'). Las
etapas de API se identifican por un ID y un nombre de etapa de API.
Desarrolladores de aplicaciones
Un creador de aplicaciones que puede tener o no una cuenta de AWS y que interactúa con la API que
usted, el desarrollador de API, ha implementado. Los desarrolladores de aplicaciones son sus clientes.
Un desarrollador de aplicaciones suele identificarse por una clave de API (p. 7).
URL de devolución de llamada
Cuando un cliente nuevo se conecta a través de una conexión WebSocket, se puede llamar a una
integración en API Gateway para almacenar la URL de devolución de llamada del cliente. Esa URL de
devolución de llamada se puede utilizar para enviar mensajes al cliente desde el sistema backend.
Portal para desarrolladores
Una aplicación que permite a los clientes registrarse, encontrar y suscribirse a los productos de API
(planes de uso de API Gateway) ofrecidos por usted, administrar sus claves de API y ver sus métricas
de uso para las API.
Punto de enlace de API optimizada para límites
La interfaz interna de una ruta de API de WebSocket o un método de API REST en API Gateway, en
la que se asignará el cuerpo de una solicitud de ruta o los parámetros y el cuerpo de una solicitud de
método a los formatos requeridos por el backend.
Respuesta de integración
La interfaz interna de una ruta de API de WebSocket o un método de API REST en API Gateway, en
la que se asignarán los códigos de estado, los encabezados y la carga que se reciben del backend al
formato de respuesta que se devuelve a una aplicación cliente.
Plantilla de asignación
Un script escrito en Velocity Template Language (VTL), que transforma un cuerpo de la solicitud del
formato de datos del frontend al formato de datos del backend o viceversa (en el caso del cuerpo de
la respuesta). Las plantillas de asignación se pueden especificar en la solicitud de integración o en la
7
Amazon API Gateway Guía del desarrollador
Conceptos de API Gateway
respuesta de integración. Pueden hacer referencia a datos disponibles en tiempo de ejecución como
contexto y variables de etapa.
La asignación puede ser tan sencilla como una transformación de identidad que transfiere los
encabezados o el cuerpo a través de la integración tal cual desde el cliente al backend para una
solicitud. Lo mismo sucede con la respuesta, en la que la carga se transmite desde el backend al
cliente.
Solicitud de método
La interfaz pública de un método de una API de API Gateway que define los parámetros y el cuerpo
que un desarrollador de aplicaciones debe enviar en las solicitudes para acceder al backend a través
de la API.
Respuesta de método
La interfaz pública de una API de REST que define los códigos de estado, los encabezados y los
modelos de cuerpo que un desarrollador de aplicaciones debería esperar en las respuestas de la API.
Integración simulada
En una integración simulada, las respuestas de la API se generan directamente a partir de API
Gateway, sin necesidad de un backend de integración. Como desarrollador de una API, puede decidir
cómo API Gateway responde a una solicitud de integración simulada. Para ello, configura la solicitud
de integración y la respuesta de integración del método para asociar una respuesta a un código de
estado determinado.
Modelo
Un esquema de datos que especifica la estructura de datos de una solicitud o carga de respuesta.
Es necesario un modelo para generar un SDK con establecimiento inflexible de tipos de una API.
También se utiliza para validar cargas. Un modelo es cómodo para generar una plantilla de asignación
de muestra para iniciar la creación de una plantilla de asignación de producción. Aunque es útil, no se
requiere para crear una plantilla de asignación.
API privado
Un punto de enlace de API que se expone a través de puntos de enlace de la VPC de tipo interfaz y
permite que un cliente obtenga acceso seguro a los recursos de una API privada dentro de una VPC.
Las API privadas están aisladas de la red pública de Internet y solo se puede obtener acceso a ellas a
través de los puntos de enlace de la VPC de API Gateway a los que se les ha concedido acceso.
Integración privada
Tipo de integración de API Gateway que permite que un cliente tenga acceso a los recursos que se
encuentran en la VPC de un usuario a través de un punto de enlace de una API REST privada sin
exponerlos a la red pública de Internet.
Integración de proxy
Una configuración simplificada de integración de API Gateway. Puede configurar una integración de
proxy como una integración de proxy HTTP o como una integración de proxy de Lambda.
En el caso de la integración de proxy HTTP, API Gateway transmite toda la solicitud y la respuesta
entre el frontend y un backend HTTP. Para la integración de proxy Lambda, API Gateway envía
toda la solicitud como entrada a una función de Lambda de backend. A continuación, API Gateway
transforma el resultado de la función de Lambda en una respuesta HTTP del frontend.
En las API de REST, la integración de proxy se utiliza normalmente con un recurso de proxy, que
se representa mediante una variable de ruta expansiva (por ejemplo, {proxy+}) combinada con un
método catch-all ANY.
8
Amazon API Gateway Guía del desarrollador
Elección entre API HTTP o API de REST
Creación rápida
Puede utilizar la creación rápida para simplificar la creación de una API HTTP. La creación rápida crea
una API con una integración de Lambda o HTTP, una ruta de método catch-all predeterminada y una
etapa predeterminada configurada para implementar automáticamente los cambios. Para obtener más
información, consulte the section called “Crear una API HTTP mediante la CLI de AWS” (p. 180).
Punto de enlace de API regional
El nombre de host de una API implementada en la región especificada y pensada para prestar servicio
a clientes, como, por ejemplo, instancias EC2, de la misma región de AWS. Las solicitudes de API
se dirigen directamente a la API de API Gateway específica de la región sin pasar por ninguna
distribución de CloudFront. Para las solicitudes destinadas a la misma región, existe un punto de
enlace regional que evita el trayecto innecesario de ida y vuelta a una distribución de CloudFront.
Además, puede aplicar el direccionamiento basado en latencia a los puntos de enlace regionales
para implementar una API en varias regiones con la misma configuración de punto de enlace de
API regional, establecer el mismo nombre de dominio personalizado para cada API implementada y
configurar registros de DNS basados en latencia en Route 53 para dirigir las solicitudes de los clientes
a la región que tiene la mínima latencia.
Se utiliza una ruta de WebSocket en API Gateway para direccionar los mensajes entrantes a una
integración determinada, como una función de AWS Lambda, en función del contenido de los
mensajes. Al definir la API de WebSocket, se especifica un clave de ruta y un backend de integración.
La clave de ruta es un atributo del cuerpo del mensaje. Cuando se encuentra una coincidencia para la
clave de ruta en un mensaje entrante, se invoca el backend de integración.
También se puede establecer una ruta predeterminada para las claves de ruta no coincidentes o para
especificar un modelo de proxy que transfiera el mensaje tal cual a los componentes del backend que
realizan el direccionamiento y procesan la solicitud.
Solicitud de ruta
La interfaz pública de un método de API de WebSocket en API Gateway que define el cuerpo que un
desarrollador de aplicaciones debe enviar en las solicitudes para obtener acceso al backend a través
de la API.
Respuesta de ruta
La interfaz pública de una API de WebSocket que define los códigos de estado, los encabezados y los
modelos de cuerpo que un desarrollador de aplicaciones debería esperar de API Gateway.
Plan de uso
Un plan de uso (p. 574) ofrece a determinados clientes de la API acceso a una o varias API de
WebSocket o de REST implementadas. Puede utilizar un plan de uso para configurar la limitación
controlada y los límites de cuota que se ejecutarán en claves de API de cliente individual.
Conexión WebSocket
API Gateway mantiene una conexión persistente entre los clientes y API Gateway. No hay conexión
persistente entre API Gateway y las integraciones de backend, como las funciones de Lambda. Los
servicios de backend se invocan según sea necesario, en función del contenido de los mensajes
recibidos de los clientes.
Las API HTTP se diseñan para integraciones rentables y de baja latencia con servicios de AWS, incluido
AWS Lambda y puntos de enlace HTTP. Las API HTTP admiten la autorización de OIDC y OAuth 2.0 e
incluyen soporte integrado para CORS e implementaciones automáticas. Las API REST de generación
anterior ofrecen más funciones actualmente.
En las siguientes tablas se resumen las características principales disponibles en las API HTTP y las API
de REST.
AWS Lambda ✓ ✓
IAM ✓ ✓
Amazon Cognito ✓* ✓
HTTP ✓ ✓
Lambda ✓ ✓
Servicios de AWS ✓ ✓
Integración privada ✓ ✓
Simulada ✓
Planes de uso ✓
Claves de API ✓
Nombres de dominio ✓* ✓
personalizados
Almacenamiento en caché de la ✓
API
Transformación de solicitudes ✓ ✓
Validación de solicitudes/ ✓
respuestas
Invocación de prueba ✓
10
Amazon API Gateway Guía del desarrollador
Precios de API Gateway
Configuración de CORS ✓ ✓*
Implementaciones automáticas ✓
Etapa predeterminada ✓
Ruta predeterminada ✓
Respuestas de gateway ✓
personalizadas (p. 438)
* Puede combinar diferentes características de las API de REST para que admitan CORS. Para obtener
más información, consulte the section called “CORS” (p. 445).
AWS WAF ✓
Políticas de recursos ✓
Regional ✓ ✓
Private ✓
Registros de ejecución ✓
AWS X-Ray ✓
11
Amazon API Gateway Guía del desarrollador
Precios de API Gateway
• El almacenamiento en caché de API en Amazon API Gateway no está disponible en la Capa gratuita de
AWS.
• Las solicitudes no se cobran por errores de autorización y autenticación.
• Las llamadas a métodos que requieran claves de API no se cobrarán si faltan las claves de API o no son
válidas.
• Las solicitudes limitadas por API Gateway no se cobran si la tasa de solicitudes o de ráfagas supera los
límites preconfigurados.
• Las solicitudes de uso limitadas por el plan no se cobran si los límites de tarifa o la cuota superan los
límites preconfigurados.
12
Amazon API Gateway Guía del desarrollador
Como práctica recomendada, también debe crear un usuario de AWS Identity and Access Management
(IAM) con permisos de administrador y utilizarlo para todo el trabajo que no requiera credenciales raíz.
Cree una contraseña para el acceso a la consola y claves de acceso para utilizar herramientas de línea de
comandos. Consulte Creación del primer grupo y usuario de administrador de IAM en la Guía del usuario
de IAM para obtener instrucciones.
13
Amazon API Gateway Guía del desarrollador
Paso 1: Crear una función Lambda
En primer lugar, crea una función de Lambda con la consola de AWS Lambda. A continuación, crea una
API HTTP mediante la consola de API Gateway. Luego, invoca su API.
Cuando invoca su API HTTP, API Gateway enruta la solicitud a su función de Lambda. Lambda ejecuta la
función de Lambda y devuelve una respuesta a API Gateway. API Gateway, a continuación, le devuelve
una respuesta.
Para completar este ejercicio, necesita una cuenta de AWS y un usuario de AWS Identity and Access
Management con acceso a la consola. Para obtener más información, consulte Requisitos previos (p. 13).
Temas
• Paso 1: Crear una función Lambda (p. 14)
• Paso 2: crear una API HTTP (p. 15)
• Paso 3: probar la API (p. 15)
• (Opcional) Paso 4: limpiar (p. 16)
• Pasos siguientes (p. 17)
La función de ejemplo devuelve una 200 respuesta a los clientes y el texto Hello from Lambda!.
14
Amazon API Gateway Guía del desarrollador
Paso 2: crear una API HTTP
Puede modificar su función de Lambda, siempre y cuando la respuesta de la función se alinea con el
formato que requiere API Gateway (p. 194).
La API HTTP proporciona un punto de enlace HTTP para su función de Lambda. API Gateway enruta las
solicitudes a su función de Lambda y, a continuación, devuelve la respuesta de la función a los clientes.
Ahora ha creado una API HTTP con una integración de Lambda que está lista para recibir solicitudes de
clientes.
15
Amazon API Gateway Guía del desarrollador
(Opcional) Paso 4: limpiar
2. Elija la API.
3. Tenga en cuenta la URL de invocación de la API.
16
Amazon API Gateway Guía del desarrollador
Pasos siguientes
Pasos siguientes
Para este ejemplo, utilizó la consola de administración de AWS para crear una API HTTP simple. La API
HTTP invoca una función de Lambda y devuelve una respuesta a los clientes.
A continuación se indican los pasos siguientes a medida que continúa trabajando con API Gateway.
• Configure tipos adicionales de integraciones de API, (p. 190) entre los que se incluyen:
• Puntos de enlace HTTP (p. 195)
• Recursos privados en una VPC, como los servicios ECS de Amazon (p. 201)
• Servicios de AWS como Amazon Simple Queue Service, AWS Step Functions y Kinesis Data
Streams (p. 195)
• Controlar el acceso a las API (p. 182)
• Habilitar el registro de las API (p. 226)
• Configurar la limitación de las API (p. 220)
• Configurar dominios personalizados para las API (p. 217)
Para obtener ayuda de la comunidad con Amazon API Gateway, consulte el foro de debate de API
Gateway. Cuando entre en este foro, es posible que AWS requiera que inicie sesión.
Para obtener ayuda sobre API Gateway directamente en AWS, consulte las distintas opciones de soporte
que se ofrecen en la página de AWS Support.
17
Amazon API Gateway Guía del desarrollador
Tutoriales sobre API HTTP
• Tutorial: Creación de una API CRUD con Lambda y DynamoDB (p. 18)
• Desarrollo de una API de REST de API Gateway con integración Lambda (p. 26)
• Tutorial: Crear una API de REST importando un ejemplo (p. 43)
• Desarrollo de una API de REST de API Gateway con integración HTTP (p. 51)
• Tutorial: Crear una API REST con la integración privada de API Gateway (p. 87)
• Tutorial: Creación de una API de REST de API Gateway con integración de AWS (p. 89)
• Tutorial: Crear una API REST Calc con dos integraciones de servicios de AWS y una integración de
Lambda sin proxy (p. 94)
• Tutorial: Crear una API de REST como proxy de Amazon S3 en API Gateway (p. 113)
• Tutorial: Creación de una API de REST como proxy de Amazon Kinesis en API Gateway (p. 139)
Talleres
Temas
• Tutorial: Creación de una API CRUD con Lambda y DynamoDB (p. 18)
18
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
proporciona un rendimiento rápido y predecible, así como una escalabilidad óptima. Completar este tutorial
lleva aproximadamente 30 minutos y puede hacerse dentro de la capa gratuita de AWS.
En primer lugar, se crea una tabla de DynamoDB con la consola de DynamoDB. Luego, se crea una
función de Lambda con la consola de AWS Lambda. A continuación, crea una API HTTP mediante la
consola de API Gateway. Por último, se prueba la API.
Cuando invoca su API HTTP, API Gateway enruta la solicitud a su función de Lambda. La función
de Lambda interactúa con DynamoDB y devuelve una respuesta a API Gateway. API Gateway, a
continuación, le devuelve una respuesta.
Para completar este ejercicio, necesita una cuenta de AWS y un usuario de AWS Identity and Access
Management con acceso a la consola. Para obtener más información, consulte Requisitos previos (p. 13).
En este tutorial, se utiliza la consola de administración de AWS. Para obtener una plantilla de AWS SAM
que cree esta API y todos los recursos relacionados, consulte template.yaml.
Temas
• Paso 1: crear una tabla de DynamoDB (p. 19)
• Paso 2: crear una función de Lambda (p. 19)
• Paso 3: crear una API HTTP (p. 21)
• Paso 4: crear rutas (p. 21)
• Paso 5: crear una integración (p. 22)
• Paso 6: asociar la integración a las rutas (p. 23)
• Paso 7: probar la API (p. 24)
• Paso 8: Eliminar (p. 25)
• Próximos pasos: automatizar con AWS SAM o AWS CloudFormation (p. 26)
Cada elemento tiene un ID único, que usamos como clave de partición para la tabla.
19
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
cómo interactuar con DynamoDB. Para simplificar el proceso, este tutorial utiliza una sola función de
Lambda. Como práctica recomendada, se deben crear funciones separadas para cada ruta.
Para simplificar el proceso, este tutorial utiliza una política administrada. Como práctica
recomendada, se deben crear políticas de IAM propias para conceder los permisos mínimos
requeridos.
8. Elija Create function (Crear función).
9. Abra index.js en el editor de código de la consola y reemplace su contenido con el siguiente código.
Seleccione Deploy (Implementar) para actualizar la función.
try {
switch (event.routeKey) {
case "DELETE /items/{id}":
await dynamo
.delete({
TableName: "http-crud-tutorial-items",
Key: {
id: event.pathParameters.id
}
})
.promise();
body = `Deleted item ${event.pathParameters.id}`;
break;
case "GET /items/{id}":
body = await dynamo
.get({
TableName: "http-crud-tutorial-items",
Key: {
id: event.pathParameters.id
}
})
.promise();
20
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
break;
case "GET /items":
body = await dynamo.scan({ TableName: "http-crud-tutorial-items" }).promise();
break;
case "PUT /items":
let requestJSON = JSON.parse(event.body);
await dynamo
.put({
TableName: "http-crud-tutorial-items",
Item: {
id: requestJSON.id,
price: requestJSON.price,
name: requestJSON.name
}
})
.promise();
body = `Put item ${requestJSON.id}`;
break;
default:
throw new Error(`Unsupported route: "${event.routeKey}"`);
}
} catch (err) {
statusCode = 400;
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,
body,
headers
};
};
21
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
• GET /items/{id}
• GET /items
• PUT /items
• DELETE /items/{id}
22
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
Todas las rutas muestran que se asoció una integración de AWS Lambda.
Ahora que se tiene una API HTTP con rutas e integraciones, se puede probar la API.
23
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
• Utilice el siguiente comando para crear o actualizar un elemento. El comando incluye un cuerpo de
solicitud con el ID, el precio y el nombre del elemento.
curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items
24
Amazon API Gateway Guía del desarrollador
API CRUD con Lambda y DynamoDB
curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items/abcdef234
curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items
Paso 8: Eliminar
Para evitar costos innecesarios, elimine los recursos creados como parte de este ejercicio introductorio.
Los siguientes pasos eliminan la API HTTP, la función de Lambda y los recursos asociados.
25
Amazon API Gateway Guía del desarrollador
Tutoriales sobre API REST
Por ejemplo, plantillas de AWS CloudFormation, consulte el ejemplo de plantillas de AWS CloudFormation.
Temas
• Desarrollo de una API de REST de API Gateway con integración Lambda (p. 26)
• Tutorial: Crear una API de REST importando un ejemplo (p. 43)
• Desarrollo de una API de REST de API Gateway con integración HTTP (p. 51)
• Tutorial: Crear una API REST con la integración privada de API Gateway (p. 87)
• Tutorial: Creación de una API de REST de API Gateway con integración de AWS (p. 89)
• Tutorial: Crear una API REST Calc con dos integraciones de servicios de AWS y una integración de
Lambda sin proxy (p. 94)
• Tutorial: Crear una API de REST como proxy de Amazon S3 en API Gateway (p. 113)
• Tutorial: Creación de una API de REST como proxy de Amazon Kinesis en API Gateway (p. 139)
Con la integración de proxy de Lambda, la entrada para la función de Lambda integrada se puede expresar
como cualquier combinación de encabezados de solicitud, variables de ruta, parámetros de cadena de
consulta y cuerpo. Además, la función de Lambda puede utilizar los valores de configuración de la API
para influir en su lógica de ejecución. Para un desarrollador de API, la configuración de una integración
de proxy de Lambda es sencilla. Además de elegir una función de Lambda específica en una región
determinada, no hay mucho que pueda hacer. API Gateway configura la solicitud de integración y la
respuesta de integración por usted. Una vez configurado, el método de API integrado puede evolucionar
con el backend sin modificar la configuración existente. Esto es posible porque el desarrollador de la
función de Lambda del backend analiza los datos de la solicitud entrante y responde al cliente con los
resultados deseados cuando todo va bien o con mensajes de error cuando algo va mal.
26
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
la API, debe asignar los datos de entrada que el cliente proporcionó como parámetros de solicitud en el
cuerpo de solicitud de integración adecuado. Es posible que también deba traducir el cuerpo de solicitud
proporcionado por el cliente a un formato reconocido por la función de Lambda.
Temas
• Tutorial: Desarrollo de una API de REST Hello World con integración de proxy de Lambda (p. 27)
• Tutorial: Desarrollo de una API de REST de API Gateway con integración de proxy de Lambda entre
cuentas (p. 32)
• Tutorial: Desarrollo de una API de REST de API Gateway con integración no de proxy de
Lambda (p. 34)
• Creación de una función Hello, World! Función de Lambda para que sea el backend de la API.
• Creación y prueba de una función "Hello, World!" API con integración de proxy de Lambda.
Temas
• Creación de una función Hello, World! Lambda function (p. 27)
• Creación de una función Hello, World! API (p. 29)
• Implementación y pruebas de API (p. 30)
{
"greeting": "Good {time}, {name} of {city}.[ Happy {day}!]"
}
27
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
'use strict';
console.log('Loading hello world function');
if (event.body) {
let body = JSON.parse(event.body)
if (body.time)
time = body.time;
}
let responseBody = {
message: greeting,
input: event
};
28
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
3. Cree una API vacía tal y como se indica a continuación:
a. En Create new API (Crear nueva API), elija New API (Nueva API).
b. En Settings (Configuración):
d. Deje Integration type (Tipo de integración) establecido en Lambda Function (Función de Lambda).
e. Seleccione Use Lambda Proxy integration (Usar integración de proxy de Lambda).
f. Desde el menú desplegable Lambda Region (Región de Lambda), seleccione la región en la que
ha creado la función de Lambda GetStartedLambdaProxyIntegration.
g. En el campo Lambda Function (Función de Lambda), escriba cualquier carácter y elija
GetStartedLambdaProxyIntegration en el menú desplegable.
h. Deje la casilla Use Default Timeout (Usar tiempo de espera predeterminado) desactivada.
i. Seleccione Save.
j. Elija OK (Aceptar) cuando se le solicite Add Permission to Lambda Function (Agregar permiso a la
función de Lambda).
Uso del navegador y cURL para probar una API con integración de proxy de Lambda
Para probar solicitudes GET utilizando solo los parámetros de cadenas de consulta, puede escribir la
URL para el recurso helloworld de la API en la barra de direcciones del navegador. Por ejemplo:
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle
Para otros métodos, debe utilizar utilidades de prueba de la API de REST más avanzadas, tales como
POSTMAN o cURL. En este tutorial se utiliza cURL. Los ejemplos de comandos de cURL que aparecen a
continuación se presupone que cURL está instalado en su equipo.
curl -v -X POST \
'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?
name=John&city=Seattle' \
-H 'content-type: application/json' \
-H 'day: Thursday' \
-d '{ "time": "evening" }'
Note
30
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
Debería recibir una respuesta correcta con una carga similar a la siguiente:
{
"message":"Good evening, John of Seattle. Happy Thursday!",
"input":{
"resource":"/helloworld",
"path":"/helloworld",
"httpMethod":"POST",
"headers":{"Accept":"*/*",
"content-type":"application/json",
"day":"Thursday",
"Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com",
"User-Agent":"curl/7.64.0",
"X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6",
"X-Forwarded-For":"72.21.198.64",
"X-Forwarded-Port":"443",
"X-Forwarded-Proto":"https"},
"multiValueHeaders":{"Accept":["*/*"],
"content-type":["application/json"],
"day":["Thursday"],
"Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"],
"User-Agent":["curl/0.0.0"],
"X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"],
"X-Forwarded-For":["11.22.333.44"],
"X-Forwarded-Port":["443"],
"X-Forwarded-Proto":["https"]},
"queryStringParameters":{"city":"Seattle",
"name":"John"
},
"multiValueQueryStringParameters":{
"city":["Seattle"],
"name":["John"]
},
"pathParameters":null,
"stageVariables":null,
"requestContext":{
"resourceId":"3htbry",
"resourcePath":"/helloworld",
"htt* Connection #0 to host r275xc9bmd.execute-api.us-east-1.amazonaws.com left intact
pMethod":"POST",
"extendedRequestId":"a1b2c3d4e5f6g7h=",
"requestTime":"20/Mar/2019:20:38:30 +0000",
"path":"/test/helloworld",
"accountId":"123456789012",
"protocol":"HTTP/1.1",
"stage":"test",
"domainPrefix":"r275xc9bmd",
"requestTimeEpoch":1553114310423,
"requestId":"test-invoke-request",
"identity":{"cognitoIdentityPoolId":null,
"accountId":null,
"cognitoIdentityId":null,
"caller":null,
"sourceIp":"test-invoke-source-ip",
"accessKey":null,
"cognitoAuthenticationType":null,
"cognitoAuthenticationProvider":null,
"userArn":null,
31
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
"userAgent":"curl/0.0.0","user":null
},
"domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com",
"apiId":"r275xc9bmd"
},
"body":"{ \"time\": \"evening\" }",
"isBase64Encoded":false
}
}
Si cambia POST a PUT en la solicitud de método anterior, debería recibir la misma respuesta.
Para probar el método GET, copie el siguiente comando cURL y péguelo en la ventana de terminal,
sustituyendo r275xc9bmd por el ID de la API de la API y us-east-1 por la región en la que se
implementa la API.
curl -X GET \
'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?
name=John&city=Seattle' \
-H 'content-type: application/json' \
-H 'day: Thursday'
Debería obtener una respuesta similar al resultado de la solicitud POST anterior, con la salvedad de que la
solicitud GET no tiene ninguna carga. Entonces, el parámetro body será null.
En esta sección mostramos cómo configurar una integración de proxy de Lambda entre cuentas con la
consola de Amazon API Gateway.
En primer lugar, crearemos la API de ejemplo del tema the section called “Tutorial: Crear una API de REST
importando un ejemplo” (p. 43) en una cuenta. A continuación, crearemos una función de Lambda en
otra cuenta. Por último, utilizaremos la integración de Lambda entre cuentas para permitir a la API de
ejemplo utilizar la función de Lambda que hemos creado en la segunda cuenta.
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
3. En Create new API (Crear nueva API), elija Example API (API de ejemplo).
4. Elija Import (Importar) para crear la API de ejemplo.
32
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
1. Inicie sesión en la consola de Lambda de una cuenta distinta de la que utilizó para crear la API de API
Gateway.
2. Elija Create function (Crear función).
3. Elija Author from scratch (Crear desde cero).
4. En Author from scratch (Crear desde cero), haga lo siguiente:
Si está configurando un autorizador entre regiones y cuentas, el valor sourceArn que se agrega
a la función de destino debe utilizar la región de la función, no la región de la API.
33
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
10. Copie y pegue la cadena de comandos aws lambda add-permission en una ventana de la CLI de
AWS configurada para la segunda cuenta. Esto concederá a su primera cuenta acceso a la función de
Lambda de la segunda cuenta.
11. En el mensaje emergente del paso anterior, haga clic en OK (Aceptar).
12. Para ver la política actualizada para la función en la consola de Lambda:
Debería ver una política Allow con una cláusula Condition en la que AWS:SourceArn es el ARN
del método GET de la API.
Para facilitar el aprendizaje, elegimos una función de Lambda sencilla con una configuración de API
mínima para guiarlo para desarrollar una API de API Gateway con la integración de Lambda personalizada.
Cuando sea necesario, describiremos parte de la lógica. Para ver un ejemplo más detallado de la
integración de Lambda personalizada, consulte Tutorial: Crear una API REST Calc con dos integraciones
de servicios de AWS y una integración de Lambda sin proxy (p. 94).
Antes de crear la API, configure el backend de Lambda creando una función de Lambda en AWS Lambda,
lo cual se describe a continuación.
Temas
• Creación de una función de Lambda para la integración de Lambda no de proxy (p. 34)
• Creación de una API con la integración de Lambda no de proxy (p. 38)
• Prueba que invoca el método de API (p. 40)
• Implementar la API (p. 41)
• Pruebe la API en una etapa de implementación (p. 42)
• Eliminar recursos (p. 43)
En este paso creará una función de Lambda del tipo "Hello, World!" para la integración personalizada de
Lambda. En esta tutorial, la función se denomina GetStartedLambdaIntegration.
'use strict';
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
34
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
console.log('Loading function');
// Generate a greeting
let greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. ';
if (day) greeting += 'Happy ' + day + '!';
Para la integración de Lambda personalizada, API Gateway transmite la entrada a la función de Lambda
del cliente como cuerpo de solicitud de integración. El objeto event de gestión de la función de Lambda es
la entrada.
Nuestra función de Lambda es simple. Analiza el objeto de entrada event para las propiedades name,
city, time y day. Entonces, devuelve un saludo, como un objeto JSON de {"message":greeting},
al intermediario. El mensaje se encuentra en el patrón "Good [morning|afternoon|day], [name|
you] in [city|World]. Happy day!". Se supone que la entrada a la función de Lambda es del
siguiente objeto JSON:
{
"city": "...",
"time": "...",
"day": "...",
"name" : "..."
}
Para obtener más información, consulte la guía para desarrolladores de AWS Lambda.
Si configura la API sin utilizar la consola de API Gateway (por ejemplo, si importa una API de un archivo
de OpenAPI), tendrá que crear de forma explícita, si es necesario, y configurar un rol y una política de
invocación para que API Gateway invoque las funciones de Lambda. Para obtener más información sobre
cómo configurar los roles de ejecución e invocación de Lambda para una API de API Gateway, consulte
Control del acceso a una API con permisos de IAM (p. 287).
35
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
• Si aparece la página de bienvenida, elija Get Started Now (Empezar ahora) y, a continuación, elija
Create function (Crear función).
• Si aparece la página de lista Lambda > Functions (Lambda > Funciones), elija Create function
(Crear función).
3. Elija Author from scratch.
4. En el panel Author from scratch (Crear desde cero), haga lo siguiente:
a. Copie el código de la función de Lambda que aparece al comienzo de esta sección y péguelo en
el editor del código en línea.
b. Deje las opciones predeterminadas para todos los demás campos en esta sección.
c. Elija Deploy (Implementar).
6. Para probar la función recién creada, elija Configure test events (Configurar eventos de prueba) en
Select a test event... (Seleccionar un evento de prueba...).
a. En Create new event (Crear nuevo evento), sustituya todas las instrucciones de código
predeterminadas por lo siguiente, escriba HelloWorldTest para el nombre de evento y, a
continuación, elija Create (Crear).
{
"name": "Jonny",
"city": "Seattle",
"time": "morning",
"day": "Wednesday"
}
b. Elija Test (Probar) para invocar la función. Se muestra la sección Execution result: succeeded
(Resultado de ejecución: realizada correctamente). Expanda Detail (Detalles) y verá el siguiente
resultado.
36
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
{
"greeting": "Good morning, Jonny of Seattle. Happy Wednesday!"
}
Como ejercicio secundario, puede utilizar la consola de Lambda para ver el rol de Lambda
(GetStartedLambdaIntegrationRole) creado al crear la función de Lambda. Este rol de IAM posee
dos políticas en línea asociadas. Una de ellas estipula los permisos más básicos para la ejecución de
Lambda. Permite llamar a CreateLogGroup de CloudWatch para cualquier recurso de CloudWatch de
su cuenta en la región donde se crea la función de Lambda. Esta política también permite crear flujos de
CloudWatch y registrar eventos para la función de Lambda HelloWorldForLambdaIntegration.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:region:account-id:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:region:account-id:log-group:/aws/lambda/
GetStartedLambdaIntegration:*"
]
}
]
}
El documento de la otra política se aplica para invocar otro servicio de AWS que no se utiliza en este
ejemplo. Puede omitirla por ahora.
Asociada con el rol de IAM hay una entidad de confianza, que es lambda.amazonaws.com. Aquí se
encuentra la relación de confianza:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
La combinación de esta relación de confianza y la política en línea hace que sea posible para la función de
Lambda invocar una función console.log() para registrar los eventos en CloudWatch Logs.
37
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
Si no utilizó la consola de administración de AWS para crear la función de Lambda, deberá seguir estos
ejemplos para crear el rol y las políticas de IAM requeridas y, a continuación, asociará manualmente el rol
a su función.
Para crear una API con integración de Lambda personalizada con una función de Lambda
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
a. Elija ANY en el menú desplegable del método HTTP. El verbo ANY de HTTP es un marcador para
un método HTTP válido que un cliente envía en el tiempo de ejecución. Este ejemplo muestra que
el método ANY se puede utilizar para la integración de Lambda personalizada y para la integración
de proxy de Lambda.
b. Para guardar la configuración, elija la marca de verificación.
5. En Method Execution (Ejecución del método), para el método /{city} ANY, haga lo siguiente:
38
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
e. Deje la casilla Use Default timeout (Usar tiempo de espera predeterminado) desactivada.
f. Elija Save (Guardar).
g. Elija OK (Aceptar) en la ventana emergente Add Permission to Lambda Function (Agregar
permiso a función de Lambda) para que API Gateway configure los permisos de acceso
necesarios para que la API invoque la función de Lambda integrada.
6. En este paso, configurará lo siguiente:
i. Para definir un modelo, elija Models (Modelos) en la API del panel de navegación primaria de
API Gateway y luego elija Create (Crear).
ii. Escriba GetStartedLambdaIntegrationUserInput en Model name (Nombre del
modelo).
iii. Escriba application/json en Content type (Tipo de contenido).
iv. Deje Model description (Descripción del modelo) en blanco.
v. Copie la siguiente definición de esquema en el editor Model schema (Esquema del modelo):
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "GetStartedLambdaIntegrationInputModel",
"type": "object",
"properties": {
"callerName": { "type": "string" }
}
}
vi. Elija Create model (Crear modelo) para finalizar la definición del modelo de entrada.
vii. Elija Resources (Recursos), elija el método /{city} ANY, elija Method Request (Solicitud
de método) y después expanda Request body (Cuerpo de solicitud). Elija Add model
(Añadir modelo). Escriba application/json en Content type (Tipo de contenido). Elija
GetStartedLambdaIntegrationInput para Model name (Nombre del modelo). Haga clic
en el icono de marca de verificación para guardar la configuración.
7. Elija el método /{city} ANY y elija Integration Request (Solicitud de integración) para configurar
una plantilla de asignación de cuerpo. En este paso asignará el parámetro de solicitud del método
39
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
a. Expanda la sección Mapping Templates (Plantillas de asignación). Elija Add mapping template
(Añadir plantilla de asignación). Escriba application/json para Content-Type. Haga clic en el
icono de marca de verificación para guardar la configuración.
b. En la ventana emergente que aparece, elija Yes, secure this integration (Sí, proteger esta
integración).
c. Consulte el código When there are no templates defined recomendado para Request
body passthrough (Acceso directo al cuerpo de la solicitud).
d. Elija GetStartedLambaIntegrationUserInput en Generate template (Generar plantilla)
para generar una plantilla de asignación inicial. Esta opción está disponible porque definió un
esquema modelo, sin el cual tendría que escribir la plantilla de mapeo desde cero.
e. Reemplace el script de asignación generado el editor de la plantilla de asignación por lo siguiente:
#set($inputRoot = $input.path('$'))
{
"city": "$input.params('city')",
"time": "$input.params('time')",
"day": "$input.params('day')",
"name": "$inputRoot.callerName"
}
POST /Seattle?time=morning
day:Wednesday
{
"callerName": "John"
}
En esta solicitud de prueba, configurará ANY en POST, establecerá {city} en Seattle, asignará
Wednesday como el valor del encabezado day y asignará "John" como el valor callerName.
{
"greeting": "Good morning, John of Seattle. Happy Wednesday!"
40
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
9. También puede ver los registros para ver cómo API Gateway procesa la solicitud y la respuesta.
Los registros muestran la solicitud entrante antes del mapeo y la solicitud de integración después del
mapeo. Cuando una prueba falla, los registros son útiles para evaluar si la entrada original es correcta
o si la plantilla de mapeo funciona correctamente.
Implementar la API
La invocación de prueba es una simulación que tiene limitaciones. Por ejemplo, elude cualquier
mecanismo de autorización promulgado en la API. Para probar la ejecución de la API en tiempo real,
primero debe implementar la API. Para implementar una API, usted crea una etapa para crear una
41
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con la integración de Lambda
snapshot de la API en ese momento. El nombre de etapa también define la ruta de base después del
nombre de host predeterminado de la API. El recurso raíz de la API se agrega después del nombre de la
etapa. Al modificar la API, debe volver a implementarla a una etapa nueva o existente antes de que los
cambios surtan efecto.
1. Elija la API en el panel APIs o elija un recurso o método en el panel Resources (Recursos). Elija
Deploy API (Implementar API) en el menú desplegable Actions (Acciones).
2. En Deployment stage (Etapa de implementación), elija New Stage (Nueva etapa).
3. En Stage name (Nombre de etapa), escriba un nombre, por ejemplo, test.
Note
curl -v -X POST \
'https://beags1mnid.execute-api.us-west-2.amazonaws.com/test/Seattle?time=evening' \
-H 'content-type: application/json' \
-H 'day: Thursday' \
-H 'x-amz-docs-region: us-west-2' \
-d '{
"callerName": "John"
}'
42
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
Eliminar recursos
Si ya no necesita las funciones de Lambda que ha creado para este tutorial, puede eliminarlas ahora.
También puede eliminar los recursos de IAM asociados.
Warning
Si tiene previsto completar el resto de tutoriales de esta serie, no elimine el rol de ejecución de
Lambda ni el rol de invocación de Lambda. Si elimina una función de Lambda que usan sus API,
esas API dejarán de funcionar. La eliminación de una función de Lambda no se puede deshacer.
Si desea utilizar la función de Lambda de nuevo, debe volver a crearla.
Si elimina un recurso de Lambda que usa una función de Lambda, esa función de Lambda dejará
de funcionar y las API que dependen de esa función tampoco funcionarán. La eliminación de un
recurso de IAM no se puede deshacer. Si desea utilizar el recurso de IAM de nuevo, debe volver a
crearlo.
1. Inicie sesión en la consola de administración de AWS y abra la consola de AWS Lambda en https://
console.aws.amazon.com/lambda/.
2. En la lista de funciones, elija GetHelloWorld, elija Actions (Acciones) y, a continuación, Delete function
(Eliminar función). Cuando se le pregunte, elija Delete (Eliminar) otra vez.
3. En la lista de funciones, elija GetHelloWithName, Actions (Acciones) y, a continuación, Delete function
(Eliminar función). Cuando se le pregunte, elija Delete (Eliminar) otra vez.
La API de ejemplo de PetStore admite los siguientes métodos para que un cliente obtenga acceso al sitio
web de backend HTTP de http://petstore-demo-endpoint.execute-api.com/petstore/pets.
• GET /: para leer el acceso del recurso raíz de la API que no se integra con ningún punto de enlace de
backend. API Gateway responde con información general del sitio web PetStore. Este es un ejemplo del
tipo de integración MOCK.
• GET /pets: para obtener acceso de lectura al recurso /pets de la API que se integra con el recurso
/pets de backend asignado. El backend devuelve una página de mascotas disponibles en PetStore.
43
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
Este es un ejemplo del tipo de integración HTTP. La URL del punto de enlace de integración es http://
petstore-demo-endpoint.execute-api.com/petstore/pets.
• POST /pets: para obtener acceso de escritura al recurso /pets de la API que se integra con el recurso
/petstore/pets de backend. Tras recibir una solicitud correcta, el backend agrega la mascota
especificada a PetStore y devuelve el resultado al autor de la llamada. La integración también es HTTP.
• GET /pets/{petId}: para obtener acceso de lectura a una mascota identificada por un valor petId
tal como se especifica en una ruta variable de la URL de solicitud de entrada. Este método también tiene
el tipo de integración HTTP. El backend devuelve la mascota especificada que se encuentra en PetStore.
La URL del punto de enlace HTTP del backend es http://petstore-demo-endpoint.execute-
api.com/petstore/pets/n, donde n es un entero como identificador de la mascota consultada.
La API admite el acceso a CORS a través de los métodos OPTIONS del tipo de integración MOCK. API
Gateway devuelve los encabezados solicitados que admiten el acceso a CORS.
El siguiente procedimiento le guiará por los pasos para crear y probar una API a partir de un ejemplo
mediante la consola de API Gateway.
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
4. En Create new API (Crear nueva API), elija Example API (API de ejemplo) y, a continuación, elija
Import (Importar) para crear la API de ejemplo. Para la primera API, la consola de API Gateway
comienza con esta opción de forma predeterminada.
Puede desplazarse por la definición de OpenAPI para obtener información detallada sobre esta API de
ejemplo antes de elegir Import (Importar).
5. La API recién creada se muestra de la siguiente forma:
44
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
El panel Resources (Recursos) muestra la estructura de la API creada como un árbol de nodos. Los
métodos de API definidos en cada recurso son los extremos del árbol. Cuando se selecciona un
recurso, todos sus métodos se muestran en el panel Methods (Métodos) situado a la derecha. Debajo
de cada método hay un breve resumen del método, incluidos sus requisitos de URL de punto de
enlace, tipo de autorización y clave de API.
6. Para ver los detalles de un método, para modificar su configuración o para probar la invocación del
método, elija el nombre del método en la lista de métodos o en el árbol de recursos. A continuación,
elegimos el POST /pets método como ejemplo:
45
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
El panel resultante Method Execution (Ejecución del método) presenta una vista lógica de la estructura
del método (POST /pets) elegida y los comportamientos: Method Request (Solicitud de método)
y Method Response (Respuesta de método) son la interfaz de la API con el frontend de la API
(un cliente), mientras que Integration Request (Solicitud de integración) e Integration Response
(Respuesta de integración) son la interfaz de la API con el backend (http://petstore-demo-
endpoint.execute-api.com/petstore/pets). Un cliente utiliza la API para obtener acceso
a una característica del backend a través de Method Request (Solicitud de método). API Gateway
traduce la solicitud del cliente, si fuera necesario, a un formato aceptable por el backend en Integration
Request (Solicitud de integración) antes de reenviar la solicitud entrante al backend. La solicitud
transformada se conoce como la solicitud de integración. Del mismo modo, el backend devuelve la
respuesta a API Gateway en Integration Response (Respuesta de integración). A continuación, API
Gateway la dirige a Method Response (Respuesta de método) antes de enviarla al cliente. De nuevo,
si fuera necesario, API Gateway puede asignar los datos de la respuesta del backend a un formulario
previsto por el cliente.
En el caso del método POST de recurso de API, la carga de la solicitud del método puede transmitirse
a través de la solicitud de integración sin modificación si la carga de la solicitud de método está en el
mismo formato que la carga de la solicitud de integración.
La solicitud del método GET / usa el tipo de integración MOCK y no está vinculada a ningún punto
de enlace de backend real. La Integration Response (Respuesta de integración) correspondiente
está configurada para devolver una página HTML estática. Cuando se llama al método, API Gateway
simplemente acepta la solicitud e inmediatamente devuelve la respuesta a la integración configurada
al cliente a través de Method Response (Método de respuesta). Puede utilizar la integración simulada
para probar una API sin requerir un punto de enlace del backend. También puede utilizarla para servir
una respuesta local generada partir de una plantilla de asignación de cuerpo de respuesta.
Como desarrollador de la API, puede controlar los comportamientos de las interacciones del frontend
de la API mediante la configuración de la solicitud de método y una respuesta de método. Puede
controlar los comportamientos de las interacciones del backend de la API mediante la configuración de
la solicitud de integración y la respuesta de integración. Estos comportamientos implican asignaciones
de datos entre un método y su integración correspondiente. Explicaremos cómo configurar un método
en Tutorial: Desarrollo de una API de REST con integración HTTP no de proxy (p. 56). Por el
momento, nos centraremos en probar la API para proporcionar una experiencia de usuario completa.
7. Elija Test (Probar) en Client (Cliente) (tal y como se muestra en la imagen anterior) para comenzar
la prueba. Por ejemplo, para probar el método POST /pets, escriba la siguiente carga {"type":
"dog","price": 249.99} en Request Body (Cuerpo de la solicitud) antes de elegir el botón Test
(Probar).
46
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
47
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
La entrada especifica los atributos de la mascota que deseamos añadir a la lista de mascotas en el
sitio web PetStore.
8. El resultado es el siguiente:
La entrada Logs (Registros) de la salida muestra los cambios de estado de la solicitud del método a la
solicitud de integración y de la respuesta de integración a la respuesta del método. Esto puede resultar
útil para la resolución de errores de asignación que impidan que la solicitud se realice correctamente.
En este ejemplo, la asignación no se aplica: la carga de la solicitud de método se transfiere a través de
48
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
la solicitud integración al backend y, de forma parecida, la respuesta del backend se transfiere a través
de la respuesta de integración al método de respuesta.
Para probar la API con un cliente distinto de la característica test-invoke-request de API Gateway,
primero debe implementar la API en una etapa.
9. Para implementar la API de ejemplo, seleccione la API PetStore y, a continuación, elija Deploy API
(Implementar API) en el menú desplegable Actions (Acciones).
En Deploy API (Implementar API), para Deployment stage (Etapa de implementación), elija [New
Stage] (Nueva etapa) porque esta es la primera implementación de la API. Escriba un nombre (por
ejemplo, test) en Stage name (Nombre de etapa) y, si lo desea, escriba las descripciones en Stage
description (Descripción de etapa) y Deployment description (Descripción de implementación). Elija
Deploy (Implementar).
49
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST importando un ejemplo
En el panel Stage Editor (Editor de etapas) resultante, Invoke URL (URL de invocación) muestra la
dirección URL para invocar la solicitud del método GET / de la API.
10. En Stage Editor (Editor de etapas), siga el enlace Invoke URL (URL de invocación) para enviar la
solicitud del método GET / en un navegador. Una respuesta correcta devuelve el resultado, generado
a partir de la plantilla de asignación de la respuesta de integración.
11. En el panel de navegación Stages (Etapas), expanda la etapa test (prueba), seleccione GET en /
pets/{petId} y, a continuación, copie el valor Invoke URL (URL de invocación) de https://api-
id.execute-api.region.amazonaws.com/test/pets/{petId}. {petId} hace referencia a
una variable de ruta.
Pegue el valor de Invoke URL (URL de invocación) (obtenido en el paso anterior) en la barra de
direcciones de un navegador, sustituyendo {petId} por, por ejemplo, 1 y, a continuación, pulse Intro
para enviar la solicitud. Debería devolverse una respuesta 200 OK con la siguiente carga JSON:
{
"id": 1,
"type": "dog",
"price": 249.99
}
La invocación del método de la API tal como se muestra es posible porque su tipo Authorization
(Autorización) está establecido en NONE. Si se ha utilizado la autorización de AWS_IAM, firmaría la
solicitud con los protocolos Signature Version 4 (SigV4). Para ver un ejemplo de una solicitud de
este tipo, consulte the section called “Tutorial: Desarrollo de una API con integración HTTP no de
proxy” (p. 56).
50
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Temas
• Tutorial: Desarrollo de una API de REST con integración de proxy HTTP (p. 51)
• Tutorial: Desarrollo de una API de REST con integración HTTP no de proxy (p. 56)
Con el amplio recurso de proxy {proxy+} y el verbo catch-all ANY para el método HTTP, puede utilizar
una integración de proxy HTTP para crear una API de un único método de API. El método expone el
conjunto completo de recursos y operaciones HTTP de acceso público de un sitio web. Cuando el servidor
web del backend abre más recursos para acceso público, el cliente puede utilizar estos nuevos recursos
con la misma configuración de API. Para habilitar esto, el desarrollador del sitio web debe comunicar con
claridad al desarrollador del cliente cuáles son los nuevos recursos y cuáles son las operaciones aplicables
para cada uno de ellos.
Como una introducción rápida, el siguiente tutorial demuestra la integración de proxy HTTP. En el tutorial
creamos una API que utiliza la consola de API Gateway para integrarse con el sitio web PetStore mediante
un recurso de proxy genérico {proxy+} y creamos el marcador de posición del método HTTP de ANY.
Temas
• Creación de una API con integración de proxy HTTP con la consola de API Gateway (p. 51)
• Probar una API con la integración de proxy HTTP (p. 54)
Creación de una API con integración de proxy HTTP con la consola de API
Gateway
El siguiente procedimiento le guiará por los pasos para crear y probar una API con un recurso de proxy
para un backend HTTP mediante la consola de API Gateway. El backend HTTP es el PetStore sitio web
51
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Para desarrollar una API con la integración de proxy HTTP con el sitio web PetStore a través de
un recurso de proxy
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
a. Seleccione la opción Configure as proxy resource (Configurar como recurso de proxy) para crear
un recurso de proxy. Si no va a hacerlo, déjelo sin seleccionar.
b. Escriba un nombre en el campo de texto de entrada Resource Name* (Nombre del recurso*).
c. Escriba un nombre en el campo de texto de entrada Resource Path* (Ruta del recurso*).
d. Elija Create Resource (Crear recurso).
e. Seleccione Enable API Gateway CORS (Habilitar CORS de gateway de API), si se requiere.
Para este tutorial, seleccione Configure as proxy resource (Configurar como recurso de proxy).
En Resource Name (Nombre de recurso), use el valor predeterminado, proxy. En Resource Path
(Ruta del recurso), use /{proxy+}. Seleccione Enable API Gateway CORS (Habilitar CORS de API
Gateway).
52
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
4. Para establecer el método ANY para la integración con el backend HTTP, haga lo siguiente:
a. Elija el recurso que acaba de crear y, a continuación, elija Create method (Crear método) del
menú desplegable Actions (Acciones).
b. Elija ANY de la lista desplegable de métodos HTTP y después elija el icono de marca de
verificación para guardar la selección.
c. Elija HTTP Proxy en Integration type (Tipo de integración).
d. Escriba una URL de recurso de backend HTTP en Endpoint URL (URL de punto de enlace).
e. Utilice la configuración predeterminada para el resto de los campos.
f. Elija Save (Guardar) para terminar la configuración del método ANY.
53
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
En la API que se acaba de crear, la ruta del recurso de proxy de la API de {proxy+} se convierte en
el marcador de posición de cualquier punto de enlace del backend bajo http://petstore-demo-
endpoint.execute-api.com/. Por ejemplo, puede ser petstore, petstore/pets y petstore/
pets/{petId}. El método ANY actúa como un marcador de posición para cualquiera de los verbos HTTP
admitidos en tiempo de ejecución.
Por ejemplo, la API de PetStore aquí utilizada no expone el recurso /petstore. Por lo tanto, obtendrá
una respuesta 404 Resource Not Found que contiene el mensaje de error de Cannot GET /
petstore.
Además, el cliente debe tener la posibilidad de gestionar el formato de salida del backend para analizar
los resultados correctamente. API Gateway no realiza mediaciones para facilitar las interacciones entre el
cliente y el backend.
Para probar una API integrada con el sitio web PetStore utilizando la integración de proxy HTTP a
través del recurso de proxy
1. Para usar la consola de API Gateway para probar la llamada a la API, haga lo siguiente.
Para este tutorial, utilice GET para Method (Método) en lugar de ANY, utilice petstore/pets para
Path (Ruta) en lugar de la ruta del recurso de proxy ({proxy}) y type=fish para Query Strings
(Cadenas de consulta).
54
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
55
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Como que el sitio web del backend admite la solicitud GET /petstore/pets?type=fish, devuelve
una respuesta correcta similar a la siguiente:
[
{
"id": 1,
"type": "fish",
"price": 249.99
},
{
"id": 2,
"type": "fish",
"price": 124.99
},
{
"id": 3,
"type": "fish",
"price": 0.99
}
]
Si intenta llamar a GET /petstore, obtendrá una respuesta 404 con un mensaje de error Cannot
GET /petstore. Esto se debe a que el backend no es compatible con la operación especificada. Si
llama a GET /petstore/pets/1, obtendrá una respuesta 200 OK con la siguiente carga, ya que la
solicitud admite el sitio web PetStore.
{
"id": 1,
"type": "dog",
"price": 249.99
}
2. Para usar un explorador que llame a un método GET en un recurso específico de la API, haga lo
siguiente.
a. Si aún no lo ha hecho, elija Deploy API (Implementar API) en el menú desplegable Actions
(Acciones) de la API que ha creado. Siga las instrucciones para implementar la API en un rango
específico. Anote la Invoke URL (URL de invocación) que se muestra en la página Stage Editor
(Editor de fase) resultante. Esta es la URL base de la API.
b. Para enviar una solicitud GET en un recurso específico, anexe la ruta del recurso, incluyendo
posibles expresiones de cadenas de consulta, al valor Invoke URL (URL de invocación) obtenido
en el paso anterior, copie la URL completa en la barra de direcciones de un explorador y presione
Intro.
El resultado debe ser el mismo que el que se devuelve cuando utiliza TestInvoke desde la consola
de API Gateway.
56
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
características de API, para probar su comportamiento, para crear la API y para implementar la API en
etapas.
Temas
• Crear una API con integración de HTTP personalizada (p. 57)
• Asignación de parámetros de solicitudes para una API de API Gateway (p. 66)
• Asignar la carga de respuesta (p. 74)
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
Como resultado, se creará una API vacía. El árbol Resources (Recursos) muestra el recurso raíz (/)
sin métodos. En este ejercicio, vamos a desarrollar la API con la integración HTTP personalizada
del sitio web de PetStore (http://petstore-demo-endpoint.execute-api.com/petstore/pets). Con fines
ilustrativos, crearemos un recurso /pets como un elemento secundario de la raíz y expondremos
un método GET en este recurso para que un cliente pueda recuperar una lista de los elementos Pets
disponibles en el sitio web de PetStore.
3. Para crear el recurso /pets, seleccione la raíz, elija Actions (Acciones) y, a continuación, elija Create
Resource (Crear recurso).
Escriba Pets en Resource Name (Nombre del recurso), deje el valor que aparece en Resource Path
(Ruta de acceso del recurso), seleccione Enable API Gateway CORS (Habilitar API Gateway CORS) y
haga clic en Create Resource (Crear recurso).
57
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
4. Para exponer un método GET en el recurso /pets, elija Actions (Acciones) y después Create Method
(Crear método).
58
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Seleccione GET en la lista situada bajo el nodo del recurso /pets y haga clic en el icono de marca de
verificación para terminar de crear el método.
59
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Note
El método creado aún no está integrado con el backend. Lo haremos en el siguiente paso.
5. En el panel Setup (Configuración) del método, seleccione HTTP para Integration type (Tipo de
integración), seleccione GET en la lista desplegable HTTP method (Método HTTP), escriba http://
petstore-demo-endpoint.execute-api.com/petstore/pets como el valor de Endpoint URL
(URL de punto de enlace), no modifique el resto de campos y, a continuación, elija Save (Guardar).
Note
En el caso del HTTP method (Método HTTP) de la solicitud de integración, debe elegir uno de
los métodos compatibles con el backend. Para HTTP o Mock integration, es razonable
que la solicitud del método y la solicitud de integración usen el mismo verbo HTTP. Para otros
tipos de integración, la solicitud del método usará probablemente un verbo HTTP diferente del
de la solicitud de integración. Por ejemplo, para llamar a una función de Lambda, la solicitud
de integración debe utilizar POST para invocar la función, mientras que la solicitud del método
puede utilizar cualquier verbo HTTP en función de la lógica de la función de Lambda.
60
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Cuando termine de configurar el método, aparecerá el panel Method Execution (Ejecución del
método), donde puede seguir configurando la solicitud del método para añadir parámetros de cadena
de consulta o de encabezados personalizados. También puede actualizar la solicitud de integración
para que asigne los datos de la solicitud del método en el formato requerido por el backend.
El sitio web de PetStore le permite recuperar una lista de elementos Pet por tipo de mascota (por
ejemplo, "Dog" o "Cat") en una determinada página. Utiliza los parámetros de cadena de consulta
type y page para aceptar esta entrada. Por tanto, tenemos que añadir los parámetros de cadena
de consulta a la solicitud del método y asignarlos a las cadenas de consulta correspondientes de la
solicitud de integración.
6. En el panel Method Execution (Ejecución del método) del método GET, elija Method Request
(Solicitud de método), seleccione AWS_IAM para Authorization (Autorización), expanda la sección URL
Query String Parameters (Parámetros de cadena de consulta URL) y elija Add query string (Añadir
cadena de consulta) para crear dos parámetros de cadena de consulta denominados type y page.
Seleccione el icono de marca de verificación para guardar cada uno de los parámetros de cadena de
consulta que acaba de añadir.
61
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
El cliente ahora puede proporcionar un tipo de mascota y un número de página como parámetros de
cadena de consulta cuando envíe una solicitud. Estos parámetros de entrada deben mapearse a los
parámetros de cadena de consulta de la integración para reenviar los valores de entrada a nuestro
sitio web de PetStore en el backend. Como el método utiliza AWS_IAM, debe firmar la solicitud para
invocar el método.
7. En la página Integration Request (Solicitud de integración) del método, expanda la sección URL
Query String Parameters (Parámetros de cadena de consulta URL). De forma predeterminada, los
parámetros de cadena de consulta de la solicitud del método se asignan a los parámetros de cadena
de consulta de la solicitud de integración de igual nombre. Esta asignación predeterminada funciona
para nuestra API de demostración. La dejaremos como está. Para asignar un parámetro de método
de solicitud diferente al parámetro de método de integración correspondiente, haga clic en el icono
de lápiz del parámetro para editar la expresión de asignación, mostrada en la columna Mapped from
(Asignado desde). Para asignar un parámetro de solicitud de método a un parámetro de solicitud de
integración diferente, primero seleccione el icono de eliminación para eliminar el parámetro de solicitud
de integración existente y elija Add query string (Añadir cadena de consulta) para especificar un nuevo
nombre y la expresión de asignación del parámetro de solicitud del método que desee.
62
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Con esto finaliza la creación de esta API sencilla de demostración. Es el momento de probar la API.
8. Para probar la API con la consola de API Gateway, elija Test (Prueba) en el panel Method Execution
(Ejecución de método) del método GET /pets. En el panel Method Test (Prueba del método), escriba
Dog y 2 para las cadenas de consulta type y page, respectivamente y, a continuación, elija Test
(Probar).
El resultado es el siguiente. (Es posible que necesite desplazarse hacia abajo para ver los resultados
de la prueba).
63
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Ahora que la prueba se ha realizado correctamente, podemos implementar la API para ponerla a
disposición del público en general.
9. Para implementar la API, seleccione la API y, a continuación, elija Deploy API (Implementar API) en el
menú desplegable Actions (Acciones).
64
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
En el cuadro de diálogo Deploy API (Implementar API), elija una etapa (o [New Stage] para la
primera implementación de la API); escriba un nombre (por ejemplo, "prueba", "prod", "dev", etc.) en el
campo de entrada Stage name (Nombre de etapa); si lo desea, proporcione una descripción en Stage
description (Descripción de etapa) y/o Deployment description (Descripción de implementación); y
después elija Deploy (Implementar).
65
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Una vez implementada, puede obtener las URL de invocación (Invoke URL) de los puntos de enlace
de la API.
Si el método GET admitiera el acceso abierto (por ejemplo, si el tipo de autorización del método se
hubiera establecido en NONE), podría hacer doble clic en el enlace Invoke URL (URL de invocación)
para invocar el método en su navegador predeterminado. Si fuera necesario, podría también agregar
los parámetros de cadena de consulta necesarios a la URL de invocación. Con el tipo de autorización
de AWS_IAM que se describe aquí, deberá firmar la solicitud con un ID de clave de acceso y la clave
secreta correspondiente de un usuario de IAM de su cuenta de AWS. Para ello, debe utilizar un cliente
que admita los protocolos Signature Version 4 (SigV4). Un ejemplo de este tipo de cliente es una
aplicación que utilice uno de los SDK de AWS o la aplicación Postman o los comandos de cURL. Para
llamar a un método POST, PUT o PATCH que tome una carga, también necesitará un cliente de este
tipo para administrar la carga.
Para invocar este método de API en la extensión Postman, añada los parámetros de cadena de
consulta a la URL de invocación específica de la etapa (tal y como se muestra en la imagen anterior)
para crear la URL de la solicitud de método completa:
https://api-id.execute-api.region.amazonaws.com/test/pets?type=Dog&page=2
Especifique esta URL en la barra de direcciones del navegador. Elija GET como verbo HTTP.
Seleccione AWS Signature para la opción Type (Tipo) bajo la pestaña Authorization (Autorización) y, a
continuación, especifique las siguientes propiedades obligatorias antes de enviar la solicitud:
• En AccessKey, escriba la clave de acceso de AWS del intermediario, aprovisionada desde AWS
IAM.
• En SecretKey, escriba la clave secreta de AWS del intermediario que se aprovisionó desde AWS
IAM cuando se creó la clave de acceso.
• En AWS Region (Región de AWS), escriba la región de AWS donde se va a alojar la API, tal como
se especifica en la URL de invocación.
• En Service Name (Nombre de servicio), escriba execute-api para el servicio de ejecución de API
Gateway.
Si utiliza un SDK para crear un cliente, puede llamar a los métodos expuestos por el SDK para firmar
la solicitud. Para obtener más información, consulte los SDK de AWS que desee.
Note
Cuando se realicen cambios en la API, deberá volver a implementar la API para que las
características nuevas o actualizadas estén disponibles antes de volver a invocar la URL de
la solicitud.
http://petstore-demo-endpoint.execute-api.com/petstore/pets
Si copia la URL anterior, péguela en la barra de direcciones de un navegador web y pulse Enter o
Return; obtendrá el siguiente cuerpo de respuesta con formato JSON:
66
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
[
{
"id": 1,
"type": "dog",
"price": 249.99
},
{
"id": 2,
"type": "cat",
"price": 124.99
},
{
"id": 3,
"type": "fish",
"price": 0.99
}
]
El punto de enlace anterior puede aceptar dos parámetros de consulta: type y page. Por ejemplo, cambie
la URL por lo siguiente:
http://petstore-demo-endpoint.execute-api.com/petstore/pets?type=cat&page=2
Recibirá la siguiente carga de respuesta con formato JSON, en la que se muestra la segunda página solo
con entradas "cat":
[
{
"id": 4,
"type": "cat",
"price": 999.99
},
{
"id": 5,
"type": "cat",
"price": 249.99
},
{
"id": 6,
"type": "cat",
"price": 49.97
}
]
Este punto de enlace admite también el uso de un ID de elemento, expresado mediante un parámetro de
ruta URL. Por ejemplo, busque lo siguiente:
http://petstore-demo-endpoint.execute-api.com/petstore/pets/1
{
"id": 1,
"type": "dog",
"price": 249.99
}
Además de admitir operaciones GET, este punto de enlace acepta solicitudes POST con una carga. Por
ejemplo, utilice Postman para enviar una solicitud de método POST a lo siguiente:
67
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
http://petstore-demo-endpoint.execute-api.com/petstore/pets
{
"type": "dog",
"price": 249.99
}
{
"pet": {
"type": "dog",
"price": 249.99
},
"message": "success"
}
Estas y otras características se exponen ahora mediante el desarrollo de una API de API Gateway con la
integración HTTP personalizada de este sitio web PetStore. Las tareas son las siguientes:
Temas
• Requisitos previos (p. 68)
• Paso 1: Crear recursos (p. 69)
• Paso 2: Crear y probar los métodos (p. 69)
• Paso 3: Implementar la API (p. 72)
• Paso 4: Probar la API (p. 73)
Note
Preste atención al uso de mayúsculas y minúsculas en los pasos de este tutorial. El uso de una
letra minúscula en lugar de una letra mayúscula (o viceversa) puede producir errores más tarde
en el tutorial.
Requisitos previos
68
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
1. Realice los pasos de Requisitos previos para comenzar con API Gateway (p. 13), incluida la
asignación del permiso de acceso de API Gateway al usuario de IAM.
2. Como mínimo, siga los pasos de Tutorial: Desarrollo de una API de REST con integración HTTP no de
proxy (p. 56) para crear una nueva API llamada MyDemoAPI en la consola de API Gateway.
En este paso, creará tres recursos que permitirán a la API interactuar con el punto de enlace HTTP.
1. En el panel Resources (Recursos), seleccione la raíz del recurso, representada por un signo de barra
diagonal inversa (/) y, a continuación, elija Create Resource (Crear recurso) en el menú desplegable
Actions (Acciones).
2. En Resource Name (Nombre de recurso), escriba petstorewalkthrough.
3. En Resource Path (Ruta del recurso), acepte el valor predeterminado de /petstorewalkthrough y, a
continuación, elija Create Resource (Crear recurso).
En este paso, integra los métodos con los puntos de enlace HTTP del backend, mapea el parámetro de la
solicitud de método GET a los parámetros de la solicitud de integración correspondientes y, a continuación,
prueba los métodos.
69
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
1. En el panel Resources (Recursos), elija /petstorewalkthrough/pets, elija Create Method (Crear método)
en el menú Actions (Acciones) y, a continuación, elija GETen /pets en la lista desplegable de nombres
de método.
2. En el panel /petstorewalkthrough/pets - GET - Setup, elija HTTP en Integration type (Tipo de
integración) y elija GET en HTTP method (Método HTTP).
3. En Endpoint URL (URL de punto de enlace), escriba http://petstore-demo-
endpoint.execute-api.com/petstore/pets.
4. Seleccione Save.
5. En el panel Method Execution (Ejecución del método), elija Method Request (Solicitud de método) y, a
continuación, elija la flecha situada junto a URL Query String Parameters (Parámetros de consulta de
cadena URL).
6. Elija Add query string (Añadir cadena de consulta).
7. En Name (Nombre), escriba petType.
Esto asigna el parámetro de consulta petType de la solicitud del método al parámetro de consulta
type de la solicitud de integración.
17. Elija el icono de marca de verificación para terminar de crear el parámetro de cadena de consulta de la
URL de solicitud de integración.
18. Vuelva a elegir Add query string (Añadir cadena de consulta).
19. En Name (Nombre), escriba page. Esto crea los parámetros de cadena de consulta para la URL de la
solicitud de integración.
20. En Mapped from (Asignado desde), escriba method.request.querystring.petsPage.
Esto asigna el parámetro de consulta petsPage de la solicitud del método al parámetro de consulta
page de la solicitud de integración.
21. Elija el icono de marca de verificación para terminar de crear el parámetro de cadena de consulta de la
URL de solicitud de integración.
22. Elija Method Execution (Ejecución del método). En el cuadro Client (Cliente), elija TEST (PROBAR).
En el área Query Strings (Consultas de cadena), para petType, escriba cat. En petsPage, escriba 2.
70
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
23. Elija Test. Si todo sale bien, Response Body (Cuerpo de la respuesta) mostrará lo siguiente:
[
{
"id": 4,
"type": "cat",
"price": 999.99
},
{
"id": 5,
"type": "cat",
"price": 249.99
},
{
"id": 6,
"type": "cat",
"price": 49.97
}
]
Esto asigna el parámetro de ruta de la solicitud del método de petId al parámetro de ruta de la
solicitud de integración de id.
9. Elija el icono de marca de verificación para terminar de crear el parámetro de ruta URL.
10. Elija Method Execution (Ejecución del método) y, en el cuadro Client (Cliente), elija TEST (PROBAR).
En el área Path (Ruta), para petId, escriba 1.
11. Elija Test. Si todo sale bien, Response Body (Cuerpo de la respuesta) mostrará lo siguiente:
71
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
"id": 1,
"type": "dog",
"price": 249.99
}
1. En el panel Resources (Recursos), elija /petstorewalkthrough/pets, elija Create Method (Crear método)
en el menú desplegable Actions (Acciones) y después elija POST como el verbo HTTP del método.
2. En el panel Setup (Configuración), elija HTTP para Integration type (Tipo de integración) y elija POST
para HTTP method (Método HTTP).
3. En Endpoint URL (URL de punto de enlace), escriba http://petstore-demo-
endpoint.execute-api.com/petstore/pets.
4. Seleccione Save.
5. En el panel Method Execution (Ejecución del método), en el cuadro Client (Cliente), elija TEST
(PROBAR). Expanda Request Body (Cuerpo de la solicitud) y, a continuación, escriba lo siguiente:
{
"type": "dog",
"price": 249.99
}
6. Elija Test. Si todo sale bien, Response Body (Cuerpo de la respuesta) mostrará lo siguiente:
{
"pet": {
"type": "dog",
"price": 249.99
},
"message": "success"
}
En este paso, implementará la API para que pueda empezar a llamarla fuera de la consola de API
Gateway.
72
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
1. En el panel Stage Editor (Editor de etapas), junto a Invoke URL (URL de invocación), copie la URL en
el portapapeles. Debe tener un aspecto similar al siguiente:
https://my-api-id.execute-api.region-id.amazonaws.com/test
2. Pegue esta URL en el cuadro de direcciones de una nueva pestaña del navegador.
3. Añada /petstorewalkthrough/pets para que tenga el siguiente aspecto:
https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets
[
{
"id": 1,
"type": "dog",
"price": 249.99
},
{
"id": 2,
"type": "cat",
"price": 124.99
},
{
"id": 3,
"type": "fish",
"price": 0.99
}
]
https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets?
petType=cat&petsPage=2
[
{
"id": 4,
"type": "cat",
"price": 999.99
},
{
"id": 5,
"type": "cat",
"price": 249.99
},
{
"id": 6,
"type": "cat",
"price": 49.97
73
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
}
]
https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets/1
{
"id": 1,
"type": "dog",
"price": 249.99
}
https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets
Content-Type: application/json
{
"type": "dog",
"price": 249.99
}
Por ejemplo, si utiliza la herramienta de línea de comandos de cURL, ejecute un comando similar al
siguiente:
{
"pet": {
"type": "dog",
"price": 249.99
},
"message": "success"
}
74
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
y conceptos de Introducción a la API de API Gateway (p. 14) y Asignación de parámetros de solicitudes
para una API de API Gateway (p. 66). Si aún no ha completado estos tutoriales, le sugerimos que los
complete antes.
Este tutorial utilizará API Gateway para obtener datos de ejemplo de un punto de enlace HTTP accesible
públicamente y de una función de AWS Lambda que creará. Tanto el punto de enlace HTTP como la
función de Lambda devuelven los mismos datos de ejemplo:
[
{
"id": 1,
"type": "dog",
"price": 249.99
},
{
"id": 2,
"type": "cat",
"price": 124.99
},
{
"id": 3,
"type": "fish",
"price": 0.99
}
]
Utilizará modelos y plantillas de asignación para transformar estos datos en uno o varios formatos de
salida. En API Gateway, el modelo define el formato, también conocido como el esquema o la forma,
de algunos datos. En API Gateway se usa una plantilla de mapeo para transformar algunos datos
de un formato en otro. Para obtener más información, consulte Trabajo con modelos y plantillas de
asignación (p. 395).
El primer modelo y plantilla de asignación se utiliza para cambiar el nombre de id a number, de type a
class y de price a salesPrice, como se indica a continuación:
[
{
"number": 1,
"class": "dog",
"salesPrice": 249.99
},
{
"number": 2,
"class": "cat",
"salesPrice": 124.99
},
{
"number": 3,
"class": "fish",
"salesPrice": 0.99
}
]
El segundo modelo y plantilla de asignación se utiliza para combinar id y type en description y para
cambiar el nombre de price a askingPrice, tal y como se indica a continuación:
[
{
"description": "Item 1 is a dog.",
"askingPrice": 249.99
},
75
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
{
"description": "Item 2 is a cat.",
"askingPrice": 124.99
},
{
"description": "Item 3 is a fish.",
"askingPrice": 0.99
}
]
El tercer modelo y plantilla de asignación se utiliza para combinar id, type y price en un conjunto de
listings, como se indica a continuación:
{
"listings": [
"Item 1 is a dog. The asking price is 249.99.",
"Item 2 is a cat. The asking price is 124.99.",
"Item 3 is a fish. The asking price is 0.99."
]
}
Temas
• Paso 1: Crear modelos (p. 76)
• Paso 2: Crear recursos (p. 78)
• Paso 3: Crear métodos GET (p. 79)
• Paso 4: Crear una función de Lambda (p. 80)
• Paso 5: Configurar y probar los métodos (p. 81)
• Paso 6: Implementar la API (p. 84)
• Paso 7: Probar la API (p. 84)
• Paso 8: Eliminar (p. 86)
En este paso, creará cuatro modelos. Los tres primeros modelos representan los formatos de salida de los
datos para su uso con el punto de enlace HTTP y la función de Lambda. El último modelo representa el
esquema de entrada de datos para su uso con la función de Lambda.
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PetsModelNoFlatten",
"type": "array",
"items": {
76
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
"type": "object",
"properties": {
"number": { "type": "integer" },
"class": { "type": "string" },
"salesPrice": { "type": "number" }
}
}
}
1. Seleccione Create.
2. En Model name (Nombre del modelo), escriba PetsModelFlattenSome.
3. En Content type (Tipo de contenido), escriba application/json.
4. En Model description (Descripción del modelo), escriba Combines id and type into
description, and changes price to askingPrice.
5. En Model schema (Esquema del modelo), escriba lo siguiente:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PetsModelFlattenSome",
"type": "array",
"items": {
"type": "object",
"properties": {
"description": { "type": "string" },
"askingPrice": { "type": "number" }
}
}
}
1. Seleccione Create.
2. En Model name (Nombre del modelo), escriba PetsModelFlattenAll.
3. En Content type (Tipo de contenido), escriba application/json.
4. En Model description (Descripción del modelo), escriba Combines id, type, and price into
a set of listings.
5. En Model schema (Esquema del modelo), escriba lo siguiente:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PetsModelFlattenAll",
"type": "object",
"properties": {
"listings": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
77
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
1. Seleccione Create.
2. En Model name (Nombre del modelo), escriba PetsLambdaModel.
3. En Content type (Tipo de contenido), escriba application/json.
4. En Model description (Descripción del modelo), escriba GetPetsInfo model.
5. En Model schema (Esquema del modelo), escriba lo siguiente:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PetsLambdaModel",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "integer" },
"type": { "type": "string" },
"price": { "type": "number" }
}
}
}
En este paso, creará cuatro recursos. Los tres primeros recursos le permitirán obtener los datos de
ejemplo del punto de enlace HTTP en tres formatos de salida. El último recurso le permitirá obtener
los datos de ejemplo de la función de Lambda en el esquema de salida que combina id y type en
description y cambia el nombre de price a askingPrice.
78
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
En este paso, creará un método GET para cada uno de los recursos que ha creado en el paso anterior.
79
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
2. En la lista desplegable, elija GET y después haga clic en el icono de marca de verificación para
guardar la selección.
3. En el panel de configuración, elija HTTP para Integration type (Tipo de integración) y GET para HTTP
method (Método HTTP), escriba http://petstore-demo-endpoint.execute-api.com/
petstore/pets en Endpoint URL (URL de punto de enlace) y, a continuación, elija Save (Guardar).
En este paso creará una función de Lambda que devuelve los datos de ejemplo.
• Si aparece una página de bienvenida, elija Get Started Now (Empezar ahora).
• Si aparece la página de lista Lambda: Function list (Lambda: lista de funciones), elija Create a
Lambda function (Crear una función de Lambda).
3. En Name (Nombre), escriba GetPetsInfo.
4. En Description (Descripción), escriba Gets information about pets.
5. En Code template (Plantilla de código), elija None (Ninguna).
6. Escriba el código siguiente:
console.log('Loading event');
Tip
80
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
Tip
Las llaves vacías indican que no hay valores de entrada para esta función de Lambda. Esta
función simplemente devuelve el objeto JSON que contiene la información de mascotas, por
lo que los pares de clave-valor no son obligatorios aquí.
14. Elija Invoke (Invocar). Execution result (Resultado de ejecución)
muestra[{"id":1,"type":"dog","price":249.99},
{"id":2,"type":"cat","price":124.99},{"id":3,"type":"fish","price":0.99}],
que también se escribe en los archivos de registro de CloudWatch Logs.
15. Elija Go to function list (Ir a al lista de funciones).
En este paso configurará las respuestas del método, la solicitudes de integración y las solicitudes de
respuesta para especificar los esquemas (o modelos) de datos de entrada y salida para los métodos GET
asociados con el punto de enlace HTTP y la función de Lambda. También aprenderá a probar la llamada a
estos métodos con la consola de API Gateway.
#set($inputRoot = $input.path('$'))
{
"listings" : [
#foreach($elem in $inputRoot)
"Item number $elem.id is a $elem.type. The asking price is
$elem.price."#if($foreach.hasNext),#end
#end
]
}
8. Seleccione Save.
9. Elija Method Execution (Ejecución del método), en el cuadro Client (Cliente), elija TEST (PROBAR)
y, a continuación, elija Test (Probar). Si todo sale bien, Response Body (Cuerpo de la respuesta)
mostrará lo siguiente:
{
"listings" : [
81
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
#set($inputRoot = $input.path('$'))
[
#foreach($elem in $inputRoot)
{
"description" : "Item $elem.id is a $elem.type.",
"askingPrice" : $elem.price
}#if($foreach.hasNext),#end
#end
]
8. Elija Method Execution (Ejecución del método), en el cuadro Client (Cliente), elija TEST (PROBAR)
y, a continuación, elija Test (Probar). Si todo sale bien, Response Body (Cuerpo de la respuesta)
mostrará lo siguiente:
[
{
"description" : "Item 1 is a dog.",
"askingPrice" : 249.99
},
{
"description" : "Item 2 is a cat.",
"askingPrice" : 124.99
},
{
"description" : "Item 3 is a fish.",
"askingPrice" : 0.99
}
]
82
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
2. En el panel Method Execution (Ejecución del método), elija Method Response (Respuesta de método).
3. Elija la flecha situada junto a 200.
4. En el área Response Models for 200 (Modelos de respuesta para 200), para application/json, haga clic
en el icono de lápiz. Para Models (Modelos), elija PetsModelFlattenSome y, a continuación, seleccione
el icono de marca de verificación para guardar la opción.
5. Vuelva a Method Execution (Ejecución del método) y elija Integration Response (Respuesta de
integración).
6. Elija la flecha situada junto a 200 para expandir la sección.
7. Expanda el área Mapping Templates (Plantillas de mapeo). Elija application/json para Content-Type.
En Generate template (Generar plantilla), elija PetsModelFlattenSome para mostrar la plantilla de
script de mapeo para la salida de este método.
8. Modifique el código de la siguiente manera:
#set($inputRoot = $input.path('$'))
[
#foreach($elem in $inputRoot)
{
"description": "Item $elem.id is a $elem.type.",
"askingPrice": $elem.price
}#if($foreach.hasNext),#end
#end
]
9. Seleccione Save.
10. Vuelva a Method Execution (Evaluación del método) y elija TEST (PROBAR) en el cuadro Client
(Cliente). Y, a continuación, elija Test (Probar). Si todo sale bien, Response Body (Cuerpo de la
respuesta) mostrará lo siguiente:
[
{
"description": "Item 1 is a dog.",
"askingPrice": 249.99
},
{
"description": "Item 2 is a cat.",
"askingPrice": 124.99
},
{
"description": "Item 3 is a fish.",
"askingPrice": 0.99
}
]
83
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
6. Expanda la sección Mapping Templates (Plantillas de asignación). Elija application/json para Content-
Type. En Generate template (Generar plantilla), elija PetsModelNoFlatten para mostrar la plantilla de
script de mapeo para la salida de este método.
7. Modifique el código de la siguiente manera:
#set($inputRoot = $input.path('$'))
[
#foreach($elem in $inputRoot)
{
"number": $elem.id,
"class": "$elem.type",
"salesPrice": $elem.price
}#if($foreach.hasNext),#end
#end
]
8. Seleccione Save.
9. Vuelva a Method Execution (Ejecución del método) y, en el cuadro Client (Cliente), elija TEST
(PROBAR) y, a continuación, elija Test (Probar). Si todo sale bien, Response Body (Cuerpo de la
respuesta) mostrará lo siguiente:
[
{
"number": 1,
"class": "dog",
"salesPrice": 249.99
},
{
"number": 2,
"class": "cat",
"salesPrice": 124.99
},
{
"number": 3,
"class": "fish",
"salesPrice": 0.99
}
]
En este paso, implementará la API para que pueda empezar a llamarla fuera de la consola de API
Gateway.
En este paso saldrá de la consola de API Gateway para interactuar con el punto de enlace HTTP y la
función de Lambda.
84
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
1. En el panel Stage Editor (Editor de etapas), junto a Invoke URL (URL de invocación), copie la URL en
el portapapeles. Debe tener un aspecto similar al siguiente:
https://my-api-id.execute-api.region-id.amazonaws.com/test
2. Pegue esta URL en el cuadro de direcciones de una nueva pestaña del navegador.
3. Añada /petstorewalkthrough/noflatten para que tenga el siguiente aspecto:
https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/
noflatten
[
{
"number": 1,
"class": "dog",
"salesPrice": 249.99
},
{
"number": 2,
"class": "cat",
"salesPrice": 124.99
},
{
"number": 3,
"class": "fish",
"salesPrice": 0.99
}
]
[
{
"description": "Item 1 is a dog.",
"askingPrice": 249.99
},
{
"description": "Item 2 is a cat.",
"askingPrice": 124.99
},
{
"description": "Item 3 is a fish.",
"askingPrice": 0.99
}
]
{
"listings" : [
"Item number 1 is a dog. The asking price is 249.99.",
"Item number 2 is a cat. The asking price is 124.99.",
"Item number 3 is a fish. The asking price is 0.99."
]
}
85
Amazon API Gateway Guía del desarrollador
Desarrollo de una API con integración de HTTP
[
{
"description" : "Item 1 is a dog.",
"askingPrice" : 249.99
},
{
"description" : "Item 2 is a cat.",
"askingPrice" : 124.99
},
{
"description" : "Item 3 is a fish.",
"askingPrice" : 0.99
}
]
Paso 8: Eliminar
Si ya no necesita la función de Lambda que ha creado para este tutorial, puede eliminarla ahora. También
puede eliminar los recursos de IAM asociados.
Warning
Si elimina una función de Lambda que usan sus API, esas API dejarán de funcionar. La
eliminación de una función de Lambda no se puede deshacer. Si desea utilizar la función de
Lambda de nuevo, debe volver a crearla.
Si elimina un recurso de Lambda que usa una función de Lambda, la función de Lambda y todas
las API que la utilizan dejarán de funcionar. La eliminación de un recurso de IAM no se puede
deshacer. Si desea utilizar el recurso de IAM de nuevo, debe volver a crearlo. Si tiene previsto
continuar experimentando con los recursos que ha creado para este y el resto de tutoriales, no
elimine el rol de invocación de Lambda ni el rol de ejecución de Lambda.
1. Inicie sesión en la consola de administración de AWS y abra la consola de AWS Lambda en https://
console.aws.amazon.com/lambda/.
2. En la página Lambda: Function list (Lambda: lista de funciones), en la lista de funciones, elija el botón
situado junto a GetPetsInfo y, a continuación, elija Actions (Acciones), Delete (Eliminar). Cuando se le
pregunte, elija Delete (Eliminar) otra vez.
86
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración privada
Cuando un cliente llama a la API, API Gateway se conecta al balanceador de carga de red a través del
enlace de VPC preconfigurado. El recurso VpcLink de API Gateway encapsula un enlace de la VPC. Este
es responsable de reenviar las solicitudes del método de API a los recursos de la VPC y devuelve las
respuestas del backend al intermediario. Para los desarrolladores de API, VpcLink es funcionalmente
equivalente a un punto de enlace de integración.
Para crear una API con integración privada, debe crear un nuevo VpcLink (o elegir uno existente)
que esté conectado a un balanceador de carga de red que tenga como destino los recursos de la VPC
deseados. Debe disponer de los permisos adecuados (p. 367) para crear y administrar un VpcLink.
A continuación, deberá configurar un método de la API e integrarlo con VpcLink estableciendo HTTP o
HTTP_PROXY como tipo de integración, VPC_LINK como tipo de conexión de integración y el identificador
VpcLink en el campo connectionId de la integración.
Note
Si desea empezar a crear rápidamente una API que tenga acceso a los recursos de la VPC, le guiaremos
por los pasos esenciales para crear una API con integración privada a través de la consola de API
Gateway. Antes de crear la API, haga lo siguiente:
1. Cree un recurso de la VPC, cree o elija un balanceador de carga de red en una cuenta de la misma
región y agregue la instancia EC2 que aloja el recurso como destino del balanceador de carga de
red. Para obtener más información, consulte Configuración de un balanceador de carga de red para
integraciones privadas de API Gateway (p. 366).
2. Conceda los permisos necesarios para crear los enlaces VPC para integraciones privadas. Para obtener
más información, consulte Concesión de permisos para crear un enlace VPC (p. 367).
Después de crear el recurso de VPC y el balanceador de carga de red con dicho recurso configurado en
sus grupos de destino, siga las instrucciones que se indican a continuación para crear una API e integrarla
con el recurso de la VPC a través de un VpcLink de una integración privada.
Para crear una API con integración privada a través de la consola de API Gateway
a. En el panel de navegación principal, elija VPC Links (Enlaces de VPC) y Create (Crear).
b. Elija VPC link for REST APIs (Vínculo de VPC para API REST).
c. Escriba un nombre y, opcionalmente, una descripción para el vínculo de VPC.
d. Elija un balanceador de carga de red en la lista desplegable Target NLB (NLB de destino).
El balanceador de carga de red ya debe estar creado en la región que la API para que aparezca
en la lista.
e. Seleccione Create (Crear) para empezar a crear el enlace VPC.
87
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración privada
La respuesta inicial devuelve una representación del recurso VpcLink con el ID del enlace VPC y el
estado PENDING. Esto se debe a que la operación es asíncrona y tarda alrededor de 2-4 minutos en
completarse. Una vez que finaliza correctamente, el estado pasa a ser AVAILABLE. Mientras tanto,
puede seguir creando la API.
3. Elija APIs en el panel de navegación principal y haga clic en Create API (Crear API) para crear una
nueva API optimizada para bordes o del tipo punto de enlace regional.
4. En el recurso raíz (/), seleccione Create Method (Crear método) en el menú desplegable Actions
(Acciones) y haga clic en GET.
5. En el panel / GET - Setup, inicialice la integración del método de API del modo siguiente:
Para el balanceador de carga de red (NLB), asegúrese de que utiliza el nombre de DNS
de NLB tal y como se describe en Introducción a Network Load Balancers.
f. Deje el valor Use Default Timeout (Usar tiempo de espera predeterminado) tal y como está, a
menos que desee personalizar los tiempos de espera de la integración.
g. Elija Save (Guardar) para completar la configuración de la integración.
Con la integración del proxy, la API está lista para implementarse. De lo contrario, debe configurar
las respuestas del método y las respuestas de integración apropiadas.
h. En el menú desplegable Actions (Acciones), seleccione Deploy API (Implementar API) y elija una
etapa nueva o existente para implementar la API.
Anote el valor resultante de Invoke URL (URL de invocación). Lo necesitará para invocar la API.
Antes de eso, debe configurar la variable de etapa vpcLinkId.
i. En Stage Editor (Editor de etapas), seleccione la pestaña Stage Variables (Variables de etapa) y
haga clic en Add Stage (Añadir etapa).
Si utiliza la variable de etapa, podrá cambiar fácilmente entre los diferentes enlaces VPC de
la API; solo tendrá que modificar el valor de esta variable.
Aquí termina el proceso de creación de la API. Puede probar a invocarla con otras integraciones.
88
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración de AWS
Todos los servicios de AWS admiten API dedicadas para exponer sus características. Sin embargo, los
protocolos de la aplicación o las interfaces de programación probablemente difieren entre un servicio y
otro. Una API de API Gateway con la integración de AWS tiene la ventaja de proporcionar un protocolo de
aplicación coherente para que su cliente tenga acceso a diferentes servicios de AWS.
En este tutorial, vamos a crear una API para exponer Amazon SNS. Para ver más ejemplos de
integración de una API con otros servicios de AWS, consulte Tutoriales y talleres sobre Amazon API
Gateway (p. 18).
API Gateway no vuelve a intentar las operaciones cuando se agota el tiempo de espera del punto de
enlace. El intermediario de la API debe implementar una lógica de reintentos para administrar los tiempos
de espera del punto de enlace.
Este tutorial se basa en las instrucciones y conceptos de Desarrollo de una API de REST de API Gateway
con integración Lambda (p. 26). Si aún no ha completado ese tutorial, le sugerimos que lo haga
primero.
Temas
• Requisitos previos (p. 89)
• Paso 1: Crear el recurso (p. 90)
• Paso 2: Crear el método GET (p. 90)
• Paso 3: Crear el rol de ejecución del proxy de servicio de AWS (p. 90)
• Paso 4: Especificar la configuración del método y probar el método (p. 92)
• Paso 5: Implementar la API (p. 92)
• Paso 6: Probar la API (p. 93)
• Paso 7: Limpieza (p. 93)
Requisitos previos
Antes de empezar este tutorial, haga lo siguiente:
1. Realice los pasos que se indican en Requisitos previos para comenzar con API Gateway (p. 13).
2. Asegúrese de que el usuario de IAM tenga acceso para crear políticas y roles en IAM. En este tutorial
tendrá que crear una política y un rol de IAM.
89
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración de AWS
3. Cree una nueva API llamada MyDemoAPI. Para obtener más información, consulte Tutorial: Desarrollo
de una API de REST con integración HTTP no de proxy (p. 56).
4. Implemente la API al menos una vez en una etapa denominada test. Para obtener más información,
consulte Implementar la API (p. 41) en Desarrollo de una API de REST de API Gateway con
integración Lambda (p. 26).
5. Realice el resto de los pasos de Desarrollo de una API de REST de API Gateway con integración
Lambda (p. 26).
6. Cree al menos un tema en Amazon Simple Notification Service (Amazon SNS). Utilizará la API
implementada para obtener una lista de temas de Amazon SNS asociados a su cuenta de AWS. Para
obtener información sobre cómo crear un tema en Amazon SNS, consulte Creación de un tema. (No
es necesario que copie el ARN del tema mencionado en el paso 5).
90
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración de AWS
• Si aparece la página Welcome to Managed Policies (Bienvenido a las políticas administradas), elija
Get Started (Empezar) y, a continuación, elija Create Policy (Crear política).
• Si aparece una lista de políticas, elija Create Policy (Crear política).
4. Elija JSON y, a continuación, escriba el texto siguiente.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": [
"*"
],
"Action": [
"sns:ListTopics"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
91
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración de AWS
Para Role ARN (ARN de rol), anote el nombre de recurso de Amazon (ARN) del rol
de ejecución. Lo necesitará más adelante. El ARN debe tener un aspecto similar a:
arn:aws:iam::123456789012:role/APIGatewayAWSProxyExecRole, donde 123456789012
es el ID de su cuenta de AWS.
{
"ListTopicsResponse": {
"ListTopicsResult": {
"NextToken": null,
"Topics": [
{
"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"
},
{
"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"
},
...
{
"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N"
}
]
},
"ResponseMetadata": {
"RequestId": "abc1de23-45fa-6789-b0c1-d2e345fa6b78"
}
}
}
92
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API con integración de AWS
1. En el panel Stage Editor (Editor de etapas), junto a Invoke URL (URL de invocación), copie la URL en
el portapapeles. Debería tener un aspecto similar al siguiente:
https://my-api-id.execute-api.region-id.amazonaws.com/test
https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoawsproxy
{"ListTopicsResponse":{"ListTopicsResult":{"NextToken": null,"Topics":
[{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"},{"TopicArn":
"arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"},...{"TopicArn":
"arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N}]},"ResponseMetadata":
{"RequestId":"abc1de23-45fa-6789-b0c1-d2e345fa6b78}}}
Paso 7: Limpieza
Puede eliminar los recursos de IAM que el proxy de servicio de AWS necesita para funcionar.
Warning
Si elimina un recurso de IAM que utiliza un proxy de servicio de AWS, ese proxy de servicio de
AWS y todas las API que lo utilicen dejarán de funcionar. La eliminación de un recurso de IAM no
se puede deshacer. Si desea utilizar el recurso de IAM de nuevo, debe volver a crearlo.
Ha llegado al final de este tutorial. Para obtener más detalles sobre la creación de una API con un
proxy de servicio de AWS, consulte Tutorial: Crear una API de REST como proxy de Amazon S3 en API
93
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Gateway (p. 113), Tutorial: Crear una API REST Calc con dos integraciones de servicios de AWS y
una integración de Lambda sin proxy (p. 94) o Tutorial: Creación de una API de REST como proxy de
Amazon Kinesis en API Gateway (p. 139).
En este tutorial, creará una función Calc de Lambda que implementa operaciones aritméticas básicas,
aceptando y devolviendo entradas y salidas con formato JSON. A continuación, creará una API REST y la
integrará con la función de Lambda de la siguiente forma:
1. Exponiendo un método GET en el recurso /calc para invocar la función de Lambda, proporcionando
la entrada como parámetros de cadena de consulta. (Integración de AWS Service)
2. Exponiendo un método POST en el recurso /calc para invocar la función de Lambda, proporcionando
la entrada en la carga de la solicitud del método. (Integración de AWS Service)
3. Exponiendo un método GET en recursos /calc/{operand1}/{operand2}/{operator} anidados
para invocar la función de Lambda, proporcionando la entrada como parámetros de ruta. (Integración
de Lambda Function)
Además de probar con este tutorial, sugerimos que estudie el archivo de definición de OpenAPI (p. 109)
para la API de Calc, que puede importar a API Gateway siguiendo las instrucciones de the section called
“OpenAPI” (p. 500).
Temas
• Creación de una cuenta de AWS (p. 94)
• Crear un rol de IAM asumible (p. 95)
• Creación de una función Calc de Lambda (p. 97)
• Probar la función Calc de Lambda (p. 97)
• Cree una API de Calc (p. 99)
• Integración 1: Crear un método GET con parámetros de consulta para llamar a la función de
Lambda (p. 99)
• Integración 2: Crear un método POST con una carga JSON para llamar a la función de
Lambda (p. 101)
• Integración 3: Crear un método GET con parámetros de ruta para llamar a la función de
Lambda (p. 104)
• Definiciones de OpenAPI de una API de ejemplo integrada con una función de Lambda (p. 109)
94
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Si no dispone de una cuenta de AWS, siga estos pasos para crear una.
1. Abra https://portal.aws.amazon.com/billing/signup.
2. Siga las instrucciones en línea.
Parte del procedimiento de inscripción consiste en recibir una llamada telefónica e indicar un código de
verificación en el teclado del teléfono.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
El rol que cree tendrá que tener el permiso InvokeFunction de Lambda. De lo contrario, el intermediario de
la API recibirá una respuesta 500 Internal Server Error. Para dar al rol este permiso, asociará la
siguiente política de IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
95
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Se abrirá una nueva ventana de consola Create Policy (Crear política). En esa ventana, haga lo
siguiente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
96
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
if (isNaN(event.a) || isNaN(event.b)) {
callback("400 Invalid Operand");
}
switch(event.op)
{
case "+":
case "add":
res.c = res.a + res.b;
break;
case "-":
case "sub":
res.c = res.a - res.b;
break;
case "*":
case "mul":
res.c = res.a * res.b;
break;
case "/":
case "div":
res.c = res.b===0 ? NaN : Number(event.a) / Number(event.b);
break;
default:
callback("400 Invalid Operator");
break;
}
callback(null, res);
};
7. Bajo Execution role (Rol de ejecución) elija Choose an existing role (Elegir un rol existente).
97
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Esta función requiere dos operandos (a y b) y un operador (op) del parámetro de entrada event. La
entrada es un objeto JSON con el siguiente formato:
{
"a": "Number" | "String",
"b": "Number" | "String",
"op": "String"
}
Esta función devuelve el resultado calculado (c) y la entrada. Si se trata de una entrada no válida, la
función devuelve el valor null o la cadena "Invalid op" como resultado. La salida tiene el siguiente formato
JSON:
{
"a": "Number",
"b": "Number",
"op": "String",
"c": "Number" | "String"
}
Debe probar la función en la consola de Lambda antes de integrarla con la API en el siguiente paso.
1. En el menú desplegable Saved test events (Eventos de prueba guardados), elija Configure test events
(Configurar eventos de prueba).
2. Para el nombre del evento de prueba, escriba calc2plus5.
3. Sustituya la definición del evento de prueba por lo siguiente:
{
"a": "2",
"b": "5",
"op": "+"
}
4. Seleccione Save.
5. Elija Test.
6. Expanda Execution result: succeeded (Resultado de la ejecución: correcta). Debería ver lo siguiente:
{
"a": 2,
"b": 5,
"op": "+",
98
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
"c": 7
}
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
3. En Create new API (Crear nueva API), elija New API (Nueva API).
4. En API name (Nombre de la API), escriba LambdaCalc.
5. Deje el campo Description (Descripción) y deje la opción Endpoint Type (Tipo de punto de enlace)
establecida en Regional.
6. Seleccione Create API (Crear API).
99
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
e. Para HTTP method (Método HTTP, elija POST y, a continuación, elija el icono de marca de
verificación para guardar la selección. Lambda requiere que se use la solicitud POST para invocar
cualquier función de Lambda. Este ejemplo muestra que el método HTTP en una solicitud de
método del frontend puede diferir de la solicitud de integración en el backend.
f. Elija Use path override en Action Type (Tipo de acción). Esta opción nos permite especificar
el ARN de la acción Invoke para ejecutar nuestra función Calc.
g. Escriba /2015-03-31/functions/arn:aws:lambda:region:account-
id:function:Calc/invocations en Path override (Sustitución de ruta), donde region es
la región en la que ha creado la función de Lambda y account-id es el número de cuenta de la
cuenta de AWS.
h. En Execution Role (Rol de ejecución), escriba el ARN del rol de IAM
lambda_invoke_function_assume_apigw_role que creó anteriormente (p. 95).
i. Deje la opción Content Handling (Tratamiento de contenido) establecida en Passthrough (Acceso
directo), ya que este método no tratará con datos binarios.
j. Deje la casilla Use default timeout (Usar tiempo de espera predeterminado) desactivada.
k. Seleccione Save.
10. Elija Method Request (Solicitud de método).
Ahora, vamos a configurar los parámetros de consulta para el método GET en /calc para que pueda
recibir la entrada en nombre de la función de Lambda del backend.
a. Haga clic en el icono del lápiz que aparece junto a Request (Solicitud) y elija la opción Validate
query string parameters and headers (Validar parámetro de cadena de consulta y encabezado) en
el menú desplegable. Esta configuración provocará un mensaje de error para volver a establecer
los parámetros que faltan si el cliente no los especifica. No se le cobrará por la llamada al
backend.
b. Haga clic en el icono de marca de verificación para guardar los cambios.
c. Expanda la sección URL Query String Parameters (Parámetros de cadena de consulta URL).
d. Elija Add query string (Añadir cadena de consulta).
e. En Name (Nombre), escriba operand1.
f. Haga clic en el icono de marca de verificación para guardar el parámetro.
g. Repita los pasos anteriores para crear los parámetros denominados operand2 y operator.
h. Active la opción Required (Obligatorio) de cada parámetro para asegurarse de que se validan.
11. Elija Method Execution (Ejecución del método) y después elija Integration Request (Solicitud
de integración) para configurar la plantilla de asignación para traducir las cadenas de consulta
proporcionadas por el cliente en la carga de la solicitud de integración, de conformidad con la función
Calc.
{
"a": "$input.params('operand1')",
"b": "$input.params('operand2')",
"op": "$input.params('operator')"
100
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Esta plantilla asigna los tres parámetros de cadena de consulta declarados en Method Request en
los valores de propiedad designados del objeto JSON como entrada a la función de Lambda del
backend. El objeto JSON transformado se incluirá como la carga de la solicitud de integración.
g. Seleccione Save.
12. Elija Method Execution (Ejecución del método).
13. Ahora puede probar el método GET para verificar que se ha configurado correctamente para invocar la
función de Lambda.
Para configurar el método POST con una carga JSON para invocar una función de Lambda
101
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
a. Elija Create (Crear) en el panel Models (Modelos). Escriba Input en Model name (Nombre de
modelo), escriba application/json en Content type (Tipo de contenido) y copie la siguiente
definición de esquema en el cuadro Model schema (Esquema del modelo):
{
"type":"object",
"properties":{
"a":{"type":"number"},
"b":{"type":"number"},
"op":{"type":"string"}
},
"title":"Input"
}
Este modelo describe la estructura de datos de entrada y se utilizará para validar el cuerpo de la
solicitud entrante.
b. Seleccione Create model (Crear modelo).
c. Elija Create (Crear) en el panel Models (Modelos). Escriba Output en Model name (Nombre de
modelo), escriba application/json en Content type (Tipo de contenido) y copie la siguiente
definición de esquema en el cuadro Model schema (Esquema del modelo):
{
"type":"object",
"properties":{
"c":{"type":"number"}
},
"title":"Output"
}
102
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Este modelo describe la estructura de datos de la salida calculada desde el backend. Se puede
utilizar para asignar los datos de la respuesta de integración a un modelo diferente. Este tutorial
se basa en el comportamiento de paso a través y no utiliza este modelo.
d. Busque el ID de API de la API en la parte superior de la pantalla de la consola y anótelo.
Aparecerá entre paréntesis detrás del nombre de la API.
e. Elija Create (Crear) en el panel Models (Modelos).
f. Escriba Result en Model name (Nombre del modelo).
g. Escriba application/json en Content type (Tipo de contenido).
h. Copie la siguiente definición de esquema, donde restapi-id es el ID de la API de REST que
anotó antes, en el cuadro Model schema (Esquema del modelo):
{
"type":"object",
"properties":{
"input":{
"$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/
Input"
},
"output":{
"$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/
Output"
}
},
"title":"Output"
}
Este modelo describe la estructura de datos de los datos de respuesta devueltos. Hace referencia
a los esquemas Input y Output definidos en la API especificada (restapi-id). Una vez más,
este modelo no se utiliza en este tutorial, ya que se utiliza el comportamiento de paso a través.
i. Seleccione Create model (Crear modelo).
10. En el panel de navegación principal, bajo la API LambdaCalc, seleccione Resources (Recursos).
11. En el panel Resources (Recursos), elija el método POST para la API.
12. Elija Method Request (Solicitud de método).
13. En la opción de configuración Method Request (Solicitud de método), realice las siguientes
operaciones para habilitar la validación de solicitudes en el cuerpo de la solicitud entrante:
a. Haga clic en el icono del lápiz que aparece junto a Request Validator (Validador de solicitudes)
para elegir Validate body. Haga clic en el icono de marca de verificación para guardar la
selección.
b. Expanda la sección Request Body (Cuerpo de solicitud) y elija Add model (Añadir modelo).
c. Escriba application/json en el campo de entrada Content-Type y elija Input en la lista
desplegable en la columna Model name (Nombre de modelo). Haga clic en el icono de marca de
verificación para guardar la selección.
14. Para probar el método POST, haga lo siguiente:
{
"a": 1,
"b": 2,
"op": "+"
103
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
{
"a": 1,
"b": 2,
"op": "+",
"c": 3
}
Esta vez utilizará el soporte de la integración de Lambda incorporado en la consola de API Gateway para
configurar la integración del método.
104
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
{
"a": "$input.params('operand1')",
"b": "$input.params('operand2')",
"op":
#if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end
Esta plantilla asigna los tres parámetros de ruta URL, declarados cuando se creó el recurso /
calc/{operand1}/{operand2}/{operator}, a los valores de propiedad designados en el objeto JSON.
Como las rutas URL deben estar codificadas como direcciones URL, el operador de división debe
especificarse como %2F en lugar de /. Esta plantilla traduce %2F en '/' antes de pasarlo a la
función de Lambda.
g. Elija Save (Guardar).
Cuando el método está configurado correctamente, la configuración debe ser similar a la siguiente:
105
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
106
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Este resultado de prueba muestra la salida original de la función de Lambda del backend, tal como se
ha pasado a través de la respuesta de integración sin asignación, ya que no hay ninguna plantilla de
asignación. A continuación, creará el modelo de la estructura de datos de la carga de la respuesta del
método detrás del esquema Result.
28. De forma predeterminada, el cuerpo de la respuesta del método se asigna a un modelo vacío. Esto
hará que el cuerpo de la respuesta de integración se transfiera sin asignación. Sin embargo, cuando
genere un SDK para alguno de los lenguajes con establecimiento inflexible de tipos, como Java u
Objective-C, los usuarios del SDK recibirán un objeto vacío como resultado. Para garantizar que
el cliente REST y los clientes del SDK reciban el resultado deseado, debe crear los datos de la
respuesta mediante un esquema predefinido. A continuación, definirá un modelo para el cuerpo de la
respuesta del método y cómo crear una plantilla de asignación para traducir el cuerpo de la respuesta
de integración al cuerpo de la respuesta del método.
a. Elija /calc/{operand1}/{operand2}/{operator}.
b. Elija GET.
c. Elija Method Execution (Ejecución del método).
d. Choose Method Response (Respuesta de método).
107
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
Al configurar el modelo para el cuerpo de la respuesta del método, nos aseguramos de que los datos
de la respuesta se emitan en el objeto Result de un determinado SDK. Para asegurarse de que
los datos de la respuesta de integración se asignen según corresponda, necesitará una plantilla de
asignación.
29. Para crear la plantilla de asignación, haga lo siguiente:
#set($inputRoot = $input.path('$'))
{
"input" : {
"a" : $inputRoot.a,
"b" : $inputRoot.b,
"op" : "$inputRoot.op"
},
"output" : {
"c" : $inputRoot.c
}
}
g. Seleccione Save.
30. Para probar la plantilla de asignación, haga lo siguiente:
{
"input": {
"a": 1,
"b": 2,
"op": "+"
},
"output": {
"c": 3
}
}
108
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
31. En este punto la API solo se puede llamar a través de Test Invoke (Invocación de prueba) en la
consola de API Gateway. Para hacer que esté disponible para los clientes, se debe implementar tal y
como se indica a continuación:
Note
Asegúrese siempre para volver a implementar la API, cada vez que agrega, modifica o elimina
un recurso o un método, actualizar una asignación de datos o actualiza la configuración de la
etapa. De lo contrario, las nuevas características o actualizaciones no estarán disponibles para los
clientes de la API.
{
"swagger": "2.0",
"info": {
"version": "2017-04-20T04:08:08Z",
"title": "LambdaCalc"
},
"host": "uojnr9hd57.execute-api.us-east-1.amazonaws.com",
"basePath": "/test",
"schemes": [
"https"
],
"paths": {
"/calc": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "operand2",
"in": "query",
"required": true,
"type": "string"
},
{
"name": "operator",
"in": "query",
"required": true,
"type": "string"
},
{
109
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
"name": "operand1",
"in": "query",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Result"
},
"headers": {
"operand_1": {
"type": "string"
},
"operand_2": {
"type": "string"
},
"operator": {
"type": "string"
}
}
}
},
"x-amazon-apigateway-request-validator": "Validate query string parameters and
headers",
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.operator": "integration.response.body.op",
"method.response.header.operand_2": "integration.response.body.b",
"method.response.header.operand_1": "integration.response.body.a"
},
"responseTemplates": {
"application/json": "#set($res = $input.path('$'))\n{\n \"result\":
\"$res.a, $res.b, $res.op => $res.c\",\n \"a\" : \"$res.a\",\n \"b\" : \"$res.b\",\n
\"op\" : \"$res.op\",\n \"c\" : \"$res.c\"\n}"
}
}
},
"uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
"passthroughBehavior": "when_no_match",
"httpMethod": "POST",
"requestTemplates": {
"application/json": "{\n \"a\": \"$input.params('operand1')\",\n \"b
\": \"$input.params('operand2')\", \n \"op\": \"$input.params('operator')\" \n}"
},
"type": "aws"
}
},
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"in": "body",
"name": "Input",
110
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
"required": true,
"schema": {
"$ref": "#/definitions/Input"
}
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Result"
}
}
},
"x-amazon-apigateway-request-validator": "Validate body",
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"default": {
"statusCode": "200",
"responseTemplates": {
"application/json": "#set($inputRoot = $input.path('$'))\n{\n \"a
\" : $inputRoot.a,\n \"b\" : $inputRoot.b,\n \"op\" : $inputRoot.op,\n \"c\" :
$inputRoot.c\n}"
}
}
},
"uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
"passthroughBehavior": "when_no_templates",
"httpMethod": "POST",
"type": "aws"
}
}
},
"/calc/{operand1}/{operand2}/{operator}": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "operand2",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "operator",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "operand1",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
111
Amazon API Gateway Guía del desarrollador
Tutorial: API Calc con tres integraciones
"schema": {
"$ref": "#/definitions/Result"
}
}
},
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"default": {
"statusCode": "200",
"responseTemplates": {
"application/json": "#set($inputRoot = $input.path('$'))\n{\n
\"input\" : {\n \"a\" : $inputRoot.a,\n \"b\" : $inputRoot.b,\n \"op\" :
\"$inputRoot.op\"\n },\n \"output\" : {\n \"c\" : $inputRoot.c\n }\n}"
}
}
},
"uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
"passthroughBehavior": "when_no_templates",
"httpMethod": "POST",
"requestTemplates": {
"application/json": "{\n \"a\": \"$input.params('operand1')\",\n \"b\":
\"$input.params('operand2')\",\n \"op\": #if($input.params('operator')=='%2F')\"/
\"#{else}\"$input.params('operator')\"#end\n \n}"
},
"contentHandling": "CONVERT_TO_TEXT",
"type": "aws"
}
}
}
},
"definitions": {
"Input": {
"type": "object",
"required": [
"a",
"b",
"op"
],
"properties": {
"a": {
"type": "number"
},
"b": {
"type": "number"
},
"op": {
"type": "string",
"description": "binary op of ['+', 'add', '-', 'sub', '*', 'mul', '%2F',
'div']"
}
},
"title": "Input"
},
"Output": {
"type": "object",
"properties": {
"c": {
"type": "number"
}
},
"title": "Output"
},
"Result": {
"type": "object",
112
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
"properties": {
"input": {
"$ref": "#/definitions/Input"
},
"output": {
"$ref": "#/definitions/Output"
}
},
"title": "Result"
}
},
"x-amazon-apigateway-request-validators": {
"Validate body": {
"validateRequestParameters": false,
"validateRequestBody": true
},
"Validate query string parameters and headers": {
"validateRequestParameters": true,
"validateRequestBody": false
}
}
}
• Exponer GET en el recurso raíz de la API para enumerar todos los buckets de Amazon S3 de un
intermediario.
• Exponer GET en un recurso de carpeta para ver una lista de todos los objetos de un bucket de Amazon
S3.
• Exponer PUT en un recurso de carpeta para agregar un bucket a Amazon S3.
• Exponer DELETE en un recurso de carpeta para eliminar un bucket de Amazon S3.
• Exponer GET en un recurso de carpeta o elemento para ver o descargar un objeto de un bucket de
Amazon S3.
• Exponer PUT en un recurso de carpeta o elemento para cargar un objeto en un bucket de Amazon S3.
• Exponer HEAD en un recurso de carpeta o elemento para obtener los metadatos de objeto en un bucket
de Amazon S3.
• Exponer DELETE en un recurso de carpeta o elemento para eliminar un objeto de un bucket de Amazon
S3.
Note
Para integrar su API de API Gateway con Amazon S3, debe elegir una región en la que
estén disponibles los servicios API Gateway y Amazon S3. Para obtener información sobre
la disponibilidad en función de la región, consulte Cuotas y puntos de enlace de Amazon API
Gateway.
Es posible que desee importar la API de ejemplo como proxy de Amazon S3, tal y como se muestra
en Definiciones de OpenAPI de la API de ejemplo como proxy de Amazon S3 (p. 130). Para obtener
113
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
instrucciones sobre cómo importar una API mediante la definición de OpenAPI, consulte Configuración de
una API de REST mediante OpenAPI (p. 500).
Para utilizar la consola de API Gateway para crear la API, primero debe registrarse para obtener una
cuenta de AWS.
Si no dispone de una cuenta de AWS, siga estos pasos para crear una.
1. Abra https://portal.aws.amazon.com/billing/signup.
2. Siga las instrucciones en línea.
Parte del procedimiento de inscripción consiste en recibir una llamada telefónica e indicar un código de
verificación en el teclado del teléfono.
Temas
• Configurar permisos de IAM para que la API invoque acciones de Amazon S3 (p. 114)
• Crear recursos de API para representar recursos de Amazon S3 (p. 115)
• Exponer un método de API para enumerar los buckets de Amazon S3 del intermediario (p. 116)
• Exponer métodos de API para tener acceso a un bucket de Amazon S3 (p. 122)
• Exponer métodos de API para tener acceso a un objeto de Amazon S3 en un bucket (p. 125)
• Llamar a la API mediante un cliente API de REST (p. 128)
• Definiciones de OpenAPI de la API de ejemplo como proxy de Amazon S3 (p. 130)
Para que la API vea o muestre buckets y objetos de Amazon S3, puede utilizar la política
AmazonS3ReadOnlyAccess proporcionada por IAM en el rol de IAM. El ARN de esta política es
arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess, tal y como se muestra a continuación:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
]
}
Este documento de política establece que cualquiera de las acciones Get* y List* de Amazon S3 se
puede invocar en cualquiera de los recursos de Amazon S3.
Para que la API actualice los buckets y los objetos de Amazon S3, puede utilizar una política personalizada
para cualquiera de las acciones Put* de Amazon S3, tal y como se muestra a continuación:
114
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:Put*",
"Resource": "*"
}
]
}
Para que la API funcione con las acciones Get*, List* y Put* de Amazon S3, puede agregar las
políticas de solo lectura y solo inserción anteriores al rol de IAM.
Para que la API invoque las acciones Post* de Amazon S3, debe utilizar una política Allow para las
acciones s3:Post* en el rol de IAM. Para obtener una lista completa de las acciones de Amazon S3,
consulte el tema sobre especificar permisos de Amazon S3 en una política.
Para que la API cree, vea, actualice y elimine buckets y objetos en Amazon S3, puede utilizar la política
AmazonS3FullAccess proporcionada por IAM en el rol de IAM. El ARN es arn:aws:iam::aws:policy/
AmazonS3FullAccess.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Después de haber elegido las políticas de IAM que desea utilizar, cree un rol de IAM y asócielo a las
políticas. El rol de IAM resultante debe contener la siguiente política de confianza para que API Gateway
asuma este rol en el tiempo de ejecución.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Cuando utilice la consola de IAM para crear el rol, elija el tipo de rol de Amazon API Gateway para
garantizar que esta política de confianza se incluya automáticamente.
115
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Al acceder a los objetos cuya clave de objeto incluye / o cualquier otro carácter especial, el
carácter estar codificado en la URL. Por ejemplo, test/test.txt deben codificarse en test
%2Ftest.txt.
Para crear un recurso de API que exponga las características del servicio Amazon S3
1. En la consola de API Gateway, cree una API denominada myS3. Este recurso raíz de la API (/)
representa el servicio Amazon S3.
2. En el recurso raíz de la API, cree un recurso secundario denominado Folder (Carpeta) y establezca el
elemento Resource Path (Ruta del recurso) necesario en /{folder}.
3. Para el recurso Folder (Carpeta) de la API, cree un recurso secundario Item (Elemento). Establezca el
elemento Resource Path (Ruta del recurso) necesario en /{item}.
1. Elija Create method (Crear método) en el nodo raíz (/) desde el menú desplegable Actions (Acciones)
en la esquina superior derecha del panel Resources (Recursos).
2. Elija GET en la lista desplegable de verbos HTTP y haga clic en el icono de marca de verificación para
empezar a crear el método.
116
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
3. En el panel / - GET - Setup, elija AWS Service (Servicio de AWS) en Integration type (Tipo de
integración).
4. Elija una región de la lista (por ejemplo, us-west-2) en AWS Region (Región de AWS).
5. En AWS Service (Servicio de AWS), elija S3.
6. Deje en blanco AWS Subdomain (Subdominio de AWS).
7. En HTTP method (Método HTTP), elija GET.
8. En Action Type (Tipo de acción), elija Use path override (Usar invalidación de ruta). Al anular la ruta,
API Gateway reenvía la solicitud del cliente a Amazon S3 como la solicitud del tipo de ruta de la API
de REST de Amazon S3 correspondiente, en la cual un recurso de Amazon S3 se expresa por la ruta
de recursos del patrón s3-host-name/bucket/key. API Gateway establece el s3-host-name y
transmite el bucket y la key especificados por el cliente a Amazon S3.
9. (Opcional) En Path override (Invalidación de ruta) escriba /.
10. Copie el ARN del rol de IAM creado anteriormente (desde la consola de IAM) y péguelo en Execution
role (Rol de ejecución).
11. Deje el resto de la configuración de forma predeterminada.
12. Elija Save (Guardar) para terminar de configurar este método.
Tras la configuración inicial, puede modificar estos ajustes en la página Integration Request
(Solicitud de integración) del método.
Para controlar quién puede llamar a este método de nuestra API, activamos la marca de autorización del
método y la establecemos en AWS_IAM.
1. En Method Execution (Ejecución del método), elija Method Request (Solicitud de método).
2. Haga clic en el icono del lápiz que aparece junto a Authorization (Autorización)
3. Elija AWS_IAM en la lista desplegable.
4. Haga clic en el icono de marca de verificación para guardar la configuración.
117
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Para que nuestra API devuelva respuestas correctas y excepciones al intermediario, vamos a declarar
las respuestas 200, 400 y 500 en Method Response (Respuesta de método). Utilizamos el mapeo
predeterminado para las respuestas 200, de forma que las respuestas del backend del código de estado
no declarado aquí se devuelvan al intermediario como respuestas 200.
1. En el panel Method Execution (Ejecución del método), elija el cuadro Method Response (Respuesta
de método). API Gateway declara la respuesta 200 de forma predeterminada.
2. Elija Add response (Añadir respuesta), escriba 400 en el cuadro de texto de entrada y elija la marca
de verificación para completar la declaración.
3. Repita el paso anterior para declarar el tipo de respuesta 500. Esta será la configuración final:
Como la respuesta de integración correcta de Amazon S3 devuelve la lista de buckets como una carga
XML y la respuesta de método predeterminada de API Gateway devuelve una carga JSON, debemos
mapear el valor del parámetro del encabezado Content-Type del backend con su homólogo en el frontend.
De lo contrario, el cliente recibirá application/json para el tipo de contenido cuando el cuerpo de
118
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
la respuesta sea en realidad una cadena XML. El siguiente procedimiento muestra cómo realizar esta
configuración. Además, también queremos mostrar al cliente otros parámetros de encabezado, como Date
y Content-Length.
1. En la consola de API Gateway, elija Method Response (Respuesta del método). Añada el encabezado
Content-Type para el tipo de respuesta 200.
119
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Con los mapeos de encabezado anteriores, API Gateway traducirá el encabezado Date del backend
al encabezado Timestamp para el cliente.
3. En Integration Response (Respuesta de integración), elija Add integration response (Añadir respuesta
de integración), escriba una expresión regular adecuada en el cuadro de texto HTTP status regex
(Expresión regular de estado de HTTP) para otro estado de respuesta de método. Repita este
procedimiento hasta que se cubran todos los estados de respuesta de método.
120
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Como práctica recomendada, vamos a probar nuestra API tal y como está configurada de momento.
1. Vuelva a Method Execution (Ejecución del método), elija Test (Probar) en el cuadro Client (Cliente).
2. Elija Test (Probar) en el panel GET / - Method Test (GET / - Prueba de método). A continuación se
muestra un resultado de ejemplo.
121
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Note
Para utilizar la consola de API Gateway para probar la API como proxy de Amazon S3, asegúrese
de que el bucket de S3 de destino procede de una región diferente de la región de la API. De lo
contrario, es posible que obtenga una respuesta 500 Internal Server Error. Esta limitación no se
aplica a las API implementadas.
1. En el nodo /{folder} del árbol Resources (Recursos), cree los métodos DELETE, GET y PUT, uno cada
vez.
122
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
2. Configure la integración inicial de cada método creado con sus puntos de enlace de Amazon S3
correspondientes. En la siguiente captura de pantalla se ilustra esta configuración para el método
PUT /{folder}. Para los métodos DELETE /{folder} y GET /{folder}, reemplace el valor de
PUT de HTTP method (Método HTTP) por DELETE y GET, respectivamente.
Observe que hemos usado el parámetro de ruta {bucket} en las direcciones URL del punto de
enlace de Amazon S3 para especificar el bucket. Necesitaremos asignar el parámetro de ruta
{folder} de las solicitudes de método al parámetro de ruta {bucket} de las solicitudes de
integración.
3. Para asignar {folder} a {bucket}:
a. Elija Method Execution (Ejecución del método) y, a continuación, Integration Request (Solicitud de
integración).
b. Expanda URL Path Parameters (Parámetros de la ruta URL) y elija Add path (Añadir ruta)
c. Escriba bucket en la columna Name (Nombre) y method.request.path.folder en la
columna Mapped from (Asignado desde). Haga clic en el icono de marca de verificación para
guardar la asignación.
123
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Esto es necesario sobre todo para las pruebas, cuando se utiliza la consola de API Gateway y hay que
especificar application/xml para una carga XML.
5. En Integration Request (Solicitud de integración), configure los siguientes mapeos de encabezado, de
acuerdo con las instrucciones descritas en Exponer un método de API para enumerar los buckets de
Amazon S3 del intermediario (p. 116).
<CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<LocationConstraint>{region}</LocationConstraint>
</CreateBucketConfiguration>
124
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
7. Repita los pasos anteriores para crear y configurar el método GET Y DELETE en el recurso /{folder}
de la API.
Los ejemplos anteriores ilustran cómo crear un nuevo bucket en la región especificada para ver la lista
de objetos del bucket y para eliminar el bucket. Otras operaciones de bucket de Amazon S3 le permiten
trabajar con los metadatos o las propiedades del bucket. Por ejemplo, puede configurar la API para que
llame a la acción PUT /?notification de Amazon S3 para configurar notificaciones en el bucket, para que
llame a PUT /?acl para definir una lista de control de acceso en el bucket, etc. La configuración de la API
es similar, con la excepción de que debe agregar los parámetros de consulta adecuados a las direcciones
URL del punto de enlace de Amazon S3. En tiempo de ejecución, debemos proporcionar la carga XML
correspondiente a la solicitud del método. Lo mismo ocurre con las otras operaciones GET y DELETE
en un bucket de Amazon S3. Para obtener información sobre las posibles acciones de Amazon S3 en un
bucket, consulte el tema sobre operaciones de Amazon S3 en buckets.
En este tutorial, exponemos la operación PUT Object, la operación GET Object, la operación HEAD
Object y la operación DELETE Object a través de los métodos de API PUT /{folder}/{item}, GET /
{folder}/{item}, HEAD /{folder}/{item} y DELETE /{folder}/{item}, respectivamente.
Las configuraciones de API para los métodos PUT, GET y DELETE en /{folder}/{item} son similares
a las de /{folder}, como se indica en Exponer métodos de API para tener acceso a un bucket de
Amazon S3 (p. 122). Una gran diferencia es que la ruta de la solicitud relacionada con un objeto tiene un
parámetro de ruta adicional de {item} y este parámetro de ruta debe estar asignado al parámetro de ruta
de solicitud de integración de {object}.
125
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
A modo de ilustración, la siguiente captura de pantalla muestra el resultado cuando se prueba el método
GET en un recurso de {folder}/{item} mediante la consola de API Gateway. La solicitud devuelve
correctamente el texto sin formato (Welcome to README.txt) como el contenido del archivo especificado
(README.txt) en el bucket de Amazon S3 indicado (apig-demo).
126
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Para descargar o cargar archivos binarios, que en API Gateway se considera cualquier cosa que no sea
contenido JSON codificado en UTF-8, es necesaria una configuración adicional de la API. Esto se detalla
de la siguiente manera:
1. Registrar los tipos de archivo del archivo afectado en los tipos "binaryMediaTypes" de la API. Puede
hacer lo siguiente en la consola:
127
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
consulte Comportamiento del acceso directo a la integración (p. 424) y Seleccionar una plantilla de
asignación VTL (p. 423).
El límite de tamaño de carga es 10 MB. Consulte Cuotas de Amazon para configurar y ejecutar una API
REST (p. 843).
Asegúrese de que los archivos en Amazon S3 incluyen los tipos de contenido correctos en los metadatos.
Para contenido multimedia que se puede transmitir, es posible que los metadatos deban incluir Content-
Disposition:inline.
Para obtener más información sobre la compatibilidad con datos binarios en API Gateway, consulte
Conversiones de tipo de contenido en API Gateway (p. 454).
1. Implemente o vuelva a implementar la API. Anote la URL base de la API que se muestra junto a
Invoke URL (URL de invocación) en la parte superior de Stage Editor (Editor de etapas).
2. Inicie Postman.
3. Elija Authorization (Autorización) y, a continuación, elija AWS Signature. Escriba el ID de clave
de acceso y la clave de acceso secreta del usuario de IAM en los campos de entrada AccessKey
y SecretKey, respectivamente. Especifique la región de AWS en la que va a implementar la API en
el cuadro de texto AWS Region (Región de AWS). Escriba execute-api en el campo de entrada
Service Name (Nombre del servicio).
Puede crear un par de claves desde la pestaña Security Credentials (Credenciales de seguridad) de
su cuenta de usuario de IAM en la consola de administración de IAM.
4. Para agregar un bucket denominado apig-demo-5 a su cuenta de Amazon S3 en la región
{region}:
Note
Asegúrese de que el nombre de bucket sea único de forma global.
a. Seleccione PUT en la lista desplegable de métodos y escriba la URL del método (https://api-
id.execute-api.aws-region.amazonaws.com/stage/folder-name)
b. Establezca el valor del encabezado Content-Type en application/xml. Es posible que
necesite eliminar todos los encabezados existentes antes de configurar el tipo de contenido.
c. Elija el elemento de menú Body (Cuerpo) y escriba el siguiente fragmento XML como cuerpo de la
solicitud:
<CreateBucketConfiguration>
<LocationConstraint>{region}</LocationConstraint>
</CreateBucketConfiguration>
d. Elija Send (Enviar) para enviar la solicitud. Si todo va bien, debería recibir una respuesta 200 OK
con una carga vacía.
5. Para añadir un archivo de texto a un bucket, siga las instrucciones anteriores. Si especifica el nombre
de bucket de apig-demo-5 para {folder} y el nombre de archivo Readme.txt para {item} en la
dirección URL y proporciona la cadena de texto Hello, World! como contenido de archivo (con lo
que se convierte en la carga de la solicitud), la respuesta será
128
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
Host: 9gn28ca086.execute-api.{region}.amazonaws.com
Content-Type: application/xml
X-Amz-Date: 20161015T062647Z
Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-
api/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date,
Signature=ccadb877bdb0d395ca38cc47e18a0d76bb5eaf17007d11e40bf6fb63d28c705b
Cache-Control: no-cache
Postman-Token: 6135d315-9cc4-8af8-1757-90871d00847e
Hello, World!
Si todo sale bien, debe recibir una respuesta 200 OK con una carga vacía.
6. Para obtener el contenido del archivo Readme.txt que acaba de añadir al bucket apig-demo-5,
envíe una solicitud GET como la siguiente:
Si todo sale bien, debe recibir una respuesta 200 OK con la cadena de texto Hello, World! como
la carga.
7. Para mostrar los elementos del bucket apig-demo-5, envíe la siguiente solicitud:
Si todo sale bien, debe recibir una respuesta 200 OK con una carga XML que muestre un único
elemento en el bucket especificado, a menos que haya añadido más archivos al bucket antes de
enviar esta solicitud.
129
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
</Contents>
</ListBucketResult>
Note
Para cargar o descargar una imagen, debe configurar el tratamiento de contenido como
CONVERT_TO_BINARY.
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"version": "2016-10-13T23:04:43Z",
"title": "MyS3"
},
"host": "9gn28ca086.execute-api.{region}.amazonaws.com",
"basePath": "/S3",
"schemes": [
"https"
],
"paths": {
"/": {
"get": {
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Timestamp": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
130
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Content-Length":
"integration.response.header.Content-Length",
"method.response.header.Timestamp": "integration.response.header.Date"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"uri": "arn:aws:apigateway:us-west-2:s3:path//",
"passthroughBehavior": "when_no_match",
"httpMethod": "GET",
"type": "aws"
}
}
},
"/{folder}": {
"get": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Date": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
131
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Date": "integration.response.header.Date",
"method.response.header.Content-Length":
"integration.response.header.content-length"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.path.bucket": "method.request.path.folder"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
"passthroughBehavior": "when_no_match",
"httpMethod": "GET",
"type": "aws"
}
},
"put": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "Content-Type",
"in": "header",
"required": false,
"type": "string"
},
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
132
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Content-Length":
"integration.response.header.Content-Length"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.header.x-amz-acl": "'authenticated-read'",
"integration.request.path.bucket": "method.request.path.folder",
"integration.request.header.Content-Type": "method.request.header.Content-
Type"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
"passthroughBehavior": "when_no_match",
"httpMethod": "PUT",
"type": "aws"
}
},
"delete": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Date": {
"type": "string"
133
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Date": "integration.response.header.Date"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.path.bucket": "method.request.path.folder"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
"passthroughBehavior": "when_no_match",
"httpMethod": "DELETE",
"type": "aws"
}
}
},
"/{folder}/{item}": {
"get": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "item",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
134
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"content-type": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.content-type":
"integration.response.header.content-type",
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.path.object": "method.request.path.item",
"integration.request.path.bucket": "method.request.path.folder"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
"passthroughBehavior": "when_no_match",
"httpMethod": "GET",
"type": "aws"
}
},
"head": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "item",
"in": "path",
"required": true,
"type": "string"
},
135
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Content-Length":
"integration.response.header.Content-Length"
}
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.path.object": "method.request.path.item",
"integration.request.path.bucket": "method.request.path.folder"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
"passthroughBehavior": "when_no_match",
"httpMethod": "HEAD",
"type": "aws"
}
},
"put": {
"produces": [
"application/json"
136
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
],
"parameters": [
{
"name": "Content-Type",
"in": "header",
"required": false,
"type": "string"
},
{
"name": "item",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type",
"method.response.header.Content-Length":
"integration.response.header.Content-Length"
}
},
"5\\d{2}": {
"statusCode": "500"
}
137
Amazon API Gateway Guía del desarrollador
Tutorial: Crear una API de REST como
proxy de Amazon S3 en API Gateway
},
"requestParameters": {
"integration.request.path.object": "method.request.path.item",
"integration.request.header.x-amz-acl": "'authenticated-read'",
"integration.request.path.bucket": "method.request.path.folder",
"integration.request.header.Content-Type": "method.request.header.Content-
Type"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
"passthroughBehavior": "when_no_match",
"httpMethod": "PUT",
"type": "aws"
}
},
"delete": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "item",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "folder",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Length": {
"type": "string"
},
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response"
},
"500": {
"description": "500 response"
}
},
"security": [
{
"sigv4": []
}
],
"x-amazon-apigateway-integration": {
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"responses": {
"4\\d{2}": {
"statusCode": "400"
},
"default": {
138
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"statusCode": "200"
},
"5\\d{2}": {
"statusCode": "500"
}
},
"requestParameters": {
"integration.request.path.object": "method.request.path.item",
"integration.request.path.bucket": "method.request.path.folder"
},
"uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
"passthroughBehavior": "when_no_match",
"httpMethod": "DELETE",
"type": "aws"
}
}
}
},
"securityDefinitions": {
"sigv4": {
"type": "apiKey",
"name": "Authorization",
"in": "header",
"x-amazon-apigateway-authtype": "awsSigv4"
}
},
"definitions": {
"Empty": {
"type": "object",
"title": "Empty Schema"
}
}
}
Para integrar la API de API Gateway con Kinesis, debe elegir una región en la que estén
disponibles los servicios API Gateway y Kinesis. Para conocer la disponibilidad de las regiones,
consulte Puntos de enlace y cuotas de servicio.
A modo de ejemplo, crearemos una API de ejemplo para permitir que un cliente haga lo siguiente:
Para realizar las tareas anteriores, la API expone métodos en diferentes recursos para invocar lo siguiente,
respectivamente:
139
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
• Exponer un método HTTP GET en el recurso /streams de la API e integrar el método con la acción
ListStreams de Kinesis para mostrar los flujos de la cuenta del intermediario.
• Exponer un método HTTP POST en el recurso /streams/{stream-name} de la API e integrar
el método con la acción CreateStream de Kinesis para crear un flujo con nombre en la cuenta del
intermediario.
• Exponer un método HTTP GET en el recurso /streams/{stream-name} de la API e integrar el
método con la acción DescribeStream de Kinesis para describir un flujo con nombre en la cuenta del
intermediario.
• Exponer un método HTTP DELETE en el recurso /streams/{stream-name} de la API e integrar el
método con la acción DeleteStream de Kinesis para eliminar un flujo en la cuenta del intermediario.
• Exponer un método PUT HTTP en el recurso /streams/{stream-name}/record de la API e integrar
el método con la acción PutRecord de Kinesis. Esto permite que el cliente añada un solo registro de
datos al flujo con nombre.
• Exponer un método PUT HTTP en el recurso /streams/{stream-name}/records de la API e
integrar el método con la acción PutRecords de Kinesis. Esto permite que el cliente añada una lista de
registros de datos al flujo con nombre.
• Exponer un método GET HTTP en el recurso /streams/{stream-name}/records de la API e
integrar el método con la acción GetRecords de Kinesis. Esto permite que el cliente muestre registros
de datos en el flujo con nombre, con un iterador de fragmento especificado. Un iterador de fragmento
especifica la posición del fragmento desde la que se empiezan a leer los registros de datos de forma
secuencial.
• Exponer un método GET HTTP en el recurso /streams/{stream-name}/sharditerator de
la API e integrar el método con la acción GetShardIterator de Kinesis. Este método auxiliar debe
proporcionarse en la acción ListStreams de Kinesis.
Puede aplicar las instrucciones que se presentan aquí a otras acciones de Kinesis. Para obtener la lista
completa de las acciones de Kinesis, consulte Referencia de API de Amazon Kinesis.
En lugar de utilizar la consola de API Gateway para crear la API de ejemplo, puede importar la
API de ejemplo en API Gateway mediante la API de importación de API Gateway. Para obtener
información acerca de cómo utilizar Import API, consulte Configuración de una API de REST mediante
OpenAPI (p. 500).
Si no dispone de una cuenta de AWS, siga estos pasos para crear una.
1. Abra https://portal.aws.amazon.com/billing/signup.
2. Siga las instrucciones en línea.
Parte del procedimiento de inscripción consiste en recibir una llamada telefónica e indicar un código de
verificación en el teclado del teléfono.
140
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Para habilitar el acceso de solo lectura a Kinesis, puede utilizar la política AmazonKinesisReadOnlyAccess
que permite invocar las acciones Get*, List* y Describe* de Kinesis.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kinesis:Get*",
"kinesis:List*",
"kinesis:Describe*"
],
"Resource": "*"
}
]
}
Esta política está disponible como una política administrada aprovisionada por IAM y su ARN es
arn:aws:iam::aws:policy/AmazonKinesisReadOnlyAccess.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kinesis:*",
"Resource": "*"
}
]
}
Esta política también está disponible como una política administrada aprovisionada por IAM. Su ARN es
arn:aws:iam::aws:policy/AmazonKinesisFullAccess.
Después de decidir qué política IAM va a utilizar, asóciela a un rol de IAM nuevo o existente. Asegúrese de
que el servicio de control de API Gateway (apigateway.amazonaws.com) es una entidad de confianza
del rol y tiene permiso para asumir el rol de ejecución (sts:AssumeRole).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
141
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Si crea el rol de ejecución en la consola de IAM y elige el tipo de rol Amazon API Gateway, esta política de
confianza se asocia automáticamente.
Anote el ARN del rol de ejecución. Lo necesitará cuando cree un método de API y configure su solicitud de
integración.
Para crear una API como un proxy de servicio de AWS para Kinesis
Si esta no es la primera vez que utiliza API Gateway, elija Create API (Crear API). En REST API, elija
Build (Compilación).
3. Elija New API (Nueva API).
4. En API name (Nombre de la API), escriba KinesisProxy. Deje los valores predeterminados en el
resto de los campos.
5. Escriba una descripción en Description (Descripción) si lo desea.
6. Seleccione Create API (Crear API).
Una vez creada la API, la consola de API Gateway mostrará la página Resources (Recursos), que contiene
únicamente el recurso raíz de la API (/).
{
...
}
POST / HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
X-Amz-Target: Kinesis_20131202.ListStreams
142
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
...
}
Para exponer una acción de Kinesis en la API, agregue un recurso /streams a la raíz de la API. A
continuación, defina un método GET en el recurso e integre el método en la acción ListStreams de
Kinesis.
En el siguiente procedimiento se describe cómo listar los flujos de Kinesis con la consola de API Gateway.
1. Seleccione el recurso raíz de la API. En Actions (Acciones), elija Create Resource (Crear recurso).
En Resource Name (Nombre de recurso), escriba Streams, no modifique los valores predeterminados
del campo Resource Path (Ruta del recurso) o del resto y, a continuación, elija Create Resource
(Crear recurso).
2. Elija el recurso /Streams. En Actions (Acciones), elija Create Method (Crear método), elija GET en la
lista y, a continuación, haga clic en el icono de marca de verificación para terminar de crear el método.
Note
El verbo HTTP de un método invocado por un cliente puede ser diferente del verbo HTTP de
una integración requerida por el backend. Aquí elegimos GET porque mostrar los flujos es
intuitivamente una operación READ.
3. En el panel Setup (Configuración) del método, elija AWS Service (Servicio de AWS).
a. En AWS Region (Región de AWS), elija una región (por ejemplo, us-east-1).
b. En AWS Service (Servicio de AWS), elija Kinesis.
c. Deje AWS Subdomain (Subdominio de AWS) en blanco.
d. En HTTP method (Método HTTP), elija POST.
Note
Aquí elegimos POST porque Kinesis requiere que la acción ListStreams también se
invoque.
e. En Action Type, elija Use action name.
f. En Action, escriba ListStreams.
g. En Execution role (Rol de ejecución), escriba el ARN del rol de ejecución.
h. No modifique el valor predeterminado Passthrough (Acceso directo) del campo Content Handling
(Tratamiento de contenido).
i. Elija Save (Guardar) para finalizar la configuración inicial del método.
143
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
144
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
c. Haga clic en el icono de marca de verificación para guardar la configuración Content-Type. Elija
Yes, secure this integration (Sí, proteger esta integración) en Change passthrough behavior
(Cambiar comportamiento de acceso directo).
d. Escriba {} en el editor de la plantilla.
e. Elija el botón Save (Guardar) para guardar la plantilla de asignación.
{
"ExclusiveStartStreamName": "string",
"Limit": number
}
Sin embargo, las propiedades son opcionales. Para utilizar los valores predeterminados, usamos aquí
una carga JSON vacía.
145
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
6. Pruebe el método GET en el recurso Streams para invocar la acción ListStreams en Kinesis:
146
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"HasMoreStreams": false,
"StreamNames": [
"myStream",
"yourStream"
]
}
{
"ShardCount": number,
"StreamName": "string"
}
{
"ExclusiveStartShardId": "string",
"Limit": number,
"StreamName": "string"
}
{
"StreamName":"string"
}
147
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Podemos crear la API para que acepte la entrada necesaria como una carga JSON de una solicitud de
método y transmita la carga a la solicitud de integración. Sin embargo, para proporcionar más ejemplos
de mapeo de datos entre solicitudes de método e integración y respuestas de método e integración,
crearemos nuestra API de una forma ligeramente distinta.
Exponemos los métodos HTTP GET, POST y Delete HTTP en un recurso Stream al que se asignará
un nombre. Utilizamos la variable de ruta {stream-name} como marcador de posición del recurso
de flujo e integramos estos métodos de la API con las acciones DescribeStream, CreateStream y
DeleteStream de Kinesis respectivamente. Exigimos que el cliente pase otros datos de entrada como
encabezados, parámetros de consulta o la carga de una solicitud de método. Proporcionamos plantillas de
asignación para transformar los datos en la carga de solicitud de integración necesaria.
1. Cree un recurso secundario con la variable de ruta {stream-name} bajo el recurso /streams
creado con anterioridad.
Después de crear los métodos en el recurso, la estructura de la API debe ser similar a la siguiente:
148
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
149
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Content-Type: 'x-amz-json-1.1'
La tarea sigue el mismo procedimiento para configurar el mapeo del parámetro de solicitud que el
método GET /streams.
5. Añada la siguiente plantilla de mapeo de cuerpo para mapear los datos de la solicitud del método
GET /streams/{stream-name} a la solicitud de integración POST /?Action=DescribeStream:
{
"StreamName": "$input.params('stream-name')"
}
Esta plantilla de mapeo genera la carga de la solicitud de integración necesaria para la acción
DescribeStream de Kinesis a partir del valor del parámetro de ruta stream-name de la solicitud de
método.
6. Pruebe el método GET /stream/{stream-name} para invocar la acción DescribeStream en
Kinesis:
150
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"StreamDescription": {
"HasMoreShards": false,
"RetentionPeriodHours": 24,
"Shards": [
{
"HashKeyRange": {
"EndingHashKey": "68056473384187692692674921486353642290",
"StartingHashKey": "0"
},
"SequenceNumberRange": {
"StartingSequenceNumber":
"49559266461454070523309915164834022007924120923395850242"
},
"ShardId": "shardId-000000000000"
},
...
{
"HashKeyRange": {
"EndingHashKey": "340282366920938463463374607431768211455",
"StartingHashKey": "272225893536750770770699685945414569164"
},
"SequenceNumberRange": {
"StartingSequenceNumber":
"49559266461543273504104037657400164881014714369419771970"
},
"ShardId": "shardId-000000000004"
}
],
"StreamARN": "arn:aws:kinesis:us-east-1:12345678901:stream/myStream",
"StreamName": "myStream",
"StreamStatus": "ACTIVE"
}
}
Después de implementar la API, puede realizar una solicitud REST a este método de la API:
GET https://your-api-id.execute-api.region.amazonaws.com/stage/streams/myStream
HTTP/1.1
Host: your-api-id.execute-api.region.amazonaws.com
Content-Type: application/json
Authorization: ...
X-Amz-Date: 20160323T194451Z
151
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Content-Type: 'x-amz-json-1.1'
La tarea sigue el mismo procedimiento para configurar el mapeo del parámetro de solicitud que el
método GET /streams.
3. Añada la siguiente plantilla de mapeo de cuerpo para mapear los datos de la solicitud del método
POST /streams/{stream-name} a la solicitud de integración POST /?Action=CreateStream:
{
"ShardCount": #if($input.path('$.ShardCount') == '') 5 #else
$input.path('$.ShardCount') #end,
"StreamName": "$input.params('stream-name')"
}
Después de implementar la API, también puede realizar una solicitud de API de REST al método
POST en un recurso Stream para invocar la acción CreateStream en Kinesis:
POST https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream
HTTP/1.1
Host: your-api-id.execute-api.region.amazonaws.com
Content-Type: application/json
Authorization: ...
X-Amz-Date: 20160323T194451Z
{
"ShardCount": 5
}
Content-Type: 'x-amz-json-1.1'
La tarea sigue el mismo procedimiento para configurar el mapeo del parámetro de solicitud que el
método GET /streams.
3. Añada la siguiente plantilla de mapeo de cuerpo para mapear los datos de la solicitud de
método DELETE /streams/{stream-name} a la solicitud de integración de POST /?
Action=DeleteStream correspondiente:
152
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"StreamName": "$input.params('stream-name')"
}
Después de implementar la API, también puede realizar la siguiente solicitud API de REST al método
DELETE en el recurso Stream para llamar a la acción DeleteStream en Kinesis:
DELETE https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream
HTTP/1.1
Host: your-api-id.execute-api.region.amazonaws.com
Content-Type: application/json
Authorization: ...
X-Amz-Date: 20160323T194451Z
{}
{
"Records": [
{
"Data": blob,
"ExplicitHashKey": "string",
"PartitionKey": "string"
}
],
"StreamName": "string"
}
o bien
153
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes
{
"Data": blob,
"ExplicitHashKey": "string",
"PartitionKey": "string",
"SequenceNumberForOrdering": "string",
"StreamName": "string"
}
Aquí, StreamName identifica el flujo de destino para añadir registros. StreamName, Data y
PartitionKey son datos de entrada necesarios. En nuestro ejemplo, usamos los valores
predeterminados para todos los datos de entrada opcionales y no especificaremos de forma explícita los
valores para ellos en la entrada de la solicitud del método.
{
"ShardIterator": "string",
"Limit": number
}
Aquí, el flujo de origen del que se obtienen los registros se especifica en el valor de ShardIterator
necesario, tal y como se muestra en la siguiente acción de Kinesis para obtener un iterador de fragmento:
{
"ShardId": "string",
"ShardIteratorType": "string",
"StartingSequenceNumber": "string",
"StreamName": "string"
}
Para las acciones GetRecords y PutRecords, exponemos los métodos GET y PUT, respectivamente,
en un recurso /records que se añade a un recurso de flujo con nombre (/{stream-name}). Del mismo
modo, exponemos la acción PutRecord como un método PUT en un recurso /record.
Como la acción GetRecords toma como entrada un valor de ShardIterator, que se obtiene
llamando a la acción auxiliar GetShardIterator, exponemos un método auxiliar GET en un recurso
ShardIterator (/sharditerator).
154
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
En la siguiente ilustración se muestra la estructura de API de los recursos después de crear los métodos:
Los siguientes cuatro procedimientos describen cómo configurar cada uno de los métodos, cómo asignar
datos desde las solicitudes de método a las solicitudes de integración y cómo probar los métodos.
155
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Content-Type: 'x-amz-json-1.1'
La tarea sigue el mismo procedimiento para configurar el mapeo del parámetro de solicitud que el
método GET /streams.
3. Añada la siguiente plantilla de mapeo de cuerpo para mapear los datos de la solicitud de
método PUT /streams/{stream-name}/record a la solicitud de integración de POST /?
Action=PutRecord correspondiente:
{
"StreamName": "$input.params('stream-name')",
"Data": "$util.base64Encode($input.json('$.Data'))",
"PartitionKey": "$input.path('$.PartitionKey')"
}
En esta plantilla de asignación se asume que la carga del método de solicitud tiene el siguiente
formato:
{
"Data": "some data",
"PartitionKey": "some key"
156
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PutRecord proxy single-record payload",
"type": "object",
"properties": {
"Data": { "type": "string" },
"PartitionKey": { "type": "string" }
}
}
Puede crear un modelo para incluir este esquema y utilizar el modelo para facilitar la generación de
la plantilla de asignación. Sin embargo, puede generar una plantilla de asignación sin usar ningún
modelo.
4. Para probar el método PUT /streams/{stream-name}/record, establezca la variable de ruta
stream-name en el nombre de un flujo existente, introduzca la carga del formato necesario y, a
continuación, envíe la solicitud de método. El resultado correcto es una respuesta 200 OK con una
carga con el formato siguiente:
{
"SequenceNumber": "49559409944537880850133345460169886593573102115167928386",
"ShardId": "shardId-000000000004"
}
157
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Content-Type: 'x-amz-json-1.1'
La tarea sigue el mismo procedimiento para configurar el mapeo del parámetro de solicitud que el
método GET /streams.
3. Añada la siguiente plantilla de mapeo de cuerpo para mapear los datos de la solicitud de
método PUT /streams/{stream-name}/records a la solicitud de integración de POST /?
Action=PutRecords correspondiente:
{
"StreamName": "$input.params('stream-name')",
"Records": [
#foreach($elem in $input.path('$.records'))
{
"Data": "$util.base64Encode($elem.data)",
"PartitionKey": "$elem.partition-key"
}#if($foreach.hasNext),#end
#end
]
}
158
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
Esta plantilla de mapeo asume que el siguiente esquema JSON puede modelar la carga de la solicitud
de método:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PutRecords proxy payload data",
"type": "object",
"properties": {
"records": {
"type": "array",
"items": {
"type": "object",
"properties": {
"data": { "type": "string" },
"partition-key": { "type": "string" }
}
}
}
}
}
Puede crear un modelo para incluir este esquema y utilizar el modelo para facilitar la generación de
la plantilla de asignación. Sin embargo, puede generar una plantilla de asignación sin usar ningún
modelo.
En este tutorial, hemos usado dos formatos de carga ligeramente diferentes para ilustrar que un
desarrollador de API puede optar por exponer el formato de datos de backend al cliente u ocultárselo.
Un formato es para el método PUT /streams/{stream-name}/records (anterior). Otro formato
se utiliza en el método PUT /streams/{stream-name}/record (en el procedimiento anterior). En
un entorno de producción, debe mantener la coherencia de ambos formatos.
4.
Para probar el método PUT /streams/{stream-name}/records, establezca la variable de ruta
stream-name en un flujo existente, introduzca la siguiente carga y envíe la solicitud del método.
{
"records": [
{
"data": "some data",
"partition-key": "some key"
},
{
"data": "some other data",
"partition-key": "some key"
}
]
}
El resultado correcto es una respuesta 200 OK con una carga similar a la siguiente:
{
"FailedRecordCount": 0,
"Records": [
{
"SequenceNumber": "49559409944537880850133345460167468741933742152373764162",
"ShardId": "shardId-000000000004"
},
{
"SequenceNumber": "49559409944537880850133345460168677667753356781548470338",
159
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"ShardId": "shardId-000000000004"
}
]
}
2.
La acción GetShardIterator requiere una entrada de un valor de ShardId. Para pasar un valor de
ShardId proporcionado por el cliente, añadimos un parámetro de consulta shard-id a la solicitud
del método, tal y como se muestra a continuación:
160
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"ShardId": "$input.params('shard-id')",
"ShardIteratorType": "TRIM_HORIZON",
"StreamName": "$input.params('stream-name')"
}
4. Con la opción Test (Prueba) de la consola de API Gateway, escriba un nombre de flujo existente
como el valor de la variable stream-name de Path (Ruta), establezca shard-id para Query string
(Cadena de consulta) en un valor ShardId existente (por ejemplo, shard-000000000004) y elija
Test (Prueba).
161
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
{
"ShardIterator": "AAAAAAAAAAFYVN3VlFy..."
}
2.
La acción GetRecords requiere una entrada de un valor de ShardIterator. Para pasar un valor
de ShardIterator proporcionado por el cliente, añadimos un parámetro de encabezado Shard-
Iterator a la solicitud del método, tal y como se muestra a continuación:
162
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
3. Configure la siguiente plantilla de mapeo para asignar el valor del parámetro de encabezado Shard-
Iterator al valor de la propiedad ShardIterator de la carga JSON de la GetRecords acción en
Kinesis.
{
"ShardIterator": "$input.params('Shard-Iterator')"
}
4. Con la opción Test (Prueba) de la consola de API Gateway, escriba un nombre de flujo existente
como el valor de la variable stream-name de Path (Ruta), establezca Shard-Iteratorpara Header
(Encabezado) en el valor ShardIterator obtenido de la serie de pruebas del método GET /
streams/{stream-name}/sharditerator (arriba) y elija Test (Prueba).
{
"MillisBehindLatest": 0,
"NextShardIterator": "AAAAAAAAAAF...",
"Records": [ ... ]
}
163
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
OpenAPI 3.0
{
"openapi": "3.0.0",
"info": {
"title": "KinesisProxy",
"version": "2016-03-31T18:25:32Z"
},
"paths": {
"/streams/{stream-name}/sharditerator": {
"get": {
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "shard-id",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardId\": \"$input.params('shard-
id')\",\n \"ShardIteratorType\": \"TRIM_HORIZON\",\n \"StreamName\":
\"$input.params('stream-name')\"\n}"
},
164
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}/records": {
"get": {
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "Shard-Iterator",
"in": "header",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardIterator\": \"$input.params('Shard-
Iterator')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"put": {
"parameters": [
{
"name": "Content-Type",
"in": "header",
"schema": {
"type": "string"
}
},
{
165
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
}
},
"application/x-amz-json-1.1": {
"schema": {
"$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\",\n \"Records\": [\n {\n \"Data\":
\"$util.base64Encode($elem.data)\",\n \"PartitionKey\": \"$elem.partition-
key\"\n }#if($foreach.hasNext),#end\n ]\n}",
"application/x-amz-json-1.1": "{\n \"StreamName\":
\"$input.params('stream-name')\",\n \"records\" : [\n {\n \"Data
\" : \"$elem.data\",\n \"PartitionKey\" : \"$elem.partition-key\"\n
}#if($foreach.hasNext),#end\n ]\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}": {
"get": {
"parameters": [
{
166
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"post": {
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
"responses": {
"default": {
167
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardCount\": 5,\n \"StreamName\":
\"$input.params('stream-name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"delete": {
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
},
"400": {
"description": "400 response",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
},
"content": {}
},
"500": {
"description": "500 response",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
},
"content": {}
}
},
168
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
"responses": {
"4\\d{2}": {
"statusCode": "400",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
},
"5\\d{2}": {
"statusCode": "500",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}/record": {
"put": {
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
169
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\",\n \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n
\"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams": {
"get": {
"responses": {
"200": {
"description": "200 response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
}
},
"components": {
"schemas": {
"Empty": {
"type": "object"
},
"PutRecordsMethodRequestPayload": {
"type": "object",
"properties": {
"records": {
"type": "array",
"items": {
"type": "object",
170
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"properties": {
"data": {
"type": "string"
},
"partition-key": {
"type": "string"
}
}
}
}
}
}
}
}
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"version": "2016-03-31T18:25:32Z",
"title": "KinesisProxy"
},
"basePath": "/test",
"schemes": [
"https"
],
"paths": {
"/streams": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
171
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"/streams/{stream-name}": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
172
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardCount\": 5,\n \"StreamName\":
\"$input.params('stream-name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"delete": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Content-Type": {
"type": "string"
}
}
},
"400": {
"description": "400 response",
"headers": {
"Content-Type": {
"type": "string"
}
}
},
"500": {
"description": "500 response",
"headers": {
"Content-Type": {
"type": "string"
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
173
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"responses": {
"4\\d{2}": {
"statusCode": "400",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
},
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
},
"5\\d{2}": {
"statusCode": "500",
"responseParameters": {
"method.response.header.Content-Type":
"integration.response.header.Content-Type"
}
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}/record": {
"put": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
"responses": {
"default": {
"statusCode": "200"
174
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\",\n \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n
\"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}/records": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "Shard-Iterator",
"in": "header",
"required": false,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardIterator\": \"$input.params('Shard-
Iterator')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
},
"put": {
175
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"consumes": [
"application/json",
"application/x-amz-json-1.1"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "Content-Type",
"in": "header",
"required": false,
"type": "string"
},
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
},
{
"in": "body",
"name": "PutRecordsMethodRequestPayload",
"required": true,
"schema": {
"$ref": "#/definitions/PutRecordsMethodRequestPayload"
}
},
{
"in": "body",
"name": "PutRecordsMethodRequestPayload",
"required": true,
"schema": {
"$ref": "#/definitions/PutRecordsMethodRequestPayload"
}
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"StreamName\": \"$input.params('stream-
name')\",\n \"Records\": [\n {\n \"Data\":
\"$util.base64Encode($elem.data)\",\n \"PartitionKey\": \"$elem.partition-
key\"\n }#if($foreach.hasNext),#end\n ]\n}",
"application/x-amz-json-1.1": "{\n \"StreamName\":
\"$input.params('stream-name')\",\n \"records\" : [\n {\n \"Data
\" : \"$elem.data\",\n \"PartitionKey\" : \"$elem.partition-key\"\n
}#if($foreach.hasNext),#end\n ]\n}"
176
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
},
"/streams/{stream-name}/sharditerator": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "stream-name",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "shard-id",
"in": "query",
"required": false,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"type": "aws",
"credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
"uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
},
"requestTemplates": {
"application/json": "{\n \"ShardId\": \"$input.params('shard-
id')\",\n \"ShardIteratorType\": \"TRIM_HORIZON\",\n \"StreamName\":
\"$input.params('stream-name')\"\n}"
},
"passthroughBehavior": "when_no_match",
"httpMethod": "POST"
}
}
}
},
"definitions": {
"Empty": {
"type": "object"
},
"PutRecordsMethodRequestPayload": {
"type": "object",
"properties": {
177
Amazon API Gateway Guía del desarrollador
Tutorial: Creación de una API de
REST como proxy de Amazon Kinesis
"records": {
"type": "array",
"items": {
"type": "object",
"properties": {
"data": {
"type": "string"
},
"partition-key": {
"type": "string"
}
}
}
}
}
}
}
}
178
Amazon API Gateway Guía del desarrollador
Desarrollo
Puede utilizar las API HTTP para enviar solicitudes a las funciones de AWS Lambda o a cualquier punto de
enlace de HTTP enrutable.
Por ejemplo, puede crear una API HTTP que se integre con una función de Lambda en el backend.
Cuando un cliente llama a la API, API Gateway envía la solicitud a la función de Lambda y devuelve la
respuesta de la función al cliente.
Las API HTTP son compatibles con la autorización de OpenID Connect y OAuth 2.0. Vienen con soporte
integrado para el uso compartido de recursos entre orígenes (CORS) y las implementaciones automáticas.
Puede crear API HTTP mediante la consola de administración de AWS, la CLI de AWS, las API, AWS
CloudFormation o los SDK. Las API HTTP utilizan API versión 2 de API Gateway, que anteriormente solo
admitían las API de WebSocket.
Temas
• Desarrollo de una API HTTP en API Gateway (p. 179)
• Publicación de una API HTTP para que los clientes la invoquen (p. 215)
• Protección de la API HTTP (p. 219)
• Monitoreo de la API HTTP (p. 224)
• Solución de problemas con las API HTTP (p. 232)
A medida que se desarrolla la API de API Gateway, se decide sobre una serie de características de la API.
Estas características dependen del uso de la API. Por ejemplo, es posible que quiera permitir solo a ciertos
clientes llamar a la API o puede que quiera que esté disponible para todos. Puede querer que una llamada
a la API ejecute una función de Lambda, haga una consulta a la base de datos o llame a una aplicación.
Temas
• Creación de una API HTTP (p. 179)
• Uso de rutas para API HTTP (p. 180)
• Control y administración del acceso a una API HTTP en API Gateway (p. 182)
• Configuración de integraciones para API HTTP (p. 190)
• Configuración de CORS para una API HTTP (p. 203)
• Transformación de solicitudes y respuestas de API (p. 204)
• Uso de definiciones de OpenAPI para API HTTP (p. 209)
179
Amazon API Gateway Guía del desarrollador
Rutas
En los siguientes ejemplos se muestra cómo crear una API con una integración de AWS Lambda o HTTP,
una ruta y una etapa predeterminada configurada para implementar automáticamente los cambios.
Temas
• Crear una API HTTP mediante la consola de administración de AWS (p. 180)
• Crear una API HTTP mediante la CLI de AWS (p. 180)
La API ya está lista para su invocación. Puede probar la API escribiendo su URL de invocación en un
navegador o con Curl.
curl https://api-id.execute-api.us-east-2.amazonaws.com
Example
La API ya está lista para su invocación. Puede probar la API escribiendo su URL de invocación en un
navegador o con Curl.
curl https://api-id.execute-api.us-east-2.amazonaws.com
180
Amazon API Gateway Guía del desarrollador
Rutas
específicos para su ruta. O bien, puede utilizar el método ANY para que coincida con todos los métodos
que no haya definido para un recurso. Puede crear una ruta $default que actúe como método catch-all
para las solicitudes que no coincidan con ninguna otra ruta.
Por ejemplo, la ruta GET /pets/{petID} captura una solicitud GET que un cliente envía a
https://api-id.execute-api.us-east-2.amazonaws.com/pets/6.
Una variable de ruta ambiciosa captura todos los recursos secundarios de una ruta. Para crear una
variable de ruta ambiciosa, agregue + al nombre de la variable, por ejemplo, {proxy+}. La variable de
ruta expansiva debe estar al final de la ruta del recurso.
Cuando la ruta $default recibe una solicitud, API Gateway envía la ruta de solicitud completa a la
integración. Por ejemplo, puede crear una API con solo una ruta $default e integrarla en el método ANY
con el punto de enlace HTTP https://petstore-demo-endpoint.execute-api.com. Cuando envía
una solicitud a https://api-id.execute-api.us-east-2.amazonaws.com/store/checkout,
API Gateway envía una solicitud a https://petstore-demo-endpoint.execute-api.com/store/
checkout.
Para obtener más información acerca de las integraciones de HTTP, consulte Uso de integraciones de
proxy de HTTP para API HTTP (p. 195).
Después de seleccionar una etapa, API Gateway selecciona una ruta. API Gateway selecciona la ruta con
la coincidencia más específica y aplica las siguientes prioridades:
Si ninguna ruta coincide con una solicitud, API Gateway devuelve {"message":"Not Found"} al cliente.
Por ejemplo, piense en una API con una etapa $default y las siguientes rutas de ejemplo:
1. GET /pets/dog/1
181
Amazon API Gateway Guía del desarrollador
Control de acceso
2. GET /pets/dog/{id}
3. GET /pets/{proxy+}
4. ANY /{proxy+}
5. $default
En la siguiente tabla se resume la forma en que API Gateway enruta las solicitudes a las rutas de
ejemplo.
• Los autorizadores de Lambda utilizan las funciones de Lambda para controlar el acceso a las API. Para
obtener más información, consulte Uso de autorizadores de AWS Lambda para API HTTP (p. 182).
• Los autorizadores de JWT utilizan tokens web JSON para controlar el acceso a las API. Para obtener
más información, consulte Control del acceso a las API HTTP con autorizadores de JWT (p. 189).
• Los roles y políticas estándar de AWS IAM ofrecen controles de acceso flexibles y sólidos. Puede usar
roles y políticas de IAM para controlar quién puede crear y administrar sus API, así como quién puede
invocarlas. Para obtener más información, consulte Uso de la autorización de IAM (p. 190).
182
Amazon API Gateway Guía del desarrollador
Control de acceso
2.0
{
"version": "2.0",
"type": "REQUEST",
"routeArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request",
"identitySource": ["user1", "123"],
"routeKey": "$default",
"rawPath": "/my/path",
"rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value",
"cookies": ["cookie1", "cookie2"],
"headers": {
"Header1": "value1",
"Header2": "value2"
},
"queryStringParameters": {
"parameter1": "value1,value2",
"parameter2": "value"
},
"requestContext": {
"accountId": "123456789012",
"apiId": "api-id",
"authentication": {
"clientCert": {
"clientCertPem": "CERT_CONTENT",
"subjectDN": "www.example.com",
"issuerDN": "Example issuer",
"serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
"validity": {
"notBefore": "May 28 12:30:02 2019 GMT",
"notAfter": "Aug 5 09:36:04 2021 GMT"
}
}
},
"domainName": "id.execute-api.us-east-1.amazonaws.com",
"domainPrefix": "id",
"http": {
"method": "POST",
"path": "/my/path",
"protocol": "HTTP/1.1",
"sourceIp": "IP",
"userAgent": "agent"
},
"requestId": "id",
"routeKey": "$default",
"stage": "$default",
"time": "12/Mar/2020:19:03:58 +0000",
"timeEpoch": 1583348638390
},
"pathParameters": { "parameter1": "value1" },
"stageVariables": { "stageVariable1": "value1", "stageVariable2": "value2" }
}
183
Amazon API Gateway Guía del desarrollador
Control de acceso
1.0
{
"version": "1.0",
"type": "REQUEST",
"methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request",
"identitySource": "user1,123",
"authorizationToken": "user1,123",
"resource": "/request",
"path": "/request",
"httpMethod": "GET",
"headers": {
"X-AMZ-Date": "20170718T062915Z",
"Accept": "*/*",
"HeaderAuth1": "headerValue1",
"CloudFront-Viewer-Country": "US",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Is-Mobile-Viewer": "false",
"User-Agent": "..."
},
"queryStringParameters": {
"QueryString1": "queryValue1"
},
"pathParameters": {},
"stageVariables": {
"StageVar1": "stageValue1"
},
"requestContext": {
"path": "/request",
"accountId": "123456789012",
"resourceId": "05c7jb",
"stage": "test",
"requestId": "...",
"identity": {
"apiKey": "...",
"sourceIp": "...",
"clientCert": {
"clientCertPem": "CERT_CONTENT",
"subjectDN": "www.example.com",
"issuerDN": "Example issuer",
"serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
"validity": {
"notBefore": "May 28 12:30:02 2019 GMT",
"notAfter": "Aug 5 09:36:04 2021 GMT"
}
}
},
"resourcePath": "/request",
"httpMethod": "GET",
"apiId": "abcdef123"
}
}
184
Amazon API Gateway Guía del desarrollador
Control de acceso
la política. Para obtener algunos ejemplos de políticas de IAM, consulte the section called “ Controlar el
acceso para invocar una API” (p. 294). El objeto context es opcional. Puede transmitir propiedades de
contexto a integraciones o registros de acceso de Lambda mediante $context.authorizer.property.
Para obtener más información, consulte the section called “Variables de registro” (p. 228).
Example
{
"principalId": "abcdef", // The principal user identification associated with the token
sent by the client.
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow|Deny",
"Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/
[{resource}/[{child-resources}]]"
}
]
},
"context": {
"exampleKey": "exampleValue"
}
}
Si elige la versión de formato 2.0, puede devolver un valor booleano o una política de IAM que utilice
la sintaxis de la política de IAM estándar de la función de Lambda. Para devolver un valor booleano,
habilite respuestas simples para el autorizador. Los siguientes ejemplos muestran el formato que
debe utilizar para codificar la devolución de la función de Lambda. El objeto context es opcional.
Puede transmitir propiedades de contexto a integraciones o registros de acceso de Lambda mediante
$context.authorizer.property. Para obtener más información, consulte the section called
“Variables de registro” (p. 228).
Simple response
{
"isAuthorized": true/false,
"context": {
"exampleKey": "exampleValue"
}
}
IAM policy
{
"principalId": "abcdef", // The principal user identification associated with the
token sent by the client.
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow|Deny",
"Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/
{httpVerb}/[{resource}/[{child-resources}]]"
}
]
},
185
Amazon API Gateway Guía del desarrollador
Control de acceso
"context": {
"exampleKey": "exampleValue"
}
}
Simple response
return response;
};
IAM policy
186
Amazon API Gateway Guía del desarrollador
Control de acceso
Fuentes de identidad
Opcionalmente, puede especificar orígenes de identidad para un autorizador de Lambda. Los orígenes de
identidad especifican la ubicación de los datos necesarios para autorizar una solicitud. Por ejemplo, puede
especificar valores de cabecera o cadena de consulta como orígenes de identidad. Si especifica orígenes
de identidad, los clientes deben incluirlos en la solicitud. Si la solicitud del cliente no incluye los orígenes
de identidad, API Gateway no invoca el autorizador de Lambda y el cliente recibe un error 401. Se admiten
los siguientes orígenes de identidad:
Expresiones de selección
187
Amazon API Gateway Guía del desarrollador
Control de acceso
API Gateway utiliza los orígenes de identidad del autorizador como clave de caché. Si un cliente especifica
los mismos parámetros en orígenes de identidad dentro del TTL configurado, API Gateway utiliza el
resultado del autorizador almacenado en caché, en lugar de invocar su función de Lambda.
Para habilitar el almacenamiento en caché, el autorizador debe tener al menos un origen de identidad.
Si habilita respuestas simples para un autorizador, la respuesta del autorizador permite o deniega
completamente todas las solicitudes de la API que coincidan con los valores de origen de identidad
almacenados en caché. Para obtener permisos pormenorizados, desactive las respuestas simples y
devuelva una política de IAM.
De forma predeterminada, API Gateway utiliza la respuesta del autorizador almacenada en caché para
todas las rutas de una API que utiliza el autorizador. Para almacenar en caché las respuestas por ruta,
agregue $context.routeKey a las fuentes de identidad del autorizador.
El siguiente comando otorga permiso a API Gateway para invocar la función de Lambda. Si API Gateway
no tiene permiso para invocar la función, los clientes reciben un 500 Internal Server Error.
Una vez se haya creado un autorizador y concedido permiso a API Gateway para invocarlo, actualice la
ruta para poder utilizarlo.
Para solucionar errores, habilite el registro de acceso (p. 226) en la etapa de la API. Incluya la variable
de registro $context.authorizer.error en su formato de registro.
188
Amazon API Gateway Guía del desarrollador
Control de acceso
Si los registros indican que API Gateway no tiene permiso para invocar la función, actualice la política de
recursos de la función o proporcione un rol de IAM para conceder permiso a API Gateway para invocar el
autorizador.
Si los registros indican que la función de Lambda devuelve una respuesta no válida, compruebe que la
función de Lambda devuelve una respuesta en el formato requerido (p. 184).
Si configura un autorizador de JWT para una ruta de la API, API Gateway valida los JWT que los clientes
envían con solicitudes de la API. API Gateway permite o deniega las solicitudes en función de la validación
del token y, opcionalmente, de los ámbitos del token. Si configura ámbitos para una ruta, el token debe
incluir al menos uno de los ámbitos de la ruta.
Puede configurar distintos autorizadores para cada ruta de una API o utilizar el mismo autorizador para
varias rutas.
Note
No existe ningún mecanismo estándar para diferenciar los tokens de acceso de JWT de otros
tipos de JWT, como los tokens de ID de OpenID Connect. A menos que necesite tokens de ID
para la autorización de la API, le recomendamos que configure las rutas para que soliciten los
ámbitos de la autorización. También puede configurar los autorizadores de JWT para que soliciten
los emisores o los destinatarios que el proveedor de identidades utiliza solo al emitir tokens de
acceso de JWT.
Después de validar el JWT, API Gateway transfiere las reclamaciones del token a la integración de la ruta
de la API. Los recursos de backend, como las funciones de Lambda, pueden acceder a las reclamaciones
189
Amazon API Gateway Guía del desarrollador
Integraciones
El siguiente comando crea un autorizador de JWT que utiliza Amazon Cognito como proveedor de
identidad. Para Audience, especifique el ID de un cliente asociado al grupo de usuarios que especifique
para Issuer.
Actualizar una ruta para utilizar un autorizador de JWT a través de la CLI de AWS
El siguiente comando actualiza una ruta para utilizar un autorizador de JWT.
La autorización de IAM para las API HTTP es similar a la de las API de REST (p. 294).
Para obtener ejemplos de políticas de IAM que otorgan a los clientes el permiso para invocar las API,
consulte the section called “ Controlar el acceso para invocar una API” (p. 294).
190
Amazon API Gateway Guía del desarrollador
Integraciones
POST para la ruta /signup de la API para que se integre con una función de Lambda que se encarga del
registro de clientes.
Temas
• Uso de integraciones de proxy de AWS Lambda para las API HTTP (p. 191)
• Uso de integraciones de proxy de HTTP para API HTTP (p. 195)
• Uso de integraciones de servicios de AWS para API HTTP (p. 195)
• Uso de integraciones privadas para API HTTP (p. 201)
2.0
{
"version": "2.0",
"routeKey": "$default",
"rawPath": "/my/path",
"rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value",
"cookies": [
"cookie1",
"cookie2"
],
"headers": {
"Header1": "value1",
"Header2": "value1,value2"
},
"queryStringParameters": {
"parameter1": "value1,value2",
"parameter2": "value"
},
"requestContext": {
"accountId": "123456789012",
191
Amazon API Gateway Guía del desarrollador
Integraciones
"apiId": "api-id",
"authentication": {
"clientCert": {
"clientCertPem": "CERT_CONTENT",
"subjectDN": "www.example.com",
"issuerDN": "Example issuer",
"serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
"validity": {
"notBefore": "May 28 12:30:02 2019 GMT",
"notAfter": "Aug 5 09:36:04 2021 GMT"
}
}
},
"authorizer": {
"jwt": {
"claims": {
"claim1": "value1",
"claim2": "value2"
},
"scopes": [
"scope1",
"scope2"
]
}
},
"domainName": "id.execute-api.us-east-1.amazonaws.com",
"domainPrefix": "id",
"http": {
"method": "POST",
"path": "/my/path",
"protocol": "HTTP/1.1",
"sourceIp": "IP",
"userAgent": "agent"
},
"requestId": "id",
"routeKey": "$default",
"stage": "$default",
"time": "12/Mar/2020:19:03:58 +0000",
"timeEpoch": 1583348638390
},
"body": "Hello from Lambda",
"pathParameters": {
"parameter1": "value1"
},
"isBase64Encoded": false,
"stageVariables": {
"stageVariable1": "value1",
"stageVariable2": "value2"
}
}
1.0
{
"version": "1.0",
"resource": "/my/path",
"path": "/my/path",
"httpMethod": "GET",
"headers": {
"Header1": "value1",
"Header2": "value2"
},
"multiValueHeaders": {
"Header1": [
"value1"
192
Amazon API Gateway Guía del desarrollador
Integraciones
],
"Header2": [
"value1",
"value2"
]
},
"queryStringParameters": {
"parameter1": "value1",
"parameter2": "value"
},
"multiValueQueryStringParameters": {
"parameter1": [
"value1",
"value2"
],
"parameter2": [
"value"
]
},
"requestContext": {
"accountId": "123456789012",
"apiId": "id",
"authorizer": {
"claims": null,
"scopes": null
},
"domainName": "id.execute-api.us-east-1.amazonaws.com",
"domainPrefix": "id",
"extendedRequestId": "request-id",
"httpMethod": "GET",
"identity": {
"accessKey": null,
"accountId": null,
"caller": null,
"cognitoAuthenticationProvider": null,
"cognitoAuthenticationType": null,
"cognitoIdentityId": null,
"cognitoIdentityPoolId": null,
"principalOrgId": null,
"sourceIp": "IP",
"user": null,
"userAgent": "user-agent",
"userArn": null,
"clientCert": {
"clientCertPem": "CERT_CONTENT",
"subjectDN": "www.example.com",
"issuerDN": "Example issuer",
"serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
"validity": {
"notBefore": "May 28 12:30:02 2019 GMT",
"notAfter": "Aug 5 09:36:04 2021 GMT"
}
}
},
"path": "/my/path",
"protocol": "HTTP/1.1",
"requestId": "id=",
"requestTime": "04/Mar/2020:19:15:17 +0000",
"requestTimeEpoch": 1583349317135,
"resourceId": null,
"resourcePath": "/my/path",
"stage": "$default"
},
"pathParameters": null,
"stageVariables": null,
"body": "Hello from Lambda!",
193
Amazon API Gateway Guía del desarrollador
Integraciones
"isBase64Encoded": false
}
Con la versión de formato 1.0, las integraciones de Lambda deben devolver una respuesta con el
siguiente formato.
Example
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
"body": "..."
}
Con la versión de formato 2.0, API Gateway puede inferir el formato de respuesta por usted. API Gateway
hace las siguientes suposiciones si su función de Lambda devuelve JSON válido y no devuelve un
statusCode:
• isBase64Encoded es false.
• statusCode es 200.
• content-type es application/json.
• body es la respuesta de la función.
Los siguientes ejemplos muestran el resultado de una función de Lambda y la interpretación de API
Gateway.
194
Amazon API Gateway Guía del desarrollador
Integraciones
Para personalizar la respuesta, su función de Lambda debe devolver una respuesta con el siguiente
formato.
{
"cookies" : ["cookie1", "cookie2"],
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "Hello from Lambda!"
}
Para crear una integración de proxy HTTP, proporcione la dirección URL de un punto de enlace HTTP
direccionable públicamente.
Por ejemplo, la ruta /pets/{petID} captura solicitudes a /pets/6. Puede hacer referencia a variables
de ruta en el URI de integración para enviar el contenido de la variable a una integración. Un ejemplo es: /
pets/extentendedpath/{petID}.
Puede usar variables de ruta ambiciosas para capturar todos los recursos secundarios de una ruta. Para
crear una variable de ruta ambiciosa, agregue + al nombre de la variable, por ejemplo, {proxy+}.
Para configurar una ruta con una integración de proxy HTTP que capte todas las solicitudes, cree una ruta
API con una variable de ruta ambiciosa (por ejemplo, /parent/{proxy+}). Integre la ruta con un punto
de enlace HTTP (por ejemplo, https://petstore-demo-endpoint.execute-api.com/petstore/
{proxy}) en el método ANY. La variable de ruta expansiva debe estar al final de la ruta del recurso.
195
Amazon API Gateway Guía del desarrollador
Integraciones
Asignación de parámetros
Cuando se especifica
una ruta JSON, API
Gateway trunca
el cuerpo de la
solicitud en 100 KB
y, a continuación,
aplica la expresión
de selección. Para
enviar cargas de más
de 100 KB, especifique
$request.body.
196
Amazon API Gateway Guía del desarrollador
Integraciones
Para crear una integración de primera clase, elija una acción de servicio de AWS compatible, como SQS-
SendMessage, configure los parámetros de la solicitud y proporcione un rol que otorgue a API Gateway
permisos para invocar la API de servicio de AWS integrada. Dependiendo del subtipo de integración, se
requieren diferentes parámetros de solicitud. Para obtener más información, consulte the section called
“Referencia de integraciones de servicios de AWS” (p. 197).
El siguiente comando de la CLI de AWS crea una integración que envía un mensaje de Amazon SQS.
Subtipos de integración
• EventBridge-PutEvents (p. 197)
• SQS-SendMessage (p. 198)
• SQS-ReceiveMessage (p. 198)
• SQS-DeleteMessage (p. 199)
• SQS-PurgeQueue (p. 199)
• AppConfig-GetConfiguration (p. 199)
• Kinesis-PutRecord (p. 199)
• StepFunctions-StartExecution (p. 200)
• StepFunctions: StartSyncExecution (p. 200)
• StepFunctions-StopExecution (p. 201)
EventBridge-PutEvents
Envía eventos personalizados a Amazon EventBridge para que puedan ajustarse a las reglas.
EventBridge-PutEvents 1.0
Parámetro Obligatorio
Detalle True
DetailType True
Fuente True
Tiempo Falso
EventBusName Falso
197
Amazon API Gateway Guía del desarrollador
Integraciones
Parámetro Obligatorio
Recursos Falso
Región Falso
TraceHeader Falso
Para obtener más información, consulte PutEvents en la Referencia de la API de Amazon EventBridge.
SQS-SendMessage
Entrega un mensaje a la cola especificada.
SQS-SendMessage 1.0
Parámetro Obligatorio
QueueUrl True
MessageBody True
DelaySeconds Falso
MessageAttributes Falso
MessageDeduplicationId Falso
MessageGroupId Falso
MessageSystemAttributes Falso
Región Falso
Para obtener más información, consulte SendMessage en la Referencia de la API de Amazon Simple
Queue Service.
SQS-ReceiveMessage
Recupera uno o varios mensajes (hasta 10) de la cola especificada.
SQS-ReceiveMessage 1.0
Parámetro Obligatorio
QueueUrl True
AttributeNames Falso
MaxNumberOfMessages Falso
MessageAttributeNames Falso
ReceiveRequestAttemptId Falso
VisibilityTimeout Falso
WaitTimeSeconds Falso
Región Falso
198
Amazon API Gateway Guía del desarrollador
Integraciones
Para obtener más información, consulte ReceiveMessage en la Referencia de la API de Amazon Simple
Queue Service.
SQS-DeleteMessage
Elimina el mensaje especificado de la cola especificada.
SQS-DeleteMessage 1.0
Parámetro Obligatorio
ReceiptHandle True
QueueUrl True
Región Falso
Para obtener más información, consulte DeleteMessage en la Referencia de la API de Amazon Simple
Queue Service.
SQS-PurgeQueue
Elimina todos los mensajes de la cola especificada.
SQS-PurgeQueue 1.0
Parámetro Obligatorio
QueueUrl True
Región Falso
Para obtener más información, consulte PurgeQueue en la Referencia de la API de Amazon Simple Queue
Service.
AppConfig-GetConfiguration
Recibe información acerca de una configuración.
AppConfig-GetConfiguration 1.0
Parámetro Obligatorio
Aplicación True
Entorno True
Configuración True
ClientId True
ClientConfigurationVersion Falso
Región Falso
Para obtener más información, consulte GetConfiguration en la Referencia de la API de AWS AppConfig.
Kinesis-PutRecord
Escribe un único registro de datos en un flujo de datos de Amazon Kinesis.
199
Amazon API Gateway Guía del desarrollador
Integraciones
Kinesis-PutRecord 1.0
Parámetro Obligatorio
StreamName True
Datos True
PartitionKey True
SequenceNumberForOrdering Falso
ExplicitHashKey Falso
Región Falso
Para obtener más información, consulte PutRecord en la Referencia de la API de Amazon Kinesis Data
Streams.
StepFunctions-StartExecution
StepFunctions-StartExecution 1.0
Parámetro Obligatorio
StateMachineArn True
Nombre Falso
Input Falso
Región Falso
Para obtener más información, consulte StartExecution en la Referencia de la API de AWS Step Functions.
StepFunctions: StartSyncExecution
Parámetro Obligatorio
StateMachineArn True
Nombre Falso
Input Falso
Región Falso
TraceHeader Falso
Para obtener más información, consulte StartSyncExecution en la Referencia de la API de AWS Step
Functions.
200
Amazon API Gateway Guía del desarrollador
Integraciones
StepFunctions-StopExecution
StepFunctions-StopExecution 1.0
Parámetro Obligatorio
ExecutionArn True
Causa Falso
Error Falso
Región Falso
Para obtener más información, consulte StopExecution en la Referencia de la API de AWS Step Functions.
Puede exponer sus recursos en una VPC para que los clientes fuera de la VPC tengan acceso mediante
integraciones privadas. Puede controlar el acceso a la API mediante cualquiera de los métodos de
autorización (p. 182) admitidos por API Gateway.
Para crear una integración privada, primero debe crear un enlace de la VPC. Para obtener más
información acerca de los enlaces de la VPC, consulte Uso de enlaces de la VPC para API
HTTP (p. 202).
Después de crear un vínculo de VPC, puede configurar integraciones privadas que se conecten a un
balanceador de carga de aplicaciones, a un balanceador de carga de red o a recursos registrados con un
servicio de AWS Cloud Map.
Para crear una integración privada, todos los recursos deben ser propiedad de la misma cuenta de AWS
(incluido el balanceador de carga o el servicio de AWS Cloud Map, el enlace de VPC y la API HTTP).
De forma predeterminada, el tráfico de integración privada utiliza el protocolo HTTP. Puede especificar
tlsConfig si necesita tráfico de integración privada para utilizar HTTPS.
Note
Para integraciones privadas, API Gateway incluye la parte de etapa (p. 215) del punto de enlace
de la API en la solicitud a sus recursos backend. Por ejemplo, una solicitud a la etapa test de
una API incluye test/route-path en la solicitud a su integración privada.
Para crear una integración privada con un balanceador de carga de aplicaciones o un balanceador de
carga de red, cree una integración de proxy HTTP, especifique el enlace de la VPC que se va a utilizar y
proporcione el ARN del agente de escucha del balanceador de carga.
Utilice el siguiente comando para crear una integración privada que se conecte a un equilibrador de carga
mediante un enlace de la VPC.
201
Amazon API Gateway Guía del desarrollador
Integraciones
Para las integraciones con AWS Cloud Map, API Gateway utiliza DiscoverInstances para identificar
recursos. Puede utilizar parámetros de consulta para orientar recursos específicos. Los atributos de los
recursos registrados deben incluir direcciones IP y puertos. API Gateway distribuye las solicitudes entre los
recursos en buen estado que se devuelven desde DiscoverInstances. Para obtener más información,
consulte DiscoverInstances en la Referencia de la API de AWS Cloud Map.
Note
Si utiliza Amazon ECS para rellenar entradas en AWS Cloud Map, debe configurar su tarea de
Amazon ECS para utilizar registros SRV. Los registros "A" no son compatibles. Para obtener más
información, consulte Configuración del servicio para utilizar la detección de servicios en la guía
para desarrolladores de Amazon Elastic Container Service.
Para crear una integración privada con AWS Cloud Map, cree una integración de proxy de HTTP,
especifique el enlace de la VPC que desea utilizar y proporcione el ARN del servicio de AWS Cloud Map.
Utilice el siguiente comando para crear una integración privada que utilice la detección de servicios de
AWS Cloud Map para identificar recursos.
Una integración privada utiliza el enlace de la VPC para encapsular las conexiones entre API Gateway y
los recursos de la VPC de destino. Puede reutilizar enlaces de la VPC a través de diferentes rutas y API.
Cuando crea un enlace de la VPC, API Gateway crea y administra interfaces de red elástica para el enlace
de la VPC en su cuenta. Este proceso puede tardar unos minutos. Cuando un enlace de VPC está listo
para usar, su estado cambia de PENDING a AVAILABLE.
Note
Si no se envía tráfico a través del enlace de la VPC durante 60 días, se convierte en INACTIVE.
Cuando un enlace de la VPC tiene el estado INACTIVE, API Gateway elimina todas las interfaces
de red del enlace de la VPC. Esto hace que las solicitudes de API que dependen del enlace de
la VPC fallen. Si las solicitudes de la API se reanudan, API Gateway reaprovisiona las interfaces
202
Amazon API Gateway Guía del desarrollador
CORS
de red. Puede tardar unos minutos en crear las interfaces de red y reactivar el enlace de la VPC.
Puede utilizar el estado del enlace de la VPC para supervisar el estado del enlace de la VPC.
Note
Los enlaces de la VPC son inmutables. Después de crear un enlace de la VPC, no puede cambiar
sus subredes o grupos de seguridad.
Por lo general, se necesita CORS para crear aplicaciones web que acceden a las API alojadas en
un dominio u origen distinto. Puede habilitar CORS para permitir las solicitudes a la API desde una
aplicación web alojada en un dominio distinto. Por ejemplo, si la API está alojada en https://
{api_id}.execute-api.{region}.amazonaws.com/ y desea llamar a la API desde una aplicación
web alojada en example.com, la API debe ser compatible con CORS.
Si configura CORS para una API, API Gateway envía automáticamente una respuesta a las solicitudes
OPTIONS preliminares, incluso si no hay ninguna ruta OPTIONS configurada para la API. En una
solicitud de CORS, API Gateway agrega los encabezados de CORS configurados a la respuesta de una
integración.
Note
Si configura CORS para una API, API Gateway ignora los encabezados de CORS devueltos por
su integración de backend.
203
Amazon API Gateway Guía del desarrollador
Asignación de parámetros
Configurar CORS para una API HTTP con una ruta $default y
un autorizador de JWT
Puede habilitar CORS y configurar la autorización para cualquier ruta de una API HTTP. Cuando habilita
CORS y la autorización para la ruta $default, hay que tener en cuenta algunas consideraciones
especiales. La ruta $default captura las solicitudes de todos los métodos y rutas que no haya definido
explícitamente, incluidas las solicitudes OPTIONS. Para admitir las solicitudes OPTIONS no autorizadas,
agregue una ruta OPTIONS /{proxy+} a su API que no requiera autorización. La ruta OPTIONS /
{proxy+} tiene mayor prioridad que la ruta $default. Como resultado, permite a los clientes enviar
solicitudes OPTIONS a su API sin autorización. Para obtener más información acerca de las prioridades de
enrutamiento, consulte Enrutamiento de solicitudes de la API (p. 181).
Example
Para obtener más información, consulte CORS en la Referencia de la API de Amazon API Gateway
Versión 2.
Los parámetros de solicitud son un mapa de valor-clave. La clave identifica la ubicación del parámetro de
solicitud que se va a cambiar y cómo cambiarlo. El valor especifica los datos nuevos para el parámetro.
204
Amazon API Gateway Guía del desarrollador
Asignación de parámetros
Tipo Sintaxis
Header append|overwrite|
remove:header.headername
Ruta overwrite:path
En la siguiente tabla se muestran los valores admitidos que se pueden mapear a los parámetros.
Cuando se especifica
una ruta JSON, API
Gateway trunca
el cuerpo de la
solicitud en 100 KB
y, a continuación,
aplica la expresión
de selección. Para
205
Amazon API Gateway Guía del desarrollador
Asignación de parámetros
Los parámetros de respuesta se configuran para cada código de estado que devuelve la integración. Los
parámetros de respuesta son un mapa de valor-clave. La clave identifica la ubicación del parámetro de
solicitud que se va a cambiar y cómo cambiarlo. El valor especifica los datos nuevos para el parámetro.
Tipo Sintaxis
Header append|overwrite|
remove:header.headername
En la siguiente tabla se muestran los valores admitidos que se pueden mapear a los parámetros.
206
Amazon API Gateway Guía del desarrollador
Asignación de parámetros
Cuando se especifica
una ruta JSON, API
Gateway trunca
el cuerpo de la
solicitud en 100 KB
y, a continuación,
aplica la expresión
de selección. Para
enviar cargas de más
de 100 KB, especifique
$response.body.
Encabezados reservados
Los siguientes encabezados están reservados. No puede configurar mapeos de solicitud o respuesta para
estos encabezados.
• access-control-*
• apigw-*
• Autorización
• Conexión
• Content-Encoding
• Longitud del contenido
• Content-Location
• Forwarded
• Keep-Alive
• Origen
• Proxy-Authenticate
• Proxy-Authorization
207
Amazon API Gateway Guía del desarrollador
Asignación de parámetros
• TE
• Trailers
• Transfer-Encoding
• Upgrade
• x-amz-*
• x-amzn-*
• X-Forwarded-For
• X-Forwarded-Host
• X-Forwarded-Proto
• Via
Ejemplos
En los siguientes ejemplos de la CLI de AWS se configuran mapeos de parámetros. Por ejemplo, plantillas
de AWS CloudFormation, consulte GitHub.
208
Amazon API Gateway Guía del desarrollador
OpenAPI
--integration-uri 'https://api.example.com' \
--integration-method ANY \
--response-parameters '{"500" : {"append:header.header1": "$context.requestId",
"overwrite:statuscode" : "403"}, "404" : {"append:header.error" :
"$stageVariables.environmentId"} }
Para migrar desde una API de REST a una API HTTP, puede exportar la API de REST como un archivo
de definición de OpenAPI 3.0. A continuación, importe la definición de la API como una API HTTP. Para
obtener más información acerca de cómo exportar una API de REST, consulte Exportación de una API
REST desde API Gateway (p. 507).
Note
Las API HTTP admiten las mismas variables de AWS que las API de REST. Para obtener más
información, consulte Variables de AWS para la importación de OpenAPI (p. 506).
Información
Una propiedad es válida de acuerdo con la especificación de OpenAPI, pero dicha propiedad no es
compatible con las API HTTP.
Por ejemplo, el siguiente fragmento de OpenAPI 3.0 genera información en la importación porque
las API HTTP no son compatibles con la validación de solicitudes. API Gateway ignora los campos
requestBody y schema.
"paths": {
"/": {
"get": {
209
Amazon API Gateway Guía del desarrollador
OpenAPI
"x-amazon-apigateway-integration": {
"type": "AWS_PROXY",
"httpMethod": "POST",
"uri": "arn:aws:lambda:us-east-2:123456789012:function:HelloWorld",
"payloadFormatVersion": "1.0"
},
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Body"
}
}
}
}
}
}
...
},
"components": {
"schemas": {
"Body": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
}
}
...
}
...
}
Advertencia
El siguiente documento de OpenAPI 3.0 genera advertencias en la importación porque las API HTTP
solo son compatibles con integraciones de proxy de Lambda y proxy de HTTP.
"x-amazon-apigateway-integration": {
"type": "AWS",
"httpMethod": "POST",
"uri": "arn:aws:lambda:us-east-2:123456789012:function:HelloWorld",
"payloadFormatVersion": "1.0"
}
Error
La especificación OpenAPI no es válida o es incorrecta. API Gateway no puede crear ningún recurso a
partir del documento con formato incorrecto. Debe corregir los errores y, a continuación, intentarlo de
nuevo.
La siguiente definición de API genera errores en la importación porque las API HTTP solo son
compatibles con la especificación de OpenAPI 3.0.
{
"swagger": "2.0.0",
"info": {
210
Amazon API Gateway Guía del desarrollador
OpenAPI
Como otro ejemplo, mientras que OpenAPI permite a los usuarios definir una API con varios requisitos
de seguridad asociados a una operación en particular, API Gateway no admite esto. Cada operación
solo puede tener una autorización de IAM, un autorizador de Lambda o un autorizador JWT. Cuando
se intenta modelar varios requisitos de seguridad, se produce un error.
Example
Example
Puede importar el siguiente ejemplo de definición de OpenAPI 3.0 para crear una API HTTP.
{
"openapi": "3.0.1",
"info": {
"title": "Example Pet Store",
"description": "A Pet Store API.",
"version": "1.0"
},
"paths": {
"/pets": {
"get": {
"operationId": "GET HTTP",
"parameters": [
{
"name": "type",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "200 response",
"headers": {
"Access-Control-Allow-Origin": {
"schema": {
"type": "string"
}
}
211
Amazon API Gateway Guía del desarrollador
OpenAPI
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pets"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "HTTP_PROXY",
"httpMethod": "GET",
"uri": "http://petstore.execute-api.us-west-1.amazonaws.com/petstore/pets",
"payloadFormatVersion": 1.0
}
},
"post": {
"operationId": "Create Pet",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewPet"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "200 response",
"headers": {
"Access-Control-Allow-Origin": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewPetResponse"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "HTTP_PROXY",
"httpMethod": "POST",
"uri": "http://petstore.execute-api.us-west-1.amazonaws.com/petstore/pets",
"payloadFormatVersion": 1.0
}
}
},
"/pets/{petId}": {
"get": {
"operationId": "Get Pet",
"parameters": [
{
"name": "petId",
"in": "path",
"required": true,
"schema": {
"type": "string"
212
Amazon API Gateway Guía del desarrollador
OpenAPI
}
}
],
"responses": {
"200": {
"description": "200 response",
"headers": {
"Access-Control-Allow-Origin": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
}
}
}
}
},
"x-amazon-apigateway-integration": {
"type": "HTTP_PROXY",
"httpMethod": "GET",
"uri": "http://petstore.execute-api.us-west-1.amazonaws.com/petstore/pets/
{petId}",
"payloadFormatVersion": 1.0
}
}
}
},
"x-amazon-apigateway-cors": {
"allowOrigins": [
"*"
],
"allowMethods": [
"GET",
"OPTIONS",
"POST"
],
"allowHeaders": [
"x-amzm-header",
"x-apigateway-header",
"x-api-key",
"authorization",
"x-amz-date",
"content-type"
]
},
"components": {
"schemas": {
"Pets": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Pet"
}
},
"Empty": {
"type": "object"
},
"NewPetResponse": {
"type": "object",
"properties": {
"pet": {
"$ref": "#/components/schemas/Pet"
213
Amazon API Gateway Guía del desarrollador
OpenAPI
},
"message": {
"type": "string"
}
}
},
"Pet": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"price": {
"type": "number"
}
}
},
"NewPet": {
"type": "object",
"properties": {
"type": {
"$ref": "#/components/schemas/PetType"
},
"price": {
"type": "number"
}
}
},
"PetType": {
"type": "string",
"enum": [
"dog",
"cat",
"fish",
"bird",
"gecko"
]
}
}
}
}
Exportar una definición de OpenAPI 3.0 de una etapa mediante la CLI de AWS
El siguiente comando exporta una definición de OpenAPI de una etapa de API denominada prod a
un archivo YAML denominado stage-definition.yaml. El archivo de definición exportado incluye
extensiones de API Gateway (p. 771) de forma predeterminada.
214
Amazon API Gateway Guía del desarrollador
Publicación
--specification OAS30 \
--stage-name prod \
stage-definition.yaml
Para obtener más información, consulte ExportAPI en la Referencia de la API de Amazon API Gateway
Versión 2.
Una referencia lógica a un estado del ciclo de vida de la API (por ejemplo, dev, prod, beta o v2). Cada
etapa es una referencia con nombre a una implementación de la API y está disponible para que las
aplicaciones cliente realicen las llamadas. Puede configurar diferentes integraciones y configuraciones
para cada etapa de una API.
Puede usar nombres de dominio personalizados para proporcionar una URL más simple e intuitiva para
que los clientes invoquen su API en vez de la URL predeterminada https://api-id.execute-
api.region.amazonaws.com/stage.
Temas
• Trabajar con etapas para API HTTP (p. 215)
• Configuración de nombres de dominio personalizados para API HTTP (p. 217)
Puede crear una etapa $default que se ofrezca desde la base de la URL de su API, por ejemplo,
https://{api_id}.execute-api.{region}.amazonaws.com/. Utilice esta URL para invocar una
etapa de la API.
215
Amazon API Gateway Guía del desarrollador
Etapas
Una implementación es una instantánea de la configuración de la API. Después de implementar una API
en una etapa, esta está disponible para que los clientes la invoquen. Debe implementar una API para que
los cambios surtan efecto. Si habilita implementaciones automáticas, los cambios realizados en una API se
liberarán automáticamente.
Variables de etapa
Las variables de etapa son pares clave-valor que se pueden definir para una etapa de una API HTTP.
Actúan como variables de entorno y se pueden usar en la configuración de la API.
Por ejemplo, puede definir una variable de etapa y, a continuación, establecer su valor como extremo
HTTP para una integración de proxy HTTP. Posteriormente, puede hacer referencia al punto de enlace
mediante el nombre de variable de etapa asociada. Al hacer esto, puede usar la misma configuración de
API con un punto de enlace diferente en cada etapa. Del mismo modo, puede utilizar variables de etapa
para especificar una integración de funciones de AWS Lambda diferente para cada etapa de su API.
Note
Las variables de etapa no están pensadas a fin de ser utilizadas para datos confidenciales,
como credenciales. Para transferir datos confidenciales a integraciones, utilice un autorizador de
AWS Lambda. Puede pasar datos confidenciales a integraciones en la salida del autorizador de
Lambda. Para obtener más información, consulte the section called “Formato de respuesta del
autorizador de Lambda” (p. 184).
Ejemplos
Para utilizar una variable de etapa para personalizar el punto de enlace de integración HTTP, primero
debe establecer el nombre y el valor de la variable de etapa (por ejemplo, url) con un valor de
example.com. A continuación, configure una integración de proxy HTTP. En lugar de escribir la URL
del punto de enlace, puede indicar a API Gateway que use el valor de la variable de etapa, http://
${stageVariables.url}. Este valor indica a API Gateway que sustituya la variable de etapa ${} en el
tiempo de ejecución en función de la etapa de la API.
Puede hacer referencia a variables de etapa de una manera similar para especificar un nombre de función
de Lambda o un ARN de rol de AWS.
Cuando especifica el nombre de una función de Lambda como un valor de variable de etapa, debe
configurar manualmente los permisos en la función de Lambda. Para ello puede utilizar la interfaz de línea
de comandos de AWS (CLI de AWS).
216
Amazon API Gateway Guía del desarrollador
Nombres de dominio personalizados
Funciones de Lambda
Puede utilizar una variable de etapa en lugar de un nombre de función de Lambda o alias, como se
muestra en los ejemplos siguientes.
• arn:aws:apigateway:<region>:lambda:path/2015-03-31/
functions/arn:aws:lambda:<region>:<account_id>:function:
${stageVariables.<function_variable_name>}/invocations
• arn:aws:apigateway:<region>:lambda:path/2015-03-31/functions/
arn:aws:lambda:<region>:<account_id>:function:<function_name>:
${stageVariables.<version_variable_name>}/invocations
Note
Para utilizar una variable de etapa para una función de Lambda, la función debe estar en la misma
cuenta que la API. Las variables de etapa no admiten funciones de Lambda entre cuentas.
• arn:aws:iam::<account_id>:${stageVariables.<variable_name>}
Después de implementar la API, usted (y sus clientes) puede invocar la API utilizando la URL base
predeterminada con el siguiente formato:
https://api-id.execute-api.region.amazonaws.com/stage
donde api-id lo genera API Gateway, region (región de AWS) lo especifica usted al crear la API y
stage lo especifica usted al implementar la API.
Con los nombres de dominio personalizados, puede configurar el nombre de host de la API y elegir una
ruta base (por ejemplo, myservice) para asignarle una URL alternativa. Por ejemplo, una URL base de la
API más simple puede ser:
https://api.example.com/myservice
Si no establece ningún mapeo de ruta base bajo un nombre de dominio personalizado, la URL
base de la API resultante será la misma que la del dominio personalizado (por ejemplo, https://
api.example.com). En este caso, el nombre de dominio personalizado no puede admitir más de una
API.
217
Amazon API Gateway Guía del desarrollador
Nombres de dominio personalizados
Note
Los dominios personalizados se pueden asociar con API de REST y API HTTP. Puede utilizar
las API de API Gateway versión 2 para crear y administrar nombres de dominio regionales
personalizados para API de REST y API HTTP.
Para las API HTTP, TLS 1.2 es la única versión de TLS admitida.
Después de crear un nombre de dominio personalizado en API Gateway, debe crear o actualizar el registro
de recursos del proveedor de DNS para asignarlo al punto de enlace de la API. Si no se realiza este
mapeo, las solicitudes de API vinculadas al nombre de dominio personalizado no pueden llegar a API
Gateway.
Para crear un nombre de dominio personalizado comodín, especifique un comodín (*) como primer
subdominio de un dominio personalizado que represente todos los subdominios posibles de un dominio
raíz.
Por ejemplo, el nombre de dominio personalizado comodín *.example.com produce subdominios como
a.example.com, b.example.com y c.example.com, que enrutan al mismo dominio.
Los nombres de dominio personalizados comodín admiten configuraciones distintas de los nombres de
dominio personalizados estándar de API Gateway. Por ejemplo, en una sola cuenta de AWS, puede
configurar *.example.com y a.example.com para que se comporten de manera diferente.
Para crear un nombre de dominio personalizado comodín, debe proporcionar un certificado emitido por
ACM que se haya validado utilizando el método DNS o de validación de correo electrónico.
Note
No se puede crear un nombre de dominio personalizado comodín si una cuenta de AWS diferente
ha creado un nombre de dominio personalizado que entra en conflicto con el nombre de dominio
personalizado comodín. Por ejemplo, si la cuenta A ha creado a.example.com, la cuenta B no
puede crear el nombre de dominio personalizado comodín *.example.com.
Si la cuenta A y la cuenta B comparten un propietario, puede ponerse en contacto con el Centro
de soporte de AWS para solicitar una excepción.
218
Amazon API Gateway Guía del desarrollador
Proteger
personalizado de región en una región donde no se admita ACM, debe importar un certificado en API
Gateway en esa región.
Para importar un certificado SSL/TLS, debe proporcionar el cuerpo del certificado SSL/TLS con formato
PEM, su clave privada y la cadena de certificados para el nombre de dominio personalizado. Los
certificados almacenados en ACM se identifican mediante su ARN. Para utilizar un certificado administrado
por AWS para un nombre de dominio, solo tiene que hacer referencia a su ARN.
ACM facilita la configuración y el uso de un nombre de dominio personalizado para una API. El usuario
crea un certificado para el nombre de dominio dado (o importa un certificado), configura el nombre de
dominio en API Gateway con el ARN del certificado proporcionado por ACM y asigna una ruta base bajo
el nombre de dominio personalizado a una etapa implementada de la API. Con los certificados emitidos
por ACM no tiene que preocuparse de si se exponen datos del certificado confidenciales, como la clave
privada.
Cuando deshabilita el punto de enlace predeterminado, esto afecta a todas las etapas de una API.
El siguiente comando de la CLI de AWS desactiva el punto de enlace predeterminado para una API HTTP.
Después de desactivar el punto de enlace predeterminado, debe implementar la API para que el cambio
surta efecto, salvo que se hayan habilitado las implementaciones automáticas.
Temas
• Solicitudes de limitación controlada a su API HTTP (p. 220)
• Configuración de la autenticación TLS mutua para una API HTTP (p. 221)
219
Amazon API Gateway Guía del desarrollador
Limitación controlada
Cuando los envíos de solicitudes superan los límites de ratio de solicitudes en estado estable y de
ráfaga, API Gateway no acepta las solicitudes que exceden el límite y devuelve respuestas de error 429
Too Many Requests al cliente. Cuando un cliente recibe estas respuestas de error, el cliente puede
reenviar las solicitudes que han producido un error de forma que limita el ratio y los límites de solicitudes
controladas de API Gateway.
Para ayudarle a entender estas restricciones de la limitación controlada, aquí se presenta un límite de
ráfaga de 5000 y un límite de la tasa de nivel de cuenta de 10 000 solicitudes por segundo en la región:
De forma más general, en un momento dado, cuando un bucket contiene b y su capacidad máxima es B, el
número máximo de tokens adicionales que se pueden añadir al bucket es #=B-b. Este número máximo de
tokens adicionales se corresponde con el número máximo de solicitudes simultáneas adicionales que un
cliente puede enviar sin recibir respuestas de error 429.
En general, # varía con el tiempo. El valor oscila entre cero cuando el bucket está lleno (es decir, b=B) y B
cuando el bucket está vacío (es decir, b=0). El intervalo depende de la velocidad de procesamiento de las
solicitudes (la velocidad a la que los tokens se eliminan del bucket) y de la velocidad del límite de ratio (la
velocidad a la que los tokens se añaden al bucket).
220
Amazon API Gateway Guía del desarrollador
TLS mutua
El límite de tasa de nivel de cuenta por región se puede aumentar previa solicitud. Para solicitar un
aumento de los límites de nivel de cuenta, póngase en contacto con el Centro de soporte de AWS. Para
obtener más información, consulte Cuotas de Amazon API Gateway y notas importantes (p. 840).
Puede configurar la limitación controlada de nivel de ruta mediante la CLI de AWS. El siguiente comando
configura la limitación controlada de nivel de ruta para la etapa y la ruta especificadas de una API.
Para habilitar la TLS mutua para una API HTTP, debe configurar un nombre de dominio personalizado
para su API. Puede habilitar la TLS mutua para un nombre de dominio personalizado y, a continuación,
proporcionar el nombre de dominio personalizado a los clientes. Para acceder a una API mediante un
nombre de dominio personalizado que tenga habilitada la TLS mutua, los clientes deben presentar
certificados en los que confíe en las solicitudes de API.
221
Amazon API Gateway Guía del desarrollador
TLS mutua
Puede utilizar TLS mutuo junto con otros métodos de autorización y autenticación (p. 182) compatibles
con API Gateway. API Gateway reenvía los certificados que los clientes proporcionan a los autorizadores
de Lambda y a las integraciones de Lambda backend.
Important
De forma predeterminada, los clientes pueden invocar su API mediante el punto de enlace
execute-api que API Gateway genera para su API. Para asegurarse de que los clientes solo
puedan acceder a su API mediante un nombre de dominio personalizado con la TLS mutua,
deshabilite el punto de enlace execute-api predeterminado. Para obtener más información,
consulte the section called “Deshabilitación del punto de enlace predeterminado” (p. 219).
API Gateway valida una serie de propiedades de certificado. Puede utilizar autorizadores de Lambda para
realizar comprobaciones adicionales cuando un cliente invoque una API, incluida la comprobación de si un
certificado se ha revocado. API Gateway valida las siguientes propiedades de certificado:
Validación Descripción
Example certificates.pem
-----BEGIN CERTIFICATE-----
<Certificate contents>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Certificate contents>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Certificate contents>
222
Amazon API Gateway Guía del desarrollador
TLS mutua
-----END CERTIFICATE-----
...
Después de cargar su almacén de confianza en Amazon S3, puede configurar su nombre de dominio
personalizado para que utilice TLS mutua.
Cuando crea un nombre de dominio personalizado que tiene la TLS mutua habilitada o actualiza un
dominio personalizado para utilizar un nuevo almacén de confianza, API Gateway devuelve advertencias
si los certificados del almacén de confianza no son válidos. La TLS mutua aún está habilitada, pero es
posible que algunos clientes no puedan acceder a la API. Para resolver advertencias, cargue un nuevo
almacén de confianza en S3 y, a continuación, actualice el nombre de dominio para utilizar la nueva
versión. Para obtener más información, consulte the section called “Solución de problemas de advertencias
de certificados” (p. 224).
Note
Para habilitar TLS mutuo, el nombre de dominio debe utilizar un certificado de servidor de
confianza pública emitido por AWS Certificate Manager.
Después de crear el nombre de dominio, debe configurar los registros DNS y las asignaciones de ruta base
para las API. Para obtener más información, consulte Configuración de un nombre de dominio regional
personalizado en API Gateway (p. 558).
Utilice el control de versiones de Amazon S3 para mantener varias versiones de su almacén de confianza.
Cuando actualiza el nombre de dominio personalizado para utilizar una nueva versión del almacén de
confianza, API Gateway devuelve advertencias si los certificados no son válidos.
223
Amazon API Gateway Guía del desarrollador
Monitoreo
Note
API Gateway produce advertencias de certificado solo cuando actualiza el nombre de dominio
para utilizar un nuevo almacén de confianza. API Gateway no le notifica si caduca un certificado
cargado anteriormente.
El siguiente comando de la CLI de AWS actualiza un nombre de dominio personalizado para utilizar una
nueva versión del almacén de confianza.
Para identificar el certificado que produjo la advertencia, descodifique los certificados en su almacén de
confianza. Puede utilizar herramientas como openssl para descodificar los certificados e identificar sus
asuntos.
Actualice o elimine los certificados que produjeron advertencias y, a continuación, cargue una nueva
versión del almacén de confianza en Amazon S3. Después de cargar un nuevo almacén de confianza en
Amazon S3, actualice su nombre de dominio personalizado para utilizar el nuevo almacén de confianza.
224
Amazon API Gateway Guía del desarrollador
Métricas
Temas
• Trabajar con métricas para API HTTP (p. 225)
• Configuración de registro para una API HTTP (p. 226)
Las siguientes métricas son compatibles con las API HTTP. También puede habilitar métricas detalladas
para escribir métricas en el nivel de ruta en Amazon CloudWatch.
Métrica Descripción
Puede usar las dimensiones de la tabla siguiente para filtrar las métricas de API Gateway.
Dimensión Descripción
225
Amazon API Gateway Guía del desarrollador
Registro de
Dimensión Descripción
Para habilitar el registro para una API HTTP, tendrá que hacer lo siguiente.
1. Asegúrese de que el usuario de IAM tenga los permisos necesarios para habilitar el registro.
2. Cree un grupo de registros de CloudWatch Logs.
3. Proporcione el ARN del grupo de registros de CloudWatch Logs para una etapa de la API.
Example
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:GetLogEvents",
226
Amazon API Gateway Guía del desarrollador
Registro de
"logs:FilterLogEvents"
],
"Resource": "arn:aws:logs:us-east-2:123456789012:log-group:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogDelivery",
"logs:PutResourcePolicy",
"logs:UpdateLogDelivery",
"logs:DeleteLogDelivery",
"logs:CreateLogGroup",
"logs:DescribeResourcePolicies",
"logs:GetLogDelivery",
"logs:ListLogDeliveries"
],
"Resource": "*"
}
]
}
Necesita el nombre de recurso de Amazon (ARN) para su grupo de registros para habilitar el registro. El
formato ARN es arn:aws:logs:region:account-id:log-group:log-group-name.
• JSON:
227
Amazon API Gateway Guía del desarrollador
Registro de
"status":"$context.status","protocol":"$context.protocol",
"responseLength":"$context.responseLength" }
• XML:
$context.identity.sourceIp,$context.requestTime,$context.httpMethod,$context.routeKey,
$context.protocol,$context.status,$context.responseLength,$context.requestId
Parámetro Descripción
La llamada a
$context.authorizer.claims
devuelve null.
"context" : {
"key": "value",
"numKey": 1,
"boolKey": true
}
228
Amazon API Gateway Guía del desarrollador
Registro de
Parámetro Descripción
la llamada a $context.authorizer.key
devuelve la cadena "value", la llamada a
$context.authorizer.numKey devuelve 1 y
la llamada a $context.authorizer.boolKey
devuelve true.
229
Amazon API Gateway Guía del desarrollador
Registro de
Parámetro Descripción
230
Amazon API Gateway Guía del desarrollador
Registro de
Parámetro Descripción
231
Amazon API Gateway Guía del desarrollador
Solución de problemas
Parámetro Descripción
Temas
• Solución de problemas con las integraciones de HTTP API Lambda (p. 232)
• Solución de problemas con los autorizadores JWT de la API HTTP (p. 234)
232
Amazon API Gateway Guía del desarrollador
Integraciones de Lambda
$curl https://api-id.execute-api.us-west-2.amazonaws.com/route
233
Amazon API Gateway Guía del desarrollador
Autorizadores de JWT
Los registros pueden incluir un mensaje de error diferente que indica que hay un problema con el código
de función de Lambda. En ese caso, verifique su código de función de Lambda y compruebe que su
función de Lambda devuelva una respuesta en el formato necesario (p. 194).
En este caso, los registros muestran que API Gateway no tenía los permisos necesarios para invocar la
función de Lambda.
Cuando crea una integración de Lambda en la consola de API Gateway, API Gateway configura
automáticamente los permisos para invocar la función de Lambda. Al crear una integración de Lambda
mediante la CLI de AWS, AWS CloudFormation o un SDK, debe conceder permisos a API Gateway para
invocar la función. El siguiente comando de la CLI de AWS concede permisos para la etapa $default y la
ruta $default de una API HTTP para invocar una función de Lambda.
234
Amazon API Gateway Guía del desarrollador
Autorizadores de JWT
El siguiente comando utiliza curl para enviar una solicitud a una API con un autorizador de JWT que
utiliza $request.header.Authorization como su origen de identidad.
...
< HTTP/1.1 401 Unauthorized
< Date: Wed, 13 May 2020 04:07:30 GMT
< Content-Length: 26
< Connection: keep-alive
< www-authenticate: Bearer scope="" error="invalid_token" error_description="the token does
not have a valid audience"
< apigw-requestid: Mc7UVioPPHcEKPA=
<
* Connection #0 to host api-id.execute-api.us-west-2.amazonaws.com left intact
{"message":"Unauthorized"}}
En este caso, el encabezado www-authenticate muestra que el token no se emitió para un destinatario
válido. Para que API Gateway autorice una solicitud, la reclamación aud o client_id de JWT debe
coincidir con una de las entradas de destinatario configuradas para el autorizador.
También puede decodificar un JWT y comprobar que coincida con el emisor, el destinatario y los ámbitos
que requiere su API. El sitio web jwt.io puede depurar JWT en el navegador. OpenID Foundation mantiene
una lista de bibliotecas para trabajar con JWT.
Para obtener más información acerca de los autorizadores de JWT, consulte Control del acceso a las API
HTTP con autorizadores de JWT (p. 189).
235
Amazon API Gateway Guía del desarrollador
Desarrollo
Las API de REST de API Gateway utilizan un modelo de solicitud/respuesta en el que un cliente envía una
solicitud a un servicio y el servicio responde de forma sincrónica. Este tipo de modelo es adecuado para
muchos tipos diferentes de aplicaciones que dependen de la comunicación sincrónica.
Temas
• Desarrollo de una API REST en API Gateway (p. 236)
• Publicación de una API de REST para que los clientes la invoquen (p. 510)
• Optimización del rendimiento de las API REST (p. 564)
• Distribución de la API de REST a los clientes (p. 574)
• Protección de la API REST (p. 660)
• Monitoreo de las API de REST (p. 695)
A medida que se desarrolla la API de API Gateway, se decide sobre una serie de características de la API.
Estas características dependen del uso de la API. Por ejemplo, es posible que quiera permitir solo a ciertos
clientes llamar a la API o puede que quiera que esté disponible para todos. Puede querer que una llamada
a la API ejecute una función de Lambda, haga una consulta a la base de datos o llame a una aplicación.
Temas
• Creación de una API REST en Amazon API Gateway (p. 236)
• Control y administración del acceso a una API REST en API Gateway (p. 269)
• Configuración de integraciones de la API REST (p. 331)
• Habilitar la validación de solicitudes en API Gateway (p. 376)
• Configuración de transformaciones de datos para API REST (p. 389)
• Respuestas de gateway en API Gateway (p. 438)
• Habilitación de CORS para un recurso de la API de REST (p. 445)
• Trabajar con tipos de medios binarios para API REST (p. 453)
• Invocación de una API REST en Amazon API Gateway (p. 477)
• Configuración de una API de REST mediante OpenAPI (p. 500)
236
Amazon API Gateway Guía del desarrollador
Crear y configurar
Integration para integrar el Method con un punto de enlace de backend, también conocido como punto
de enlace de integración, reenviando la solicitud entrante a un URI de punto de enlace de integración
especificado. Si es necesario, puede transformar los parámetros de solicitud o el cuerpo para que
cumplan los requisitos del backend. Para las respuestas, puede crear un recurso MethodResponse para
representar una respuesta de solicitud recibida por el cliente y crear un recurso IntegrationResponse
para representar la respuesta de solicitud que devuelve el backend. Puede configurar la respuesta de
integración para transformar los datos de respuesta del backend antes de devolver los datos al cliente o
transferir la respuesta del backend tal y como está al cliente.
Para ayudar a sus clientes a comprender su API, también puede proporcionar documentación para la
API, como parte de la creación de la API o una vez que se ha creado. Para ello, agregue un recurso
DocumentationPart para una entidad de API compatible.
Para controlar el modo en que los clientes llaman a la API, utilice permisos de IAM (p. 287), un
autorizador de Lambda (p. 305) o un grupo de usuarios de Amazon Cognito (p. 322). Para medir el
uso de la API, configure planes de uso (p. 574) para limitar las solicitudes a la API. Puede habilitar estos
elementos al crear o al actualizar la API.
Puede realizar estas y otras tareas a través de la consola de API Gateway, la API REST de API Gateway,
la CLI de AWS o uno de los SDK de AWS. A continuación, trataremos cómo realizar estas tareas.
Temas
• Elección de un tipo de punto de enlace para configurarlo para una API de API Gateway (p. 237)
• Inicialización de la configuración de una API REST en API Gateway (p. 239)
• Configurar métodos de API REST en API Gateway (p. 256)
Los tipos de punto de enlace de API (p. 6) hacen referencia al nombre de host de la API. El punto de
enlace de la API puede ser de tres tipos, optimizado para sistemas perimetrales, regional o privado, en
función de dónde se origine la mayoría del tráfico de la API.
Las API optimizadas para sistemas perimetrales utilizan mayúsculas en la inicial de los nombres de los
encabezados HTTP (por ejemplo, Cookie).
CloudFront ordena las cookies HTTP según su nombre antes de reenviar la solicitud al origen. Para
obtener más información sobre el modo en que CloudFront procesa las cookies, consulte Almacenamiento
en caché de contenido en función de cookies.
Cualquier nombre de dominio personalizado que se utilice con una API optimizada para sistemas
perimetrales se aplicará a todas las regiones.
237
Amazon API Gateway Guía del desarrollador
Crear y configurar
En una API regional, el nombre de dominio personalizado es específico de la región en la que está
implementada la API. Si implementa una API regional en varias regiones, esta puede tener el mismo
nombre de dominio personalizado en todas las regiones. Puede utilizar dominios personalizados
junto con Amazon Route 53 para realizar tareas como el direccionamiento basado en latencia. Para
obtener más información, consulte the section called “Configuración de un nombre de dominio regional
personalizado” (p. 558) y the section called “Creación de un nombre de dominio personalizado
optimizado para bordes” (p. 551).
Los puntos de enlace de API regionales ransfieren todos los nombres de encabezado tal y como están.
Los puntos de enlace de API privados transfieren todos los nombres de encabezado tal y como están.
Cambiar el tipo de punto de enlace de una API pública o privada en API Gateway
Para cambiar el tipo de un punto de enlace de la API, es preciso actualizar la configuración de la API.
Puede cambiar un tipo de API existente mediante la consola de API Gateway, la CLI de AWS o un SDK de
AWS para API Gateway. La operación de actualización puede tardar hasta 60 segundos en completarse.
Durante este tiempo, la API estará disponible, pero su tipo de punto de enlace no se puede cambiar de
nuevo hasta que se complete el cambio actual.
No puede transformar una API privada en una API optimizada para límites.
Si va a cambiar una API pública optimizada para límites a regional o viceversa, tenga en cuenta que las
API optimizadas para sistemas perimetrales pueden comportarse de forma distinta que las API regionales.
Por ejemplo, una API optimizada para límites elimina el encabezado Content-MD5. Cualquier valor
de hash MD5 transmitido al backend se puede expresar en un parámetro de cadena de solicitud o una
propiedad del cuerpo. Sin embargo, la API regional transmite este encabezado, aunque puede reasignar
el nombre de encabezado a otro nombre. Comprender estas diferencias le ayuda a decidir cómo actualizar
una API optimizada para límites a una regional o bien de una API regional a una optimizada para límites.
Temas
• Uso de la consola de API Gateway para cambiar el tipo de punto de enlace de la API (p. 238)
• Uso de la CLI de AWS para cambiar el tipo de punto de enlace de una API (p. 239)
Uso de la consola de API Gateway para cambiar el tipo de punto de enlace de la API
Para cambiar el tipo de punto de enlace de la API, siga uno de estos procedimientos:
Para convertir un punto de enlace público de regional u optimizado para sistemas perimetrales, y
viceversa
238
Amazon API Gateway Guía del desarrollador
Crear y configurar
4. Cambie la opción Endpoint Type (Tipo de punto de enlace) en Endpoint Configuration (Configuración
de punto de enlace) de Edge Optimized a Regional o bien de Regional a Edge Optimized.
5. Elija Save Changes (Guardar cambios) para iniciar la actualización.
Uso de la CLI de AWS para cambiar el tipo de punto de enlace de una API
Si desea utilizar la CLI de AWS para actualizar una API optimizada para bordes cuyo ID es {api-id},
llame a update-rest-api tal y como se indica a continuación:
La respuesta correcta tiene un código de estado 200 OK y una carga similar a la siguiente:
"createdDate": "2017-10-16T04:09:31Z",
"description": "Your first API with Amazon API Gateway. This is a sample API that
integrates via HTTP with our demo Pet Store endpoints",
"endpointConfiguration": {
"types": "REGIONAL"
},
"id": "0gsnjtjck8",
"name": "PetStore imported as edge-optimized"
}
De igual forma, actualice una API regional a una API optimizada para límites del modo siguiente:
Dado que put-rest-api se utiliza para actualizar definiciones de API, no puede utilizarse para actualizar un
tipo de punto de enlace de API.
239
Amazon API Gateway Guía del desarrollador
Crear y configurar
Debido a los ajustes predeterminados, la API resultante está optimizada para límites. Una alternativa es
configurar una API regional (p. 253). Para configurar una API regional, debe establecer explícitamente
el tipo de punto de enlace de la API como REGIONAL. Para configurar una API optimizada para límites
explícitamente, puede establecer EDGE como tipo de endpointConfiguration.
Al configurar una API, debe elegir una región. Cuando se implementa, la API es específica de una
región. En el caso de una API optimizada para bordes, la URL base tiene el formato http[s]://
{restapi-id}.execute-api.amazonaws.com/stage, donde {restapi-id} es el valor de id de
la API generado por API Gateway. Puede asignar un nombre de dominio personalizado (por ejemplo,
apis.example.com) como nombre de host de la API y llamar a la API con una URL base con el formato
https://apis.example.com/myApi.
Temas
• Configuración de una API con la consola de API Gateway (p. 240)
• Configurar una API optimizada para bordes mediante comandos de la CLI de AWS (p. 240)
• Configurar una API optimizada para bordes con el SDK de AWS para Node.js (p. 245)
• Configurar una API optimizada para bordes importando definiciones de OpenAPI (p. 252)
• Configuración de una API regional en API Gateway (p. 253)
Puede obtener información sobre cómo configurar una API siguiendo un ejemplo. Para obtener más
información, consulte Tutorial: Crear una API de REST importando un ejemplo (p. 43).
Como alternativa, puede crear una API a través de la función Importar API (p. 500) de API Gateway para
cargar una definición de API externa, como la expresada en OpenAPI 2.0 con Trabajar con extensiones de
API Gateway para OpenAPI (p. 771). En el ejemplo proporcionado en Tutorial: Crear una API de REST
importando un ejemplo (p. 43) se utiliza la característica Import API.
1. Llame al comando create-rest-api para configurar la RestApi en una región concreta (us-
west-2).
aws apigateway create-rest-api --name 'Simple PetStore (AWS CLI)' --region us-west-2
240
Amazon API Gateway Guía del desarrollador
Crear y configurar
Anote el id devuelto de la RestApi recién creada. Lo necesitará para configurar otras partes de la
API.
2. Llame al comando get-resources para recuperar el identificador del recurso raíz de la RestApi.
{
"items": [
{
"path": "/",
"id": "begaltmsm8"
}
]
}
Anote el Id del recurso raíz. Lo necesitará para comenzar a establecer el árbol de recursos de la API
y para configurar métodos e integraciones.
3. Llame al comando create-resource para asociar un recurso secundario (pets) bajo el recurso raíz
(begaltmsm8):
{
"path": "/pets",
"pathPart": "pets",
"id": "6sxz2j",
"parentId": "begaltmsm8"
}
Para asociar un recurso secundario bajo la raíz, se especifica el Id del recurso raíz como valor de la
propiedad parentId. Del forma similar, para asociar un recurso secundario bajo el recurso pets, se
repite el paso anterior y se sustituye el valor parent-id por el pets id del recurso de 6sxz2j:
Para hacer de una parte de la ruta un parámetro de ruta, sitúela entre llaves. Si se ejecuta
correctamente, este comando devuelve la siguiente respuesta:
{
"path": "/pets/{petId}",
"pathPart": "{petId}",
241
Amazon API Gateway Guía del desarrollador
Crear y configurar
"id": "rjkmth",
"parentId": "6sxz2j"
}
Ahora que ha creado dos recursos, /pets (6sxz2j) y /pets/{petId} (rjkmth), puede continuar
configurando métodos sobre ellos.
4. Llame al comando put-method para añadir el método HTTP GET en el recurso /pets. Esto crea un
Method de API de GET /pets con acceso abierto, haciendo referencia al recurso /pets mediante su
valor de ID de 6sxz2j.
{
"apiKeyRequired": false,
"httpMethod": "GET",
"authorizationType": "NONE"
}
El método es de acceso abierto porque authorization-type está ajustado en NONE. Para permitir
que solo puedan llamar al método los usuarios autenticados, puede utilizar políticas y roles de IAM, un
autorizador de Lambda (que anteriormente se denominaba autorizador personalizado) o un grupo de
usuarios de Amazon Cognito. Para obtener más información, consulte the section called “Control de
acceso” (p. 269).
Para habilitar el acceso de lectura al recurso /pets/{petId} (rjkmth), añada el método HTTP GET
para crear un Method de API de GET /pets/{petId} del siguiente modo.
{
"apiKeyRequired": false,
"httpMethod": "GET",
"authorizationType": "NONE",
"requestParameters": {
"method.request.path.petId": true
}
}
Tenga en cuenta que el parámetro de ruta de solicitud de método de petId debe especificarse como
un parámetro de solicitud necesario para que su valor establecido dinámicamente se asigne a un
parámetro de solicitud de integración correspondiente y se transfiera al backend.
5. Llame al comando put-method-response para configurar la respuesta 200 OK del método GET /
pets, especificando el recurso /pets mediante su valor de ID de 6sxz2j.
242
Amazon API Gateway Guía del desarrollador
Crear y configurar
{
"statusCode": "200"
}
De forma similar, para establecer la respuesta 200 OK del método GET /pets/{petId}, realice lo
siguiente, especificando el recurso /pets/{petId} mediante su valor de ID de recurso de rjkmth:
Tras configurar una interfaz de cliente sencilla para la API, puede continuar y configurar la integración
de los métodos de la API con el backend.
6. Llame al comando put-integration para configurar una Integration con un punto de enlace
HTTP especificado para el método GET /pets. El recurso /pets se identifica mediante su id de
recurso 6sxz2j:
{
"httpMethod": "GET",
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"type": "HTTP",
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
"cacheNamespace": "6sxz2j"
}
De forma similar, se crea una solicitud de integración para el método GET /pets/{petId} del
siguiente modo:
243
Amazon API Gateway Guía del desarrollador
Crear y configurar
--region us-west-2
{
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
"httpMethod": "GET",
"cacheNamespace": "rjkmth",
"type": "HTTP",
"requestParameters": {
"integration.request.path.id": "method.request.path.petId"
}
}
{
"selectionPattern": "",
"statusCode": "200"
}
Del forma similar, llame al siguiente comando put-integration-response para crear una
IntegrationResponse del método GET /pets/{petId}:
Con los pasos anteriores, ha terminado la configuración de una API sencilla que permite a sus clientes
consultar las mascotas disponibles en el sitio web de PetStore y ver una mascota concreta con un
identificador especificado. Para que el cliente pueda llamar a la API, debe implementarla.
8. Implemente la API en una etapa stage llamando, por ejemplo, a create-deployment:
244
Amazon API Gateway Guía del desarrollador
Crear y configurar
[
{
"id": 1,
"type": "dog",
"price": 249.99
},
{
"id": 2,
"type": "cat",
"price": 124.99
},
{
"id": 3,
"type": "fish",
"price": 0.99
}
]
{
"id": 3,
"type": "fish",
"price": 0.99
}
Configurar una API optimizada para bordes con el SDK de AWS para Node.js
Como ejemplo, utilizamos el SDK de AWS para Node.js para describir cómo se puede utilizar un SDK de
AWS para crear una API de API Gateway. Para obtener más información sobre el uso de un SDK de AWS,
incluida la configuración del entorno de desarrollo, consulte SDK de AWS.
La configuración de una API mediante el SDK de AWS para Node.js implica la llamada a las funciones
createRestApi, createResource o getResources, putMethod, putMethodResponse,
putIntegration y putIntegrationResponse.
Los siguientes procedimientos le guiarán por los pasos necesarios para utilizar estos comandos del SDK
con el fin de configurar una sencilla API de PetStore que admita los métodos GET /pets y GET /pets/
{petId}.
Para configurar una API sencilla de PetStore con el SDK de AWS para Node.js
1. Inicie el SDK:
AWS.config.region = 'us-west-2';
var apig = new AWS.APIGateway({apiVersion: '2015/07/09'});
apig.createRestApi({
name: "Simple PetStore (node.js SDK)",
binaryMediaTypes: [
'*'
245
Amazon API Gateway Guía del desarrollador
Crear y configurar
],
description: "Demo API created using the AWS SDK for node.js",
version: "0.00.001"
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log('Create API failed:\n', err);
}
});
{
id: 'iuo308uaq7',
name: 'PetStore (node.js SDK)',
description: 'Demo API created using the AWS SDK for node.js',
createdDate: 2017-09-05T19:32:35.000Z,
version: '0.00.001',
binaryMediaTypes: [ '*' ]
}
apig.getResources({
restApiId: 'iuo308uaq7'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log('Get the root resource failed:\n', err);
}
})
{
"items": [
{
"path": "/",
"id": "s4fb0trnk0"
}
]
}
El identificador de recurso raíz es s4fb0trnk0. Este es el punto de partida para la crear el árbol de
recursos de la API, que es el siguiente paso.
4. Llame a la función createResource para configurar el recurso /pets para la API, especificando el
identificador de recurso raíz (s4fb0trnk0) en la propiedad parentId.
apig.createResource({
restApiId: 'iuo308uaq7',
parentId: 's4fb0trnk0',
pathPart: 'pets'
}, function(err, data){
if (!err) {
console.log(data);
246
Amazon API Gateway Guía del desarrollador
Crear y configurar
} else {
console.log("The '/pets' resource setup failed:\n", err);
}
})
{
"path": "/pets",
"pathPart": "pets",
"id": "8sxa2j",
"parentId": "s4fb0trnk0'"
}
apig.createResource({
restApiId: 'iuo308uaq7',
parentId: '8sxa2j',
pathPart: '{petId}'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("The '/pets/{petId}' resource setup failed:\n", err);
}
})
{
"path": "/pets/{petId}",
"pathPart": "{petId}",
"id": "au5df2",
"parentId": "8sxa2j"
}
apig.putMethod({
restApiId: 'iuo308uaq7',
resourceId: '8sxa2j,
httpMethod: 'GET',
authorizationType: 'NONE'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("The 'GET /pets' method setup failed:\n", err);
}
})
247
Amazon API Gateway Guía del desarrollador
Crear y configurar
{
"apiKeyRequired": false,
"httpMethod": "GET",
"authorizationType": "NONE"
}
Para añadir el método HTTP GET en el recurso /pets/{petId} (au5df2), que configura el método
de API de GET /pets/{petId} con acceso abierto, llame a la función putMethod del siguiente
modo.
apig.putMethod({
restApiId: 'iuo308uaq7',
resourceId: 'au5df2',
httpMethod: 'GET',
authorizationType: 'NONE',
requestParameters: {
"method.request.path.petId" : true
}
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("The 'GET /pets/{petId}' method setup failed:\n", err);
}
})
{
"apiKeyRequired": false,
"httpMethod": "GET",
"authorizationType": "NONE",
"requestParameters": {
"method.request.path.petId": true
}
}
apig.putMethodResponse({
restApiId: 'iuo308uaq7',
resourceId: "8sxa2j",
httpMethod: 'GET',
statusCode: '200'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("Set up the 200 OK response for the 'GET /pets' method failed:\n", err);
}
})
248
Amazon API Gateway Guía del desarrollador
Crear y configurar
{
"statusCode": "200"
}
Para establecer la respuesta 200 OK del método GET /pets/{petId}, llame a la función
putMethodResponse, especificando el identificador de recurso /pets/{petId} (au5df2) en la
propiedad resourceId.
apig.putMethodResponse({
restApiId: 'iuo308uaq7',
resourceId: "au5df2",
httpMethod: 'GET',
statusCode: '200'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("Set up the 200 OK response for the 'GET /pets/{petId}' method failed:
\n", err);
}
})
7. Llame a la función putIntegration para configurar la Integration con un punto de enlace HTTP
especificado para el método GET /pets, facilitando el identificador del recurso /pets (8sxa2j) en la
propiedad parentId.
apig.putIntegration({
restApiId: 'iuo308uaq7',
resourceId: '8sxa2j',
httpMethod: 'GET',
type: 'HTTP',
integrationHttpMethod: 'GET',
uri: 'http://perstore-demo-endpoint.execute-api.com/pets'
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("Set up the integration of the 'GET /' method of the API failed:\n",
err);
}
})
{
"httpMethod": "GET",
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"type": "HTTP",
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
"cacheNamespace": "8sxa2j"
}
Para configurar la integración del método GET /pets/{petId} con el punto de enlace HTTP de
http://perstore-demo-endpoint.execute-api.com/pets/{id} del backend, llame a la
siguiente función putIntegration, facilitando el identificador de recurso /pets/{petId} de la API
(au5df2) en la propiedad parentId.
249
Amazon API Gateway Guía del desarrollador
Crear y configurar
apig.putIntegration({
restApiId: 'iuo308uaq7',
resourceId: 'au5df2',
httpMethod: 'GET',
type: 'HTTP',
integrationHttpMethod: 'GET',
uri: 'http://perstore-demo-endpoint.execute-api.com/pets/{id}',
requestParameters: {
"integration.request.path.id": "method.request.path.petId"
}
}, function(err, data){
if (!err) {
console.log(data);
} else {
console.log("The 'GET /pets/{petId}' method integration setup failed:\n", err);
}
})
{
"httpMethod": "GET",
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"type": "HTTP",
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
"cacheNamespace": "au5df2",
"requestParameters": {
"integration.request.path.id": "method.request.path.petId"
}
}
apig.putIntegrationResponse({
restApiId: 'iuo308uaq7',
resourceId: '8sxa2j',
httpMethod: 'GET',
statusCode: '200',
selectionPattern: ''
}, function(err, data){
if (!err) {
console.log(data);
} else
console.log("The 'GET /pets' method integration response setup failed:\n", err);
})
{
"selectionPattern": "",
"statusCode": "200"
}
250
Amazon API Gateway Guía del desarrollador
Crear y configurar
Para configurar la respuesta de integración 200 OK del método GET /pets/{petId}, llame a la
función putIntegrationResponse, especificando el identificador del recurso /pets/{petId} de
la API (au5df2) en la propiedad resourceId.
apig.putIntegrationResponse({
restApiId: 'iuo308uaq7',
resourceId: 'au5df2',
httpMethod: 'GET',
statusCode: '200',
selectionPattern: ''
}, function(err, data){
if (!err) {
console.log(data);
} else
console.log("The 'GET /pets/{petId}' method integration response setup failed:\n",
err);
})
9. Como buena práctica, pruebe a invocar la API antes de implementarla. Para probar la invocación del
método GET /pets, llame al testInvokeMethod, especificando el identificador de recurso /pets
(8sxa2j) en la propiedad resourceId:
apig.testInvokeMethod({
restApiId: 'iuo308uaq7',
resourceId: '8sxa2j',
httpMethod: "GET",
pathWithQueryString: '/'
}, function(err, data){
if (!err) {
console.log(data)
} else {
console.log('Test-invoke-method on 'GET /pets' failed:\n', err);
}
})
apig.testInvokeMethod({
restApiId: 'iuo308uaq7',
resourceId: 'au5df2',
httpMethod: "GET",
pathWithQueryString: '/'
}, function(err, data){
if (!err) {
console.log(data)
} else {
console.log('Test-invoke-method on 'GET /pets/{petId}' failed:\n', err);
}
})
10. Por último, puede implementar la API para que la llamen sus clientes.
apig.createDeployment({
restApiId: 'iuo308uaq7',
stageName: 'test',
stageDescription: 'test deployment',
description: 'API deployment'
}, function(err, data){
251
Amazon API Gateway Guía del desarrollador
Crear y configurar
if (err) {
console.log('Deploying API failed:\n', err);
} else {
console.log("Deploying API succeeded\n", data);
}
})
Las siguientes definiciones de OpenAPI describen la API sencilla, que expone solo el método GET /
integrado con un punto de enlace HTTP del sitio web PetStore en el backend y devuelve una respuesta
200 OK.
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"title": "Simple PetStore (OpenAPI)"
},
"schemes": [
"https"
],
"paths": {
"/pets": {
"get": {
"responses": {
"200": {
"description": "200 response"
}
},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
"passthroughBehavior": "when_no_match",
"httpMethod": "GET",
"type": "http"
}
}
},
"/pets/{petId}": {
"get": {
"parameters": [
{
"name": "petId",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response"
}
},
"x-amazon-apigateway-integration": {
252
Amazon API Gateway Guía del desarrollador
Crear y configurar
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.path.id": "method.request.path.petId"
},
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
"passthroughBehavior": "when_no_match",
"httpMethod": "GET",
"type": "http"
}
}
}
}
}
El siguiente procedimiento describe cómo importar estas definiciones de OpenAPI en API Gateway
mediante la consola de API Gateway.
Para importar las definiciones de OpenAPI de la API sencilla utilizando la consola de API Gateway
Para importar las definiciones de OpenAPI utilizando la CLI de AWS, guarde las definiciones de
OpenAPI en un archivo y, a continuación, ejecute el siguiente comando, en el que se supone que
la región es us-west-2 y que la ruta absoluta del archivo de OpenAPI es file:///path/to/
API_OpenAPI_template.json:
En los casos en que los clientes de la API están dispersos geográficamente, sigue teniendo
sentido utilizar un punto de enlace de API regional, junto con su propia distribución de Amazon
CloudFront para garantizar que API Gateway no asocia la API con distribuciones de CloudFront
controladas por servicios. Para obtener más información acerca de este caso de uso, consulte la
sección sobre cómo configurar API Gateway con mi propia distribución de CloudFront.
Para crear una API regional, siga los pasos que se indican en la sección de creación de una API
optimizada para bordes (p. 239), pero debe definir de forma explícita el tipo REGIONAL como única
opción de endpointConfiguration en la API.
253
Amazon API Gateway Guía del desarrollador
Crear y configurar
A continuación, mostramos cómo crear una API regional utilizando la consola de API Gateway, la CLI de
AWS, el SDK de AWS para JavaScript en Node.js.
Temas
• Crear una API regional mediante la consola de API Gateway (p. 254)
• Creación de una API regional con la CLI de AWS (p. 254)
• Creación de una API regional con el SDK de AWS para JavaScript (p. 254)
• Prueba de una API regional (p. 255)
1. Inicie sesión en la consola de API Gateway y elija + Create API (Crear API).
2. En Create new API (Crear nueva API), elija la opción New API (Nueva API).
3. Escriba un nombre (por ejemplo, Simple PetStore (Console, Regional)) para API name
(Nombre de la API).
4. Elija Regional para Endpoint Type (Tipo de punto de enlace).
5. Seleccione Create API (Crear API).
A partir de aquí, puede pasar a configurar los métodos de la API y sus integraciones asociadas tal y como
se describe en la sección de creación de una API optimizada para sistemas perimetrales (p. 240).
{
"createdDate": "2017-10-13T18:41:39Z",
"description": "Simple regional PetStore API",
"endpointConfiguration": {
"types": "REGIONAL"
},
"id": "0qzs2sy7bh",
"name": "Simple PetStore (AWS CLI, Regional)"
}
A partir de aquí, puede seguir las mismas instrucciones dadas en the section called “Configurar una API
optimizada para bordes mediante comandos de la CLI de AWS” (p. 240) para configurar métodos e
integraciones para esta API.
apig.createRestApi({
name: "Simple PetStore (node.js SDK, regional)",
254
Amazon API Gateway Guía del desarrollador
Crear y configurar
endpointConfiguration: {
types: ['REGIONAL']
},
description: "Demo regional API created using the AWS SDK for node.js",
version: "0.00.001"
}, function(err, data){
if (!err) {
console.log('Create API succeeded:\n', data);
restApiId = data.id;
} else {
console.log('Create API failed:\n', err);
}
});
{
"createdDate": "2017-10-13T18:41:39Z",
"description": "Demo regional API created using the AWS SDK for node.js",
"endpointConfiguration": {
"types": "REGIONAL"
},
"id": "0qzs2sy7bh",
"name": "Simple PetStore (node.js SDK, regional)"
}
Una vez realizados los pasos anteriores, puede seguir las instrucciones de the section called “Configurar
una API optimizada para bordes con el SDK de AWS para Node.js” (p. 245) para configurar métodos e
integraciones para esta API.
{restapi-id}.execute-api.{region}.amazonaws.com
https://{restapi-id}.execute-api.{region}.amazonaws.com/{stage}
Suponiendo que configura los métodos GET /pets y GET /pets/{petId} en este ejemplo, puede
probar la API escribiendo las siguientes URL en un navegador:
https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets
https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets/1
255
Amazon API Gateway Guía del desarrollador
Crear y configurar
Una solicitud de método de API es una solicitud HTTP. Para configurar la solicitud de método, debe
configurar un método (o verbo) HTTP, la ruta a un recurso de API, los encabezados y los parámetros
de cadenas de consulta aplicables. También configura una carga cuando el método HTTP es POST,
PUTo PATCH. Por ejemplo, para recuperar una mascota con la API de muestra PetStore (p. 43), define la
solicitud de método de API de GET /pets/{petId}, donde {petId} es un parámetro de ruta que puede
tomar un número en tiempo de ejecución.
GET /pets/1
Host: apigateway.us-east-1.amazonaws.com
...
Si el cliente especifica una ruta incorrecta, por ejemplo, /pet/1 o /pets/one en lugar de /pets/1, se
lanza una excepción.
Una respuesta de método de API es una respuesta HTTP con un código de estado determinado. Para
una integración que no sea de proxy, debe configurar respuestas de método para especificar los destinos
necesarios u opcionales de las asignaciones. Estos transforman los encabezados o el cuerpo de respuesta
de la integración en encabezados o en cuerpo de respuesta de método. El mapeo puede ser tan sencillo
como una transformación de identidad que pasa los encabezados o el cuerpo a través de la integración tal
y como están. Por ejemplo, la siguiente respuesta de método 200 muestra un ejemplo de transferencia de
una respuesta de integración correcta tal y como está.
200 OK
Content-Type: application/json
...
{
"id": "1",
"type": "dog",
"price": "$249.99"
}
En principio, puede definir una respuesta de método correspondiente a una respuesta específica desde
el backend. Normalmente, esto implica cualquier respuesta 2XX, 4XX y 5XX. Sin embargo, puede que no
sea práctico, porque a menudo es posible que no sepa con antelación todas las respuestas que puede
devolver un backend. En la práctica, puede designar una respuesta de método como predeterminada para
gestionar las respuestas desconocidas o no asignadas desde el backend. Es una buena práctica designar
la respuesta 500 como predeterminada. En cualquier caso, debe configurar al menos una respuesta de
método para integraciones que no sean de proxy. De lo contrario, API Gateway devuelve una respuesta de
error 500 al cliente incluso cuando la solicitud se completa correctamente en el backend.
Para admitir un SDK con establecimiento inflexible de tipos para la API, como un SDK de Java, debe
definir el modelo de datos de entrada para la solicitud de método y definir el modelo de datos de salida de
la respuesta de método.
256
Amazon API Gateway Guía del desarrollador
Crear y configurar
Temas
• Configurar una solicitud de método en API Gateway (p. 257)
• Configurar respuestas de método en API Gateway (p. 264)
• Configuración de un método con la consola de API Gateway (p. 266)
1. Creación de una nueva API o elección de una entidad Resource de API existente.
2. Creación de un recurso Method de API que sea un verbo HTTP específico en el Resource nuevo o
elegido de la API. Esta tarea se puede dividir aún más en las siguientes subtareas:
• Añadido de un método HTTP a la solicitud de métodos
• Configuración de parámetros de solicitudes
• Definición de un modelo para el cuerpo de la solicitud
• Aplicación de un esquema de autorización
• Habilitación de la validación de la solicitud
Para ver ejemplos del uso de estas herramientas, consulte Inicialización de la configuración de una API
REST en API Gateway (p. 239).
Temas
• Configurar recursos de API (p. 257)
• Configurar un método HTTP (p. 260)
• Configurar parámetros de solicitud de método (p. 260)
• Configurar un modelo de solicitud de método (p. 261)
• Configurar la autorización de solicitud de método (p. 262)
• Configurar la validación de solicitud de método (p. 263)
En una API de API Gateway, los recursos que se pueden dirigir se exponen como un árbol de entidades
Resources de API, con el recurso de raíz (/) en la parte superior de la jerarquía. El recurso de raíz
depende de la URL base de la API, que se compone del punto de enlace de la API y un nombre de etapa.
En la consola de API Gateway, este URI base se denomina Invoke URI y se muestra en el editor de etapas
de la API una vez que se implementa la API.
El punto de enlace de la API puede ser un nombre de host predeterminado o un nombre de dominio
personalizado. El nombre de host predeterminado tiene el siguiente formato:
{api-id}.execute-api.{region}.amazonaws.com
257
Amazon API Gateway Guía del desarrollador
Crear y configurar
En este formato, la {api-id} representa el identificador de la API que genera API Gateway. La variable
{region} representa la región de AWS (por ejemplo, us-east-1) que eligió al crear la API. Un nombre
de dominio personalizado es cualquier nombre fácil de recordar en un dominio de Internet válido. Por
ejemplo, si ha registrado un dominio de Internet de example.com, *.example.com es un nombre de
dominio personalizado válido. Para obtener más información, consulte configurar nombres de dominio
personalizados (p. 542).
Para la API de ejemplo de PetStore (p. 43), el recurso de raíz (/) expone la tienda de mascotas. El recurso
/pets representa la variedad de mascotas disponibles en la tienda. El /pets/{petId} expone una
mascota individual de un identificador concreto (petId). El parámetro de la ruta de {petId} forma parte
de los parámetros de solicitudes.
Para configurar un recurso de API, se elige un recurso existente como principal y, a continuación, se crea
el recurso secundario bajo el recurso principal. Se empieza con el recurso raíz como principal, se añade un
recurso a este principal, se añade otro recurso a este recurso secundario como nuevo principal, etc., a su
identificador principal. A continuación, se añade el recurso designado al principal.
Con CLI de AWS, puede llamar al comando get-resources para averiguar qué recursos de una API
están disponibles:
El resultado es una lista de los recursos disponibles de la API actualmente. En la API de nuestro ejemplo
de PetStore, esta lista sería similar a la siguiente:
{
"items": [
{
"path": "/pets",
"resourceMethods": {
"GET": {}
},
"id": "6sxz2j",
"pathPart": "pets",
"parentId": "svzr2028x8"
},
{
"path": "/pets/{petId}",
"resourceMethods": {
"GET": {}
},
"id": "rjkmth",
"pathPart": "{petId}",
"parentId": "6sxz2j"
},
{
"path": "/",
"id": "svzr2028x8"
}
]
}
Cada elemento enumera los identificadores del recurso (id) y, excepto el recurso raíz, su recurso principal
inmediato (parentId), así como el nombre del recurso (pathPart). El recurso raíz es especial, ya que
no tiene ninguno principal. Después de elegir un recurso como principal, llame al siguiente comando para
añadir un recurso secundario.
258
Amazon API Gateway Guía del desarrollador
Crear y configurar
--parent-id <parentId> \
--path-part <resourceName>
Por ejemplo, para añadir alimentos de mascotas para la venta en el sitio web de PetStore, añada un
recurso food a la raíz (/), estableciendo path-part para food y parent-id para svzr2028x8. El
resultado es similar al siguiente:
{
"path": "/food",
"pathPart": "food",
"id": "xdsvhp",
"parentId": "svzr2028x8"
}
A medida que crece el negocio, el propietario de PetStore puede que decida añadir a la venta alimentos,
juguetes y otros artículos relacionados con mascotas. Para sustentarlo, puede añadir /food, /toys
y otros recursos debajo del recurso raíz. Debajo de cada categoría de venta, es posible que también
desee añadir más recursos, como por ejemplo /food/{type}/{item}, /toys/{type}/{item},
etc. Esto puede ser una tarea tediosa. Si decide añadir una capa intermedia {subtype} a las rutas de
recursos para cambiar la jerarquía de rutas a /food/{type}/{subtype}/{item}, /toys/{type}/
{subtype}/{item}, etc., los cambios afectarán a la configuración existente de la API. Para evitarlo,
puede utilizar un recurso de proxy (p. 336) de API Gateway para exponer un conjunto de recursos de la
API a la vez.
API Gateway define un recurso de proxy como un marcador de posición para que un recurso se
especifique cuando se envíe la solicitud. Un recurso de proxy se expresa mediante un parámetro de ruta
especial de {proxy+}, a menudo denominado parámetro de ruta expansiva. El signo + indica los recursos
secundarios que lleva asociados. El marcador de posición /parent/{proxy+} equivale a cualquier
recurso que coincida con el patrón de ruta de /parent/*. El nombre de parámetro de ruta expansiva,
proxy, se puede sustituir con otra cadena, del mismo modo que se trata un nombre de parámetro de ruta
normal.
Con la CLI de AWS, llama al siguiente comando para configurar un recurso de proxy bajo la raíz (/{proxy
+}):
{
"path": "/{proxy+}",
"pathPart": "{proxy+}",
"id": "234jdr",
"parentId": "svzr2028x8"
}
Para el ejemplo de API de PetStore, puede utilizar /{proxy+} para representar tanto /pets como /
pets/{petId}. Este recurso de proxy también puede hacer referencia a cualquier otro recurso (existente
o que se vaya a añadir), como por ejemplo /food/{type}/{item}, /toys/{type}/{item}, etc., o
/food/{type}/{subtype}/{item}, /toys/{type}/{subtype}/{item}, etc. El desarrollador del
backend determina la jerarquía de recursos y el desarrollador cliente es responsable de comprenderlo. API
Gateway simplemente transfiere lo que envíe el cliente al backend.
259
Amazon API Gateway Guía del desarrollador
Crear y configurar
Una API puede tener más de un recurso de proxy. Por ejemplo, los siguientes recursos de proxy están
permitidos dentro de una API.
/{proxy+}
/parent/{proxy+}
/parent/{child}/{proxy+}
Cuando un recurso de proxy tiene elementos secundarios que no son de proxy, los recursos secundarios
se excluyen de la representación del recurso de proxy. En los ejemplos anteriores, /{proxy+} hace
referencia a cualquier recurso bajo el recurso raíz, excepto los recursos /parent[/*]. En otras palabras,
una solicitud de método realizada para un recurso específico prevalece sobre una solicitud de método
realizada para un recurso genérico en el mismo nivel de la jerarquía de recursos.
Un recurso de proxy no puede tener cualquier recurso secundario. Un recurso de API después de {proxy
+} es redundante y ambiguo. Los siguientes recursos de proxy no se permiten dentro de una API.
/{proxy+}/child
/parent/{proxy+}/{child}
/parent/{child}/{proxy+}/{grandchild+}
API Gateway, estrechamente asociado con el recurso de proxy, admite un método HTTP de ANY. Este
método ANY representa cualquier método HTTP que se suministre en el tiempo de ejecución. Le permite
utilizar una sola configuración de método de API para todos los métodos HTTP admitidos de DELETE, GET,
HEAD, OPTIONS, PATCH, POST y PUT.
También puede configurar el método ANY en un recurso que no sea de proxy. Al combinar el método
ANY con un recurso de proxy, obtiene una configuración de método de API único para todos los métodos
compatibles con HTTP frente a cualquier recurso de una API. Además, el backend puede evolucionar sin
que afecte a la configuración de API existente.
Antes de configurar un método de API, tenga en cuenta quién puede llamar al método. Establezca el tipo
de autorización según su plan. Para un acceso abierto, establézcalo en NONE. Para utilizar permisos de
IAM, establezca el tipo de autorización en AWS_IAM. Para utilizar una función de autorizador de Lambda,
establezca esta propiedad en CUSTOM. Para utilizar un grupo de usuarios de Amazon Cognito, establezca
el tipo de autorización en COGNITO_USER_POOLS.
El siguiente comando de CLI de AWS muestra cómo crear una solicitud de método del verbo ANY frente a
un recurso especificado (6sxz2j), mediante los permisos de IAM para controlar su acceso.
Para crear una solicitud de método de API con un tipo de autorización distinta, consulte the section called
“Configurar la autorización de solicitud de método” (p. 262).
260
Amazon API Gateway Guía del desarrollador
Crear y configurar
configuración de solicitud de método, debe declarar los parámetros de solicitud necesarios para que estén
disponibles para el cliente. Para la integración que no sea de proxy, puede traducir estos parámetros de
solicitud en un formato que sea compatible con el requisito del backend.
Por ejemplo, para la solicitud de métodos GET /pets/{petId}, la variable de ruta {petId} es un
parámetro de solicitud necesario. Puede declarar este parámetro de ruta al llamar al comando put-
method de la CLI de AWS. Esto se detalla de la siguiente manera:
En lugar de esta forma abreviada, puede utilizar una cadena de JSON para establecer el valor request-
parameters:
'{"method.request.querystring.type":false,"method.request-header.breed":false}'
Con esta configuración, el cliente puede consultar las mascotas por tipo:
GET /pets?type=dog
Además, el cliente puede consultar los perros de raza caniche de la siguiente manera:
GET /pets?type=dog
breed:poodle
Para obtener información sobre cómo asignar parámetros de solicitud de método a parámetros de solicitud
de integración, consulte the section called “Integraciones” (p. 331).
Para un método de API que pueda tomar datos de entrada en una carga, puede utilizar un modelo.
Un modelo se expresa en un esquema JSON, borrador 4 y describe la estructura de datos del cuerpo
de la solicitud. Con un modelo, un cliente puede determinar cómo construir una carga de solicitud de
métodos como entrada. Y lo que es más importante, API Gateway utiliza el modelo para validar una
solicitud (p. 376), generar un SDK (p. 633) e inicializar una plantilla de mapeo para configurar la
integración en la consola de API Gateway. Para obtener información sobre cómo crear un modelo, consulte
Crear modelos y plantillas de mapeo (p. 395).
En función de los tipos de contenido, una carga de método puede tener diferentes formatos. Un modelo
se indexa frente al tipo de medio de la carga aplicada. API Gateway utiliza el encabezado de la solicitud
261
Amazon API Gateway Guía del desarrollador
Crear y configurar
Content-Type para determinar el tipo de contenido. Para configurar modelos de solicitud de método,
agregue pares de clave-valor de formato "<media-type>":"<model-name>" al mapa requestModels
al llamar al comando put-method de la CLI de AWS.
Para utilizar el mismo modelo independientemente del tipo de contenido, especifique $default como
clave.
Por ejemplo, para establecer un modelo en la carga de JSON de la solicitud de método POST /pets de la
API de ejemplo de PetStore, puede llamar al siguiente comando de CLI de AWS:
Aquí, petModel es el valor de propiedad name de un recurso Model que describe una mascota. La
definición del esquema real se expresa como un valor de cadena JSON de la propiedad schema del
recurso Model.
En un SDK Java de la API, u otro tipo de SDK con establecimiento inflexible de tipos, los datos de entrada
se forman como la clase petModel derivada de la definición del esquema. Con el modelo de solicitud,
los datos de entrada en el SDK generado se forman en la clase Empty, que se deriva del modelo Empty
predeterminado. En este caso, el cliente no puede crear una instancia de la clase de datos correcta para
proporcionar la entrada necesaria.
Para controlar quién puede llamar al método de la API, puede configurar el tipo de autorización en el
método. Puede utilizar este tipo para aplicar uno de los autorizadores admitidos, incluidos roles y políticas
de IAM (AWS_IAM), un grupo de usuarios de Amazon Cognito (COGNITO_USER_POOLS), o un autorizador
de Lambda basado en funciones de Lambda (CUSTOM).
Para utilizar permisos de IAM para autorizar el acceso al método de la API, establezca la propiedad de
entrada authorization-type en AWS_IAM. Cuando esta opción está establecida, API Gateway verifica
la firma del intermediario en la solicitud, basándose en el identificador de clave de acceso de usuario de
IAM del intermediario y la clave secreta. Si el usuario verificado tiene permiso para llamar al método, se
acepta la solicitud. De lo contrario, se rechaza la solicitud y el intermediario recibe una respuesta de error
no autorizado. La llamada al método no da un resultado correcto, a menos que se haya concedido permiso
al intermediario para invocar el método de la API o que se le permita al intermediario que asuma un rol
para el que se le ha concedido permiso. El intermediario tiene permisos para llamar a este y a cualquier
otro método de la API creado por cualquier usuario de la misma cuenta de AWS si el intermediario tiene la
siguiente política de IAM asociada a su usuario de IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": "arn:aws:execute-api:*:*:*"
}
]
262
Amazon API Gateway Guía del desarrollador
Crear y configurar
Para obtener más información, consulte the section called “Usar permisos de IAM” (p. 287).
En la actualidad, esta política se puede conceder solo a los usuarios de IAM de la cuenta del propietario
de la API. Los usuarios de una cuenta de AWS diferente pueden llamar a los métodos de la API si se les
permite asumir un rol de la cuenta del propietario de la API y el rol asumido tiene los permisos adecuados
para la acción execute-api:Invoke. Para obtener más información sobre los permisos entre cuentas,
consulte Uso de roles de IAM.
Puede utilizar CLI de AWS, un SDK de AWS o un cliente de API REST, como Postman, que implementa el
Proceso de firma Signature Version 4.
Para utilizar un autorizador de Lambda para autorizar el acceso al método de la API, establezca
la propiedad de entrada authorization-type en CUSTOM y establezca la propiedad de entrada
authorizer-id en el valor de propiedad id de un autorizador de Lambda que ya exista. El autorizador
de Lambda al que se hace referencia puede ser del tipo TOKEN o REQUEST. Para obtener información
acerca de cómo crear un autorizador de Lambda, consulte the section called “Uso de autorizadores
Lambda” (p. 305).
Para utilizar un grupo de usuarios de Amazon Cognito para autorizar el acceso al método de la
API, establezca la propiedad de entrada authorization-type en COGNITO_USER_POOLS y
establezca la propiedad de entrada authorizer-id en el valor de propiedad id del autorizador
COGNITO_USER_POOLS que ya se ha creado. Para obtener información sobre la creación de un
autorizador de grupo de usuarios de Amazon Cognito, consulte the section called “Uso de grupos de
usuarios de Amazon Cognito como autorizador para una API REST” (p. 322).
Puede habilitar la validación de solicitud al configurar una solicitud de método de API. Primero tiene que
crear un validador de solicitudes:
Este comando de la CLI crea un validador de solicitud de solo cuerpo. A continuación, se muestra un
ejemplo de resultado:
{
"validateRequestParameters": true,
"validateRequestBody": true,
"id": "jgpyy6",
"name": "bodyOnlyValidator"
}
Con este validador de solicitud, puede habilitar la validación de solicitud como parte de la configuración de
solicitud de método:
263
Amazon API Gateway Guía del desarrollador
Crear y configurar
--request-models '{"application/json":"petModel"}'
--request-validator-id jgpyy6
Con las integraciones que no sean de proxy, los parámetros de respuesta especificados y el cuerpo
se pueden asignar desde los datos de respuesta de integración asociados o se les pueden asignar
determinados valores estáticos según las asignaciones. Estas asignaciones se especifican en la respuesta
de integración. La asignación puede ser una transformación idéntica que transfiere la respuesta de
integración tal y como es.
Con una integración de proxy, API Gateway transfiere la respuesta del backend a la respuesta del método
automáticamente. No es necesario configurar la respuesta del método de API. Sin embargo, con la
integración proxy de Lambda, la función de Lambda debe devolver un resultado de este formato de
salida (p. 351) para que API Gateway asigne correctamente la respuesta de integración a una respuesta
de método.
Al establecer códigos de estado para un método de API, debe elegir uno como predeterminado para
gestionar cualquier respuesta de integración de un código de estado no previsto. Es razonable establecer
500 como predeterminado, ya que esto equivale a emitir respuestas que de otro modo no estarían
asignadas como un error del servidor. Por motivos de instrucción, la consola de API Gateway establece la
respuesta 200 como la opción predeterminada. Pero puede restablecerla en la respuesta 500.
Para configurar una respuesta de método, debe haber creado la solicitud de método.
El código de estado de una respuesta de método define un tipo de respuesta. Por ejemplo, las respuestas
de 200, 400 y 500 indican respuestas de éxito, de error del lado del cliente y de error del lado del servidor,
respectivamente.
Los parámetros de respuesta de método definen qué encabezados recibe el cliente en respuesta a la
solicitud de método asociado. Los parámetros de respuesta también especifican un objetivo al que API
264
Amazon API Gateway Guía del desarrollador
Crear y configurar
Gateway asigna un parámetro de respuesta de integración, según los mapeos prescritos en la respuesta
de integración del método de la API.
Un modelo de respuesta de método define un formato del cuerpo de la respuesta del método. Antes de
configurar el modelo de respuesta, primero debe crear el modelo en API Gateway. Para ello, puede llamar
al comando create-model. El siguiente ejemplo muestra cómo crear un modelo PetStorePet para
describir el cuerpo de la respuesta para la solicitud de método GET /pets/{petId}.
Para configurar los modelos de respuesta de método para definir el formato de la carga, agregue el par de
clave-valor "application/json":"PetStorePet" al mapa requestModels del recurso MethodResponse. El
siguiente comando de CLI de AWS de put-method-response muestra cómo se realiza:
265
Amazon API Gateway Guía del desarrollador
Crear y configurar
• El método debe estar disponible en API Gateway. Siga las instrucciones en Tutorial: Desarrollo de una
API de REST con integración HTTP no de proxy (p. 56).
• Si desea que el método se comunique con una función de Lambda, debe haber creado ya el rol de
invocación de Lambda y el rol de ejecución de Lambda en IAM. También debe haber creado la función
de Lambda con la que el método se comunicará en AWS Lambda. Para crear los roles y la función,
utilice las instrucciones de Creación de una función de Lambda para la integración de Lambda no de
proxy (p. 34) de Desarrollo de una API de REST de API Gateway con integración Lambda (p. 26).
• Si desea que el método se comunique con una integración HTTP o de proxy HTTP, debe haber creado y
tener acceso a la URL del punto de enlace HTTP con la que se comunicará el método.
• Compruebe que API Gateway admite los certificados de los puntos de enlace HTTP y proxy de HTTP.
Para obtener más información, consulte Entidades de certificación compatibles con API Gateway para
las integraciones HTTP y Proxy HTTP (p. 667).
Temas
• Configurar una solicitud de método de API Gateway en la consola de API Gateway (p. 266)
• Configurar una respuesta de método de API Gateway en la consola de API Gateway (p. 268)
Estas instrucciones presuponen que ya ha completado los pasos que se detallan en Configuración
de una solicitud de integración de la API mediante la consola de API Gateway (p. 337). El mejor
modo de utilizarlas es para complementar las conversaciones que se indican en Desarrollo de una
API de REST de API Gateway con integración Lambda (p. 26).
1. Con el método seleccionado en el panel Resources (Recursos), elija Method Request (Solicitud de
método) en el panel Method Execution (Ejecución del método).
2. En Settings (Configuración), seleccione el icono de lápiz para abrir el menú desplegable Authorization
(Autorización) y elija uno de los autorizadores disponibles.
a. Para habilitar el acceso abierto al método a cualquier usuario, elija NONE. Este paso se puede
omitir si el ajuste predeterminado no se ha cambiado.
b. Para utilizar permisos de IAM para controlar el acceso de clientes al método, elija AWS_IAM. Con
esta opción, solo los usuarios de los roles de IAM con la política correcta de IAM asociada pueden
llamar a este método.
Para crear el rol de IAM, especifique una política de acceso con un formato como el siguiente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"resource-statement"
266
Amazon API Gateway Guía del desarrollador
Crear y configurar
]
}
]
}
Para crear el rol de IAM, puede adaptar las instrucciones de "Para crear el rol de invocación de
Lambda y su política" y "Para crear el rol de ejecución de Lambda y su política" de la sección
Crear funciones de Lambda (p. 34) de Desarrollo de una API de REST de API Gateway con
integración Lambda (p. 26).
Para guardar la selección, elija Update (Actualizar). De lo contrario, seleccione Cancel (Cancelar).
c. Para utilizar un autorizador de Lambda, elija uno en Token authorizer (Autorizador de tokens).
Debe haber creado un autorizador de Lambda para que esta opción se muestre en el menú
desplegable. Para obtener más información sobre cómo crear un autorizador de Lambda,
consulte Uso de autorizadores Lambda de API Gateway (p. 305).
d. Para utilizar un grupo de usuarios de Amazon Cognito, elija un grupo de usuarios disponible en
Cognito user pool authorizers (Autorizadores de grupos de usuarios de Cognito). Debe haber
creado un grupo de usuarios en Amazon Cognito y un autorizador de grupo de usuarios de
Amazon Cognito en API Gateway para que esta opción se muestre en el menú desplegable. Para
obtener información sobre cómo crear un autorizador de grupo de usuarios de Amazon Cognito,
consulte Control del acceso a una API de REST con grupos de usuarios de Amazon Cognito
como autorizador (p. 322).
3. Para habilitar o deshabilitar la validación de solicitud, haga clic en el icono de lápiz del menú
desplegable en Request Validator (Validador de solicitudes) y elija una de las opciones que se
muestran. Para obtener más información acerca de cada opción, consulte Habilitar la validación de
solicitudes en API Gateway (p. 376).
4. Para solicitar una clave de API, haga clic en el icono de lápiz para abrir el menú desplegable API Key
Required (Clave de API obligatoria) y elija true o false según los requisitos de la API. Cuando se
habilita, las claves de API se utilizan en planes de uso (p. 574) para limitar el tráfico del cliente.
5. Para añadir un parámetro de cadena de consulta al método, haga lo siguiente:
a. Elija la flecha situada junto a URL Query String Parameters (Parámetros de cadena de consulta
URL) y, a continuación, elija Add query string (Añadir cadena de consulta).
b. En Name (Nombre), escriba el nombre del parámetro de cadena de consulta.
c. Haga clic en el icono de marca de verificación para guardar el nuevo nombre de parámetro de
cadena de consulta.
d. Si el parámetro de cadena de consulta recién creado debe utilizarse para la validación de
solicitud, elija la opción Required (Obligatorio). Para obtener más información sobre la validación
de solicitud, consulte Habilitar la validación de solicitudes en API Gateway (p. 376).
e. Si el parámetro de cadena de consulta recién creado debe utilizarse como parte de una clave
de almacenamiento en caché, marque la opción Caching (Almacenamiento en caché). Esto solo
puede aplicarse cuando se habilita el almacenamiento en caché. Para obtener más información
acerca del almacenamiento en caché, consulte Usar parámetros de método o integración como
claves de caché para indexar las respuestas almacenadas en caché (p. 566).
Tip
Para eliminar el parámetro de cadena de consulta, haga clic en el icono x asociado al mismo
y, a continuación, elija Remove this parameter and any dependent parameters (Eliminar este
parámetro y todos los parámetros dependientes) para confirmar la eliminación.
267
Amazon API Gateway Guía del desarrollador
Crear y configurar
Para cambiar el nombre del parámetro de cadena de consulta, elimínelo y cree uno nuevo.
6. Para añadir un parámetro de encabezado al método, haga lo siguiente:
a. Elija la flecha situada junto a HTTP Request Headers (Encabezados de solicitud HTTP) y, a
continuación, elija Add header (Añadir encabezado).
b. Para Name (Nombre), escriba el nombre del parámetro de encabezado y, a continuación, haga
clic en el icono de marca de verificación para guardar la configuración.
c. Si el parámetro de encabezado recién creado debe utilizarse para la validación de solicitud, elija
la opción Required (Obligatorio). Para obtener más información sobre la validación de solicitud,
consulte Habilitar la validación de solicitudes en API Gateway (p. 376).
d. Si el parámetro de encabezado recién creado debe utilizarse como parte de una clave de
almacenamiento en caché, elija la opción Caching (Almacenamiento en caché). Esto solo puede
aplicarse cuando se habilita el almacenamiento en caché. Para obtener más información acerca
del almacenamiento en caché, consulte Usar parámetros de método o integración como claves de
caché para indexar las respuestas almacenadas en caché (p. 566).
Tip
Los modelos disponibles actualmente para la API incluyen los modelos predeterminados Empty
y Error, así como cualquier modelo que haya creado y agregado a la colección Models de
la API. Para obtener más información acerca de la creación de un modelo, consulte Crear un
modelo (p. 395).
Note
El modelo es útil para informar al cliente del formato de datos esperado de una carga.
Resulta útil para generar una plantilla de asignación de esqueleto. Es importante para
generar un SDK con establecimiento inflexible de tipos de la API en idiomas como Java,
C #, Objective-C y Swift. Solo es necesario si se habilita la validación de solicitudes
frente a la carga.
8. Para asignar un nombre de operación en un SDK de Java de esta API, generado por API Gateway,
expanda SDK Settings (Configuración del SDK) y escriba un nombre en Operation name (Nombre
de operación). Por ejemplo, para la solicitud de método de GET /pets/{petId}, el nombre de
operación de SDK de Java correspondiente es por defecto GetPetsPetId. Este nombre se crea a
partir del verbo HTTP del método (GET) y los nombres de variables de la ruta de recursos (Pets y
PetId). Si establece el nombre de operación como getPetById, el nombre de operación de SDK
pasa a ser GetPetById.
Un método de API puede tener una o más respuestas. Cada respuesta se indexa mediante su código
de estado HTTP. De forma predeterminada, la consola de API Gateway agrega la respuesta 200 a las
268
Amazon API Gateway Guía del desarrollador
Control de acceso
respuestas de método. Puede modificarla, por ejemplo, para que el método devuelva 201 en su lugar.
Puede añadir otras respuestas, por ejemplo, 409 para la denegación de acceso y 500 para las variables
de etapa sin inicializar utilizadas.
Para utilizar la consola de API Gateway para modificar, eliminar o agregar una respuesta a un método de
API, siga estas instrucciones.
1. Elija Method Response (Respuesta de método) en Method Execution (Ejecución del método) para un
método concreto de un recurso de API.
2. Para añadir una respuesta nueva, elija Add Response (Añadir respuesta).
a. Escriba un código de estado HTTP; por ejemplo, 200, 400, o 500, para HTTP Status (Estado de
HTTP) y, a continuación, haga clic en el icono de marca de verificación para guardar la selección.
Si una respuesta devuelta del backend no tiene una respuesta de método correspondiente
definida, API Gateway no puede devolver la respuesta al cliente. En su lugar, devuelve una
respuesta de error 500 Internal server error.
b. Amplíe la respuesta del código de estado dado.
c. Elija Add Header (Añadir encabezado).
d. Escriba un nombre para Name (Nombre) en Response Headers for {status} (Encabezados de
respuesta para {estado}) y, a continuación, haga clic en el icono de marca de verificación para
guardar la selección.
Si necesita traducir cualquier encabezado devuelto por el backend a uno definido en una
respuesta de método, primero debe añadir el encabezado de la respuesta de método tal y como
se describe en este paso.
e. Elija Add Response Model (Añadir modelo de respuesta) en Response Body for {status}
(Cuerpo de respuesta para {estado}).
f. Escriba el tipo de medio de la carga de respuesta de Content type (Tipo de contenido) y elija un
modelo en el menú desplegable Models (Modelos).
g. Haga clic en el icono de marca de verificación para guardar la configuración.
3. Para modificar una respuesta existente, expanda la respuesta y siga el Paso 2 anterior.
4. Para eliminar una respuesta, haga clic en el icono x para la respuesta y confirme que desea eliminar la
respuesta.
Para cada respuesta que devuelve el backend, debe tener una respuesta compatible configurada como
respuesta de método. Sin embargo, los encabezados de respuesta de método de configuración y el
modelo de carga son opcionales, a menos que asigne el resultado del backend a la respuesta de método
antes de volver al cliente. Además, un modelo de carga de respuesta de método es importante si está
generando un SDK con establecimiento inflexible de tipos para su API.
• Gracias a las políticas de recursos, puede crear políticas basadas en recursos para permitir o denegar
el acceso a sus API y métodos desde determinadas direcciones IP de origen o determinados puntos
de enlace de la VPC. Para obtener más información, consulte the section called “Uso de políticas de
recursos de API Gateway” (p. 270).
• Los roles y políticas de AWS IAM estándar ofrecen controles de acceso flexibles y robustos que se
pueden aplicar a toda una API o a métodos individuales. Puede usar roles y políticas de IAM para
269
Amazon API Gateway Guía del desarrollador
Control de acceso
controlar quién puede crear y administrar sus API, así como quién puede invocarlas. Para obtener más
información, consulte the section called “Usar permisos de IAM” (p. 287).
• Las etiquetas de IAM se pueden utilizar con políticas de IAM para controlar el acceso. Para obtener más
información, consulte the section called “Control de acceso basado en etiquetas” (p. 834).
• Las políticas de punto de enlace para los puntos de enlace de la VPC de interfaz le permiten asociar las
políticas de recursos de IAM a puntos de enlace de interfaz de la VPC para mejorar la seguridad de sus
API privadas. Para obtener más información, consulte the section called “Utilizar políticas de punto de
enlace de la VPC para API privadas” (p. 303).
• Los autorizadores Lambda son funciones de Lambda que controlan el acceso a los métodos de
la API REST utilizando la autenticación de token al portador, así como la información descrita por
los encabezados, rutas, cadenas de consulta, variables de etapa o parámetros de solicitud de
variables contextuales. Los autorizadores Lambda se utilizan para controlar quién puede invocar los
métodos REST API. Para obtener más información, consulte the section called “Uso de autorizadores
Lambda” (p. 305).
• Los grupos de usuarios de Amazon Cognito permiten crear soluciones personalizables de autenticación
y autorización para las API REST. Los grupos de usuarios de Amazon Cognito se utilizan para controlar
quién puede invocar los métodos de la API REST. Para obtener más información, consulte the section
called “Uso de grupos de usuarios de Amazon Cognito como autorizador para una API REST” (p. 322).
Puede utilizar los siguientes mecanismos para realizar otras tareas relacionadas con el control de acceso:
• El uso compartido de recursos entre orígenes (CORS) permite controlar la forma en que la API REST
responde a las solicitudes de recursos entre dominios. Para obtener más información, consulte the
section called “CORS” (p. 445).
• Los certificados SSL del lado del cliente pueden utilizarse para verificar que las solicitudes HTTP
dirigidas a su sistema backend proceden de API Gateway. Para obtener más información, consulte the
section called “Certificados de cliente” (p. 664).
• AWS WAF se puede utilizar para proteger la API de API Gateway frente a ataques web comunes. Para
obtener más información, consulte the section called “AWS WAF” (p. 683).
Puede utilizar los siguientes mecanismos para rastrear y limitar el acceso concedido a los clientes
autorizados:
• Los planes de uso permiten proporcionar claves de API a sus clientes y, después, realizar un
seguimiento y limitar el uso de etapas y métodos de API para cada clave de API. Para obtener más
información, consulte the section called “Planes de uso” (p. 574).
Puede utilizar las políticas de recursos con todos los tipos de enlace de la API de API Gateway: privados,
optimizados para bordes y regionales.
270
Amazon API Gateway Guía del desarrollador
Control de acceso
Para API privadas, puede utilizar las políticas de recursos junto con las políticas de punto de enlace de
la VPC para controlar qué entidades principales tienen acceso a qué recursos y acciones. Para obtener
más información, consulte the section called “Utilizar políticas de punto de enlace de la VPC para API
privadas” (p. 303).
Puede asociar una política de recursos a una API utilizando la consola de administración de AWS, la CLI
de AWS o los SDK de AWS.
Las políticas de recursos de API Gateway son diferentes de las políticas basadas en entidades de IAM.
Las políticas basadas en identidades de IAM se asocian a usuarios, grupos o roles de IAM y definen qué
acciones pueden realizar esas identidades y en qué recursos. Las políticas de recursos de API Gateway
están asociadas a recursos. Para obtener un análisis más detallado de las diferencias entre las políticas
basadas en identidades y las políticas de recursos, consulte Políticas basadas en identidades y políticas
basadas en recursos.
Puede utilizar las políticas de recursos de API Gateway junto con las políticas de IAM.
Temas
• Información general del lenguaje de políticas de acceso para Amazon API Gateway (p. 271)
• Cómo afectan las políticas de recursos de API Gateway al flujo de trabajo de autorización (p. 272)
• Ejemplos de políticas de recursos de API Gateway (p. 281)
• Creación y asociación de una política de recursos de API Gateway a una API (p. 284)
• Claves de condición de AWS que se pueden utilizar en las políticas de recursos de API
Gateway (p. 285)
Las políticas de recursos se especifican utilizando la misma sintaxis que para las políticas de IAM. Para
obtener información completa acerca del lenguaje de políticas, consulte Información general sobre las
políticas de IAM y Referencia de políticas de AWS Identity and Access Management en la guía del usuario
de IAM.
Para obtener información sobre cómo decide un servicio de AWS si se permite o se deniega una solicitud
determinada, consulte Determinar si se permite o deniega una solicitud.
• Recursos: las API son los recursos de Amazon API Gateway para los que puede conceder o denegar
permisos. En una política, se usa el nombre de recurso de Amazon (ARN) para identificar el recurso.
También puede utilizar sintaxis abreviada, que API Gateway expande automáticamente al ARN completo
al guardar una política de recursos. Para obtener más información, consulte Ejemplos de políticas de
recursos de API Gateway (p. 281).
Para conocer el formato del elemento Resource completo, consulte Formato de Resource de permisos
para ejecutar la API en API Gateway (p. 296).
• Acciones: para cada recurso, Amazon API Gateway admite un conjunto de operaciones. Con las
palabras clave de acción puede identificar las operaciones del recurso que desea permitir o denegar.
Por ejemplo, el permiso execute-api:Invoke autorizará al usuario a invocar una API previa solicitud
del cliente.
271
Amazon API Gateway Guía del desarrollador
Control de acceso
Para conocer el formato del elemento Action, consulte Formato de Action de permisos para ejecutar la
API en API Gateway (p. 296).
• Efecto: el efecto que se obtendrá cuando el usuario solicite la acción específica. Puede ser Allow o
Deny. También puede denegar de forma explícita el acceso a un recurso para asegurarse de que un
usuario no obtenga acceso a él, aunque otra política se lo conceda.
Note
La política de recursos del ejemplo siguiente ilustra los elementos comunes de política mencionados
anteriormente. La política concede acceso a la API bajo el account-id especificado en la región
especificada a cualquier usuario cuya dirección IP de origen está en el bloque de direcciones
123.4.5.6/24. La política deniega todo el acceso a la API si la IP de origen del usuario no está dentro
del rango.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:region:account-id:*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:region:account-id:*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "123.4.5.6/24"
}
}
}
]
}
Temas
• Solo política de recursos de API Gateway (p. 273)
• Autorizador de Lambda y política de recursos (p. 274)
• Autenticación de IAM y política de recursos (p. 276)
272
Amazon API Gateway Guía del desarrollador
Control de acceso
En este flujo de trabajo, una política de recursos de API Gateway está asociada a la API, pero no se
ha definido ningún tipo de autenticación para la API. Para evaluar la política ay que buscar un permiso
explícito en función de los criterios de entrada del intermediario. Una denegación implícita o cualquier
denegación explícita provoca la denegación del intermediario.
{
"Version": "2012-10-17",
"Statement": [
{
273
Amazon API Gateway Guía del desarrollador
Control de acceso
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:region:account-id:api-id/",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
}
}
}
]
}
En este flujo de trabajo, un autorizador de Lambda está configurado para la API, además de una política
de recursos. La política de recursos se evalúan en dos fases. Antes de llamar al autorizador de Lambda,
API Gateway primero evalúa la política y comprueba si hay denegaciones explícitas. Si se encuentran, se
deniega inmediatamente el acceso al intermediario. De lo contrario, se llamada al autorizador de Lambda,
que devuelve un documento de política (p. 316), que se evalúa junto con la política de recursos. El
resultado se determina en función de la Tabla A (p. 280) (cerca del final de este tema).
La siguiente política de recursos de ejemplo solo permite llamadas desde el punto de enlace de la
VPC cuyo ID de punto de enlace de la VPC sea vpce-1a2b3c4d. Durante la evaluación "previa a la
autenticación"·, solo se permiten las llamadas procedentes del punto de enlace de la VPC que se indican
l el ejemplo para seguir adelante y evaluar el autorizador de Lambda. Todas las llamadas restantes se
bloquean.
274
Amazon API Gateway Guía del desarrollador
Control de acceso
275
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:region:account-id:api-id/"
],
"Condition" : {
"StringNotEquals": {
"aws:SourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}
En este flujo de trabajo, se ha configurado la autenticación de IAM para la API, además de una política de
recursos. Después de autenticar al usuario con el servicio de IAM, se evalúan las políticas asociadas al
usuario de IAM y a la política de recursos. El resultado varía en función de si el intermediario se encuentra
en la misma cuenta, o en una cuenta de AWS diferente, del propietario de la API.
276
Amazon API Gateway Guía del desarrollador
Control de acceso
277
Amazon API Gateway Guía del desarrollador
Control de acceso
El siguiente ejemplo muestra una política de recursos entre cuentas. Si presuponemos que la política de
usuario de IAM contiene un permiso Allow, esta política de recursos solo permite llamadas desde la VPC
cuyo ID de VPC sea vpc-2f09a348. (Consulte la Tabla B (p. 280) al final de este tema.)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "",
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:region:account-id:api-id/"
],
"Condition" : {
"StringEquals": {
"aws:SourceVpc": "vpc-2f09a348"
}
}
}
]
}
En este flujo de trabajo, se configura un grupo de usuarios de Amazon Cognito (p. 322) para la API,
además de una política de recursos. API Gateway intenta primero autenticar a la persona que llama a
través de Amazon Cognito. Esto se realiza normalmente a través de un token JWT proporcionado por la
persona que llama. Si la autenticación se realiza correctamente, la política de recursos se evalúa de forma
independiente, y se requiere un permiso explícito. Una denegación o "ni permitir ni denegar" da como
resultado una denegación. El siguiente ejemplo muestra una política de recursos que podrían utilizarse
junto con grupos de usuarios de Amazon Cognito.
278
Amazon API Gateway Guía del desarrollador
Control de acceso
279
Amazon API Gateway Guía del desarrollador
Control de acceso
El siguiente ejemplo muestra una política de recursos que solo permite llamadas desde direcciones IP de
origen específicas, suponiendo que el token de autenticación de Amazon Cognito contiene un permiso.
(Consulte la Tabla A (p. 280) cerca del final de este tema.)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:region:account-id:api-id/",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
}
}
}
]
}
La tabla A muestra el comportamiento resultante cuando el acceso a una API de API Gateway está
controlado por una política de IAM (o un autorizador de grupos de usuarios de Lambda o Amazon Cognito)
y una política de recursos de API Gateway, que se encuentran en la misma cuenta de AWS.
La tabla B muestra el comportamiento resultante cuando el acceso a una API de API Gateway está
controlado por una política de IAM (o un autorizador de grupos de usuarios de Lambda o Amazon Cognito)
y una política de recursos de API Gateway, que se encuentran en diferentes cuentas de AWS. Si no existe
un permiso ni una denegación, el acceso entre cuentas se deniega. Esto se debe a que el acceso entre
cuentas requiere que la política de recursos y la política de IAM (o un autorizador de Lambda o grupos de
usuarios de Amazon Cognito) concedan acceso de forma explícita.
280
Amazon API Gateway Guía del desarrollador
Control de acceso
Las políticas de ejemplo siguientes utilizan una sintaxis simplificada para especificar el recurso de API.
Esta sintaxis simplificada es una forma abreviada de hacer referencia a un recurso de API, en lugar
de especificar el nombre de recursos de Amazon (ARN) completo. API Gateway convierte la sintaxis
abreviada en el ARN completo al guardar la política. Por ejemplo, puede especificar el recurso execute-
api:/stage-name/GET/pets en una política de recursos. API Gateway convierte el recurso en
arn:aws:execute-api:us-east-2:123456789012:aabbccddee/stage-name/GET/pets cuando
se guarda la política de recursos. API Gateway crea el ARN completo utilizando la región actual, el ID de
su cuenta de AWS y el ID de la API REST con la que está asociada la política de recursos. Puede utilizar
execute-api:/* para representar todas las etapas, métodos y rutas de la API actual. Para obtener
información acerca del lenguaje de la política de acceso, consulte Información general del lenguaje de
políticas de acceso para Amazon API Gateway (p. 271).
Temas
• Ejemplo: Permitir que los usuarios de otra cuenta de AWS utilicen una API (p. 281)
• Ejemplo: Cómo denegar el tráfico a una API para una dirección o un rango de direcciones IP de
origen (p. 282)
• Ejemplo: Denegar el tráfico de API basado en la dirección IP de origen o rango cuando se utiliza una
API privada (p. 282)
• Ejemplo: Permitir el tráfico de una API privada en función del punto de enlace de la VPC o la VPC de
origen (p. 283)
Ejemplo: Permitir que los usuarios de otra cuenta de AWS utilicen una API
En el siguiente ejemplo de política de recursos, se concede a la API acceso en una cuenta de AWS a
dos usuarios de una cuenta de AWS diferente a través de los protocolos Signature Version 4 (SigV4). En
concreto, se concede a Alice y al usuario raíz para la cuenta de AWS identificado por account-id-2 la
acción execute-api:Invoke para ejecutar la acción GET en el recurso pets (API) en la cuenta de AWS.
281
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::account-id-2:user/Alice",
"account-id-2"
]
},
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/stage/GET/pets"
]
}
]
}
Ejemplo: Cómo denegar el tráfico a una API para una dirección o un rango de direcciones IP de
origen
El siguiente ejemplo de política de recursos deniega (bloquea) el tráfico entrante a una API privada
procedente de dos bloques de direcciones IP de origen especificadas.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
],
"Condition" : {
"IpAddress": {
"aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
}
}
}
]
}
Ejemplo: Denegar el tráfico de API basado en la dirección IP de origen o rango cuando se utiliza
una API privada
El siguiente ejemplo de política de recursos deniega (bloquea) el tráfico entrante a una API privada
procedente de dos bloques de direcciones IP de origen especificadas. Cuando se utilizan API privadas,
el punto de enlace final de VPC para execute-api vuelve a escribir la dirección IP de origen original. La
condición aws:VpcSourceIp filtra la solicitud contra la dirección IP del solicitante original.
{
"Version": "2012-10-17",
282
Amazon API Gateway Guía del desarrollador
Control de acceso
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
],
"Condition" : {
"IpAddress": {
"aws:VpcSourceIp": ["192.0.2.0/24", "198.51.100.0/24"]
}
}
}
]
}
Ejemplo: Permitir el tráfico de una API privada en función del punto de enlace de la VPC o la VPC
de origen
En el ejemplo siguiente, las políticas de recursos permiten el tráfico entrante en una API privada solo
desde una nube virtual privada (VPC) o un punto de enlace de la VPC especificados.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
],
"Condition" : {
"StringNotEquals": {
"aws:SourceVpc": "vpc-1a2b3c4d"
}
}
}
]
}
283
Amazon API Gateway Guía del desarrollador
Control de acceso
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
],
"Condition" : {
"StringNotEquals": {
"aws:SourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}
La política de recursos se puede asociar a la API en el momento en que se crea la API o más tarde. En el
caso de las API privadas, tenga en cuenta que hasta que la política de recursos se asocie a la API privada,
se producirá un error en todas las llamadas a la API.
Important
Si actualiza la política de recursos después de crear la API, tendrá que implementar la API para
propagar los cambios después de asociar la política actualizada. Si únicamente se actualiza o
se guarda la política, no se modifica el comportamiento en tiempo de ejecución de la API. Para
obtener más información acerca cómo implementar una API, consulte Implementación de una API
de REST en Amazon API Gateway (p. 510).
El acceso se puede controlar mediante elementos de condición de IAM; por ejemplo, condiciones de la
cuenta de AWS, de la VPC de origen, del punto de enlace de la VPC o del intervalo de direcciones IP. Si
la entidad Principal de la política se establece en "*", se pueden utilizar otros tipos de autorización
junto con la política de recursos. Si la entidad Principal se establece en "AWS", se producirá un error de
autorización para todos los recursos no protegidos con la autorización AWS_IAM, incluidos los recursos no
seguros.
En las secciones siguientes se describe cómo crear su propia política de recursos de API Gateway y
asociarla a una API. Al asociar una política, se aplican los permisos de la política a los métodos de la API.
Important
Si usa la consola de API Gateway para asociar una política de recursos a una API implementada
o actualiza una política de recursos existente, tendrá que volver a implementar la API para que los
cambios surtan efecto.
284
Amazon API Gateway Guía del desarrollador
Control de acceso
Temas
• Asociación de políticas de recursos de API Gateway (consola) (p. 285)
• Asociación de políticas de recursos de API Gateway (CLI de AWS) (p. 285)
Para utilizar la CLI de AWS para asociar una política de recursos a una API existente, llame al comando
update-rest-api tal y como se indica a continuación:
Para obtener más información sobre las claves de condición de AWS, consulte Claves de contexto de
condición globales de AWS.
285
Amazon API Gateway Guía del desarrollador
Control de acceso
286
Amazon API Gateway Guía del desarrollador
Control de acceso
• Para crear, implementar y administrar una API en API Gateway, debe conceder al desarrollador de la
API permisos para realizar las acciones necesarias admitidas por el componente de administración de la
API de API Gateway.
• Para llamar a una API implementada o para actualizar el almacenamiento en caché de la API, debe
conceder al intermediario de la API permisos para realizar las acciones de IAM necesarias admitidas por
el componente de ejecución de la API de API Gateway.
El control de acceso para los dos procesos implica diferentes modelos de permisos, que se explican a
continuación.
En este documento de política de IAM, el elemento Resource contiene una lista de entidades API de
API Gateway, incluidos los recursos de API Gateway y las relaciones de enlace de API Gateway. El
elemento Action de IAM contiene las acciones de administración de API de API Gateway necesarias.
Estas acciones se declaran con el formato apigateway:HTTP_VERB, donde apigateway designa el
componente de administración de la API subyacente de API Gateway y HTTP_VERB representa los verbos
HTTP admitidos por API Gateway.
Para obtener más información sobre cómo usar este modelo de permisos, consulte Controlar el acceso
para administrar una API (p. 289).
287
Amazon API Gateway Guía del desarrollador
Control de acceso
En esta instrucción de política de permisos de IAM, el elemento Resource de IAM contiene una lista de
métodos de la API implementada identificados por verbos HTTP y rutas de recursos de API Gateway. El
elemento Action de IAM contiene las acciones de ejecución de API de API Gateway necesarias. Estas
acciones incluyen execute-api:Invoke o execute-api:InvalidateCache, donde execute-api
designa el componente de ejecución de la API subyacente de API Gateway.
Para obtener más información sobre cómo usar este modelo de permisos, consulte Controlar el acceso
para invocar una API (p. 294).
Cuando una API está integrada con un servicio de AWS (por ejemplo, AWS Lambda) en el backend,
API Gateway también debe tener permisos para obtener acceso a los recursos de AWS integrados (por
ejemplo, invocar una función de Lambda) en nombre del intermediario de la API. Para conceder estos
permisos, cree un rol de IAM del tipo AWS service for API Gateway. Cuando crea este rol en la consola de
administración de IAM, este rol resultante contiene la siguiente política de confianza de IAM que designa a
API Gateway como la entidad de confianza capaz de asumir el rol:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Si crea el rol de IAM llamando al comando create-role de la CLI o a un método del SDK correspondiente,
debe proporcionar la política de confianza anterior como el parámetro de entrada de assume-role-
policy-document. No intente crear esta política directamente en la consola de administración de IAM o
llamando al comando create-policy de la CLI de AWS o un método del SDK correspondiente.
Para que API Gateway llame al servicio de AWS integrado, también debe asociar a este rol las políticas de
permisos de IAM correspondientes para llamar a los servicios de AWS integrados. Por ejemplo, para llamar
a una función de Lambda, debe incluir la siguiente política de permisos de IAM en el rol de IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
288
Amazon API Gateway Guía del desarrollador
Control de acceso
Tenga en cuenta que Lambda admite la política de acceso basada en recursos, que combina políticas de
confianza y de permisos. Cuando integre una API con una función de Lambda mediante la consola de API
Gateway, no se le pedirá que establezca este rol de IAM explícitamente, porque la consola establece los
permisos basados en recursos en la función de Lambda por usted, con su consentimiento.
Note
Para establecer el control del acceso a un servicio de AWS, puede utilizar el modelo de permisos
basado en el intermediario, donde una política de permisos se asocia directamente al usuario o
grupo de IAM del intermediario, o el modelo de permisos basado en rol, donde una política de
permisos se asocia a un rol de IAM que API Gateway puede asumir. Los permisos de políticas
pueden ser diferentes en los dos modelos. Por ejemplo, la política basada en el intermediario
bloquea el acceso, mientras que la política basada en roles lo permite. Puede aprovechar esto
para exigir que un usuario de IAM tenga acceso a un servicio de AWS únicamente a través de la
API de API Gateway.
Controlar quién puede crear y administrar una API de API Gateway con políticas de IAM
Para controlar quién puede o no puede crear, implementar y actualizar la API con el servicio de
administración de la API de API Gateway, cree un documento de política de IAM con los permisos
necesarios, tal y como se muestra en la siguiente plantilla de política:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Permission",
"Action": [
"apigateway:HTTP_VERB"
],
"Resource": [
"arn:aws:apigateway:region::resource1-path",
"arn:aws:apigateway:region::resource2-path",
...
]
}
]
}
Aquí Permission puede ser Allow o Deny para conceder o revocar, respectivamente, los derechos de
acceso estipulados por la instrucción de política. Para obtener más información, consulte Permisos de IAM
en AWS.
HTTP_VERB pueden ser cualquiera de los verbos HTTP admitidos por API Gateway (p. 290). * se puede
utilizar para designar cualquiera de los verbos HTTP.
Resource contiene una lista de los ARN de las entidades de API afectadas, incluidas RestApi,
Resource, Method, Integration, DocumentationPart, Model, Authorizer, UsagePlan, etc. Para obtener más
información, consulte Formato de Resource de permisos para administrar API en API Gateway (p. 291).
Combinando diferentes instrucciones de políticas, puede personalizar los permisos de acceso para
usuarios individuales, grupos o roles para tener acceso a las entidades de API seleccionadas y para
realizar acciones específicas en esas entidades. Por ejemplo, puede incluir la siguiente instrucción en
289
Amazon API Gateway Guía del desarrollador
Control de acceso
la política de IAM para conceder al equipo de documentación permiso para crear, publicar, actualizar y
eliminar las partes de documentación de una API determinada, así como para ver las entidades de la API.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:GET"
],
"Resource": [
"arn:aws:apigateway:region::/restapis/api-id/*"
]
},
{
"Effect": "Allow",
"Action": [
"apigateway:POST",
"apigateway:PATCH",
"apigateway:DELETE"
],
"Resource": [
"arn:aws:apigateway:region::/restapis/api-id/documentation/*"
]
}
]
}
Para el equipo de desarrollo de la API, que es el responsable de todas las operaciones, puede incluir la
siguiente instrucción en la política de IAM para concederle permisos de acceso mucho más amplios.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:*"
],
"Resource": [
"arn:aws:apigateway:*::/*"
]
}
]
}
La siguiente información describe el formato de los elementos Action y Resource usados en una
instrucción de política de IAM para conceder o revocar los permisos para administrar entidades de API de
API Gateway.
apigateway:action
290
Amazon API Gateway Guía del desarrollador
Control de acceso
arn:aws:apigateway:region::resource-path-specifier
donde region es una región de AWS de destino (como us-east-1 o * para todas las regiones de AWS
admitidas) y resource-path-specifier es la ruta de acceso a los recursos de destino.
Para obtener más información, consulte Referencia del nombre de recurso de Amazon (ARN) de API
Gateway (p. 766).
291
Amazon API Gateway Guía del desarrollador
Control de acceso
En las políticas de IAM que cree para las API, puede utilizar elementos Condition para permitir el acceso
únicamente a determinados autorizadores o integraciones de Lambda.
El bloque Condition utiliza operadores de condición booleanos para emparejar la condición de la política
con los valores de la solicitud. El operador de condición StringXxx funcionará tanto para la integración
de AWS (en la que el valor debe ser un ARN de función de Lambda) como para la integración de HTTP (en
la que el valor debe ser un URI HTTP). Se admiten los siguientes operadores de condición StringXxx:
StringEquals, StringNotEquals, StringEqualsIgnoreCase, StringNotEqualsIgnoreCase,
StringLike, StringNotLike. Para obtener más información, consulte Operadores de condición de
cadena en la guía del usuario de IAM.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:POST"
],
"Resource": [
"arn:aws:apigateway:[region]::/restapis/restapi_id/authorizers"
],
//Create Authorizer operation is allowed only with the following Lambda
function
"Condition": {
"StringEquals": {
"apigateway:AuthorizerUri":
"arn:aws:apigateway:region:lambda:path/2015-03-31/functions/
arn:aws:lambda:region:123456789012:function:example/invocations"
}
}
}
]
}
A continuación se muestra un ejemplo de política de IAM para controlar una función de integración de
Lambda entre cuentas:
Para conceder a otra cuenta de AWS permiso para que pueda llamar a integration:put o a put-
integration con el fin de configurar una integración de Lambda en una API, puede incluir la siguiente
instrucción en la política de IAM.
292
Amazon API Gateway Guía del desarrollador
Control de acceso
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:PUT"
],
"Resource": [
"arn:aws:apigateway:api-region::/restApis/api-id/resources/resource-id/
methods/GET/integration"
],
//PutIntegration is only valid with the following Lambda function
"Condition": {
"StringEquals": {
"apigateway:IntegrationUri": "arn:aws:lambda:region:account-
id:function:lambda-function-name"
}
}
}
]
}
Como permitir a otra cuenta administrar la función de Lambda que se utiliza para importar un
archivo de OpenAPI
Para conceder a otra cuenta de AWS permiso para que pueda llamar a restapi:import o a import-
rest-api con el fin de importar un archivo de OpenAPI, puede incluir la siguiente instrucción en la política
de IAM.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:POST"
],
"Resource": "arn:aws:apigateway:*::/restapis",
"Condition": {
"StringLike": {
"apigateway:IntegrationUri": [
"arn:aws:apigateway:apigateway-region:lambda:path/2015-03-31/
functions/arn:aws:lambda:lambda-region:account-id:function:lambda-function-name/
invocations"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"apigateway:POST"
],
"Resource": "arn:aws:apigateway:*::/restapis",
"Condition": {
"StringLike": {
"apigateway:AuthorizerUri": [
"arn:aws:apigateway:apigateway-region:lambda:path/2015-03-31/
functions/arn:aws:lambda:lambda-region:account-id:function:lambda-function-name/
invocations"
293
Amazon API Gateway Guía del desarrollador
Control de acceso
]
}
}
}
]
}
Para API privadas, debe utilizar una combinación de una política de recursos de API Gateway y una
política de punto de enlace de la VPC. Para obtener más información, consulte los siguientes temas:
• the section called “Uso de políticas de recursos de API Gateway” (p. 270)
• the section called “Utilizar políticas de punto de enlace de la VPC para API privadas” (p. 303)
Controlar quién puede llamar a una API de API Gateway con políticas de IAM
Para controlar quién puede o no puede llamar a una API implementada con permisos de IAM, cree un
documento de política de IAM con los permisos necesarios. A continuación, se muestra una plantilla para
un documento de política como este.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Permission",
"Action": [
"execute-api:Execution-operation"
],
"Resource": [
"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path"
]
}
]
}
Aquí, Permission se sustituirá por Allow o Deny dependiendo de si desea conceder o revocar los
permisos incluidos. Execution-operation se sustituirá por las operaciones compatibles con el servicio
de ejecución de la API. METHOD_HTTP_VERB hace referencia a un verbo HTTP compatible con los
recursos especificados. Resource-path es el marcador de posición de la ruta URL de una instancia
de Resource de la API implementada que admite el METHOD_HTTP-VERB mencionado. Para obtener
más información, consulte Referencia de instrucciones de políticas de IAM para ejecutar la API en API
Gateway (p. 296).
Note
Para que las políticas de IAM sean eficaces, debe haber habilitado la autenticación de IAM en los
métodos de API configurando AWS_IAM para la propiedad authorizationType de los métodos.
En caso contrario, estos métodos de API serán accesibles públicamente.
Por ejemplo, para conceder a un usuario permiso para ver una lista de mascotas expuesta por una API
determinada, pero denegarle permiso para agregar una mascota a la lista, se podría incluir la siguiente
instrucción en la política de IAM:
294
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:account-id:api-id/*/GET/pets"
]
},
{
"Effect": "Deny",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:account-id:api-id/*/POST/pets"
]
}
]
}
Para conceder a un usuario permiso para ver una mascota específica expuesta por una API que se
configura como GET /pets/{petId}, podría incluir la siguiente declaración en la política de IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:account-id:api-id/*/GET/pets/a1b2"
]
}
]
}
Para el equipo de desarrolladores que prueba las API, puede incluir la siguiente instrucción en la política
de IAM para permitir a cualquier desarrollador del equipo llamar a cualquier método de cualquier recurso
de cualquier API en la etapa test.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke",
"execute-api:InvalidateCache"
],
"Resource": [
"arn:aws:execute-api:*:*:*/test/*"
]
}
]
}
295
Amazon API Gateway Guía del desarrollador
Control de acceso
La siguiente información describe el formato de Action y Resource de las instrucciones de política de IAM
de permisos de acceso para ejecutar una API.
execute-api:action
arn:aws:execute-api:region:account-id:api-id/stage-name/HTTP-VERB/resource-path-specifier
donde:
• region es la región de AWS (como us-east-1 o * para todas las regiones de AWS) que se
corresponde con la API implementada para el método.
• account-id es el ID de cuenta de 12 dígitos de AWS del propietario de la API REST.
• api-id es el identificador que API Gateway ha asignado a la API para el método (se puede usar * para
todas las API, independientemente del identificador de la API).
• stage-name es el nombre de la etapa asociada con el método (se puede utilizar * para todas las
etapas, independientemente del nombre de la etapa).
• HTTP-VERB es el verbo HTTP del método. Puede ser uno de los siguientes: GET, POST, PUT, DELETE,
PATCH. (* se puede utilizar para todos los verbos HTTP).
• resource-path-specifier es la ruta al método deseado (se puede usar * para todas las rutas).
• arn:aws:execute-api:*:*:* para cualquier ruta de recurso en cualquier etapa, para cualquier API
de cualquier región de AWS. (Equivale a *).
• arn:aws:execute-api:us-east-1:*:* para cualquier ruta de recurso en cualquier etapa, para
cualquier API en la región de AWS de us-east-1.
• arn:aws:execute-api:us-east-1:*:api-id/* para cualquier ruta de recurso en cualquier etapa,
para la API con el identificador api-id de la región de AWS us-east-1.
• arn:aws:execute-api:us-east-1:*:api-id/test/* para la ruta del recurso en la etapa test,
para la API con el identificador api-id en la región de AWS us-east-1.
• arn:aws:execute-api:us-east-1:*:api-id/test/*/mydemoresource/* para cualquier ruta
del recurso junto la ruta mydemoresource, para cualquier método HTTP en la etapa test, para la API
con el identificador api-id en la región de AWS us-east-1.
• arn:aws:execute-api:us-east-1:*:api-id/test/GET/mydemoresource/* para los métodos
GET en cualquier ruta de recurso junto con la ruta mydemoresource, en la etapa test, para la API con
el identificador api-id en la región de AWS us-east-1.
296
Amazon API Gateway Guía del desarrollador
Control de acceso
Para obtener más información, consulte Referencia del nombre de recurso de Amazon (ARN) de API
Gateway (p. 766).
Temas
• Permisos sencillos de lectura (p. 297)
• Permisos de solo lectura en cualquier API (p. 298)
• Permisos de acceso completo a cualquier recurso de API Gateway (p. 299)
• Permisos de acceso completo para administrar las etapas de API (p. 299)
• Impedir a usuarios especificados eliminar recursos de la API (p. 300)
La siguiente instrucción de política concede al usuario permiso para obtener información acerca de todos
los recursos, métodos, modelos y etapas de la API con el identificador a123456789 en la región de AWS
us-east-1:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:GET"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/a123456789/*"
]
}
]
}
La siguiente instrucción de política de ejemplo concede al usuario de IAM permiso para mostrar
información para todos los recursos, métodos, modelos y etapas en cualquier región. El usuario también
tiene permiso para realizar todas las acciones de API Gateway disponibles para la API con el identificador
a123456789 en la región de AWS us-east-1:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:GET"
],
"Resource": [
"arn:aws:apigateway:*::/restapis/*"
]
},
{
"Effect": "Allow",
"Action": [
297
Amazon API Gateway Guía del desarrollador
Control de acceso
"apigateway:*"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/a123456789/*"
]
}
]
}
El siguiente documento de política permitirá a las entidades asociadas (usuarios, grupos o roles) recuperar
cualquiera de las API de la cuenta de AWS del intermediario. Esto incluye todos los recursos secundarios
de una API, como el método, la integración, etc.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1467321237000",
"Effect": "Deny",
"Action": [
"apigateway:POST",
"apigateway:PUT",
"apigateway:PATCH",
"apigateway:DELETE"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/*"
]
},
{
"Sid": "Stmt1467321341000",
"Effect": "Deny",
"Action": [
"apigateway:GET"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/",
"arn:aws:apigateway:us-east-1::/account",
"arn:aws:apigateway:us-east-1::/clientcertificates",
"arn:aws:apigateway:us-east-1::/domainnames",
"arn:aws:apigateway:us-east-1::/apikeys"
]
},
{
"Sid": "Stmt1467321344000",
"Effect": "Allow",
"Action": [
"apigateway:GET"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/*"
]
}
]
}
La primera instrucción Deny prohíbe explícitamente las llamadas de POST, PUT, PATCH, DELETE en
cualquier recurso en API Gateway. De este modo, se garantiza que otros documentos de política,
asociados también al intermediario, no invaliden dichos permisos. La segunda instrucción Deny impide
al intermediario consultar el recurso raíz (/), la información de la cuenta (/account), los certificados del
cliente (/clientcertificates), los nombres de dominios personalizados (/domainnames) y las claves
298
Amazon API Gateway Guía del desarrollador
Control de acceso
de API (/apikeys). Juntas, las tres instrucciones garantizan que el intermediario solo pueda consultar los
recursos relacionados con la API. Esto puede resultar útil en las pruebas de la API cuando no desee que el
evaluador modifique el código.
Para restringir el acceso de solo lectura anterior a las API especificadas, sustituya la propiedad Resource
de la instrucción Allow por lo siguiente:
"Resource": ["arn:aws:apigateway:us-east-1::/restapis/restapi_id1/*",
"arn:aws:apigateway:us-east-1::/restapis/restapi_id2/*"]
El siguiente documento de política de ejemplo concede acceso completo a cualquiera de los recursos de
API Gateway de la cuenta de AWS.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1467321765000",
"Effect": "Allow",
"Action": [
"apigateway:*"
],
"Resource": [
"*"
]
}
]
}
En general, debe abstenerse de utilizar una política de acceso tan amplia y abierta. Puede ser necesaria
para que su equipo de desarrollo de la API pueda crear, implementar, actualizar y eliminar cualquier
recurso de API Gateway.
El siguiente documento de política de ejemplo concede permisos de acceso completo a los recursos
relacionados con la etapa de cualquier API en la cuenta de AWS del intermediario.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:*"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/*/stages",
"arn:aws:apigateway:us-east-1::/restapis/*/stages/*"
]
}
]
}
El documento de política anterior concede permisos de acceso completo solo a la colección stages y a
cualquiera de los recursos stage incluidos, siempre que no se asocie ninguna otra política que conceda
más acceso al intermediario. De lo contrario, debe denegar explícitamente todos los accesos.
299
Amazon API Gateway Guía del desarrollador
Control de acceso
Con esta política, el intermediario debe conocer el identificador de la API de REST de antemano, ya
que el usuario no puede llamar a GET /restapis para consultar las API disponibles. Además, si no
se especifica arn:aws:apigateway:us-east-1::/restapis/*/stages en la lista Resource, el
recurso Stages no estará accesible. En este caso, el intermediario no podrá crear una etapa ni obtener
las etapas existentes, aunque puede consultar, actualizar o eliminar una etapa, siempre que conozca el
nombre de la etapa.
Para conceder permisos para etapas de la API específicas, solo tiene que sustituir la propiedad
restapis/* de las especificaciones Resource por restapis/restapi_id, donde restapi_id es el
identificador de la API específica.
El siguiente documento de política de ejemplo de IAM impide a un usuario especificado eliminar cualquier
recurso en API Gateway.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1467331998000",
"Effect": "Allow",
"Action": [
"apigateway:GET",
"apigateway:PATCH",
"apigateway:POST",
"apigateway:PUT"
],
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/*"
]
},
{
"Sid": "Stmt1467332141000",
"Effect": "Allow",
"Action": [
"apigateway:DELETE"
],
"Condition": {
"StringNotLike": {
"aws:username": "johndoe"
}
},
"Resource": [
"arn:aws:apigateway:us-east-1::/restapis/*"
]
}
]
}
Esta política de IAM concede permiso de acceso completo para crear, implementar, actualizar y eliminar
API a los usuarios, grupos o roles asociados, excepto al usuario especificado (johndoe), que no puede
eliminar ningún recurso de la API. Se asume que ningún otro documento de política que conceda permisos
Allow en la raíz, las claves de API, los certificados del cliente o los nombres de dominio personalizados se
ha asociado al intermediario.
Para impedir que el usuario especificado elimine recursos de API Gateway específicos, por ejemplo, una
API concreta o los recursos de una API, sustituya la especificación Resource anterior por esta:
"Resource": ["arn:aws:apigateway:us-east-1::/restapis/restapi_id_1",
"arn:aws:apigateway:us-east-1::/restapis/restapi_id_2/resources"]
300
Amazon API Gateway Guía del desarrollador
Control de acceso
La siguiente instrucción de política concede al usuario permiso para llamar a cualquier método POST
en la ruta mydemoresource, en la etapa test, para la API con el identificador de API a123456789,
suponiendo que la API correspondiente se ha implementado en la región de AWS us-east-1:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:*:a123456789/test/POST/mydemoresource/*"
]
}
]
}
La siguiente instrucción de política de ejemplo concede al usuario permiso para llamar a cualquier método
en la ruta del recurso petstorewalkthrough/pets, en cualquier etapa, para la API con el identificador
a123456789, en cualquier región de AWS en la que se haya implementado la API correspondiente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:*:*:a123456789/*/*/petstorewalkthrough/pets"
]
}
]
}
Para que un usuario pueda llamar al servicio de administración de la API o al servicio de ejecución de la
API, debe crear una política de IAM para un usuario de IAM, que controle el acceso a las entidades de API
Gateway y después asociar la política al usuario de IAM. Los siguientes pasos describen cómo crear la
política de IAM.
301
Amazon API Gateway Guía del desarrollador
Control de acceso
5. En Policy Document (Documento de política), escriba una instrucción de política con el formato
siguiente y, a continuación, elija Create Policy (Crear política):
{
"Version": "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"action-statement"
],
"Resource" : [
"resource-statement"
]
},
{
"Effect" : "Allow",
"Action" : [
"action-statement"
],
"Resource" : [
"resource-statement"
]
}
]
}
Acaba de crear una política de IAM. No tendrá ningún efecto hasta que la asocie a un usuario de IAM, a un
grupo de IAM que contenga al usuario o a un rol de IAM asumido por el usuario.
1. Para el usuario elegido, elija la pestaña Permissions (Permisos) y, a continuación, elija Attach Policy
(Asociar política).
2. En Grant permissions (Conceder permisos), elija Attach existing policies directly (Asociar las políticas
existentes directamente).
3. Elija el documento de política que acaba de crear en la lista mostrada y, a continuación, elija Next:
Review (Siguiente: Revisar).
4. En Permissions summary (Resumen de permisos), elija Add permissions (Añadir permisos).
Del mismo modo, si lo desea, puede agregar el usuario a un grupo de IAM, si el usuario aún no es
miembro, y asociar el documento de política al grupo para que las políticas asociadas se apliquen a todos
los miembros del grupo. Esto es útil para administrar y actualizar configuraciones de políticas en un grupo
de usuarios de IAM. A continuación, explicaremos cómo asociar la política a un grupo de IAM, suponiendo
que ya haya creado el grupo y haya agregado al usuario al grupo.
302
Amazon API Gateway Guía del desarrollador
Control de acceso
Para que API Gateway llame a otros servicios de AWS en su nombre, cree un rol de IAM del tipo Amazon
API Gateway.
Una política de punto de enlace de la VPC es una política de recursos de IAM que se puede asociar a
un punto de enlace de la VPC de interfaz para controlar el acceso al punto de enlace. Para obtener más
información, consulte Control del acceso a los servicios con Puntos de conexión de la VPC. Puede utilizar
una política de punto de enlace para restringir el tráfico procedente de su red interna para obtener acceso
a API privada. Tiene la opción de permitir o no el acceso a API privada específicas a las que se puede
acceder mediante el punto de enlace de la VPC.
Las políticas de punto de enlace de la VPC se pueden utilizar junto con las políticas de recursos de API
Gateway. La política de recursos se utiliza para especificar las entidades principales que pueden tener
acceso a la API. La política de puntos de enlace especifica qué API privadas se pueden llamar a través
del punto de enlace de la VPC. Para obtener más información sobre las políticas de recursos, consulte the
section called “Uso de políticas de recursos de API Gateway” (p. 270).
303
Amazon API Gateway Guía del desarrollador
Control de acceso
Para asociar la política al punto de enlace de la VPC, tendrá que utilizar la consola de VPC. Para obtener
más información, consulte Control del acceso a los servicios con Puntos de conexión de la VPC.
{
"Statement": [
{
"Principal": "*",
"Action": [
"execute-api:Invoke"
],
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/*",
"arn:aws:execute-api:us-east-1:123412341234:aaaaa11111/*"
]
}
]
}
{
"Statement": [
{
"Principal": "*",
"Action": [
"execute-api:Invoke"
],
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/stageName/GET/*"
]
}
]
}
{
"Statement": [
{
"Principal": {
"AWS": [
304
Amazon API Gateway Guía del desarrollador
Control de acceso
"arn:aws:iam::123412341234:user/MyUser"
]
},
"Action": [
"execute-api:Invoke"
],
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/*"
]
}
]
}
Para obtener más información, consulte the section called “Control de acceso basado en
etiquetas” (p. 834).
Cuando un cliente realiza una solicitud a uno de los métodos de la API, API Gateway llama a su
autorizador de Lambda, que toma la identidad del intermediario como entrada y devuelve una política de
IAM como salida.
• Un autorizador de Lambda basado en token (también llamado autorizador TOKEN) recibe la identidad
del intermediario en un token al portador, como, por ejemplo, un JSON Web Token (JWT) o un token de
OAuth.
• Un autorizador de Lambda basado en parámetros de solicitud (también denominado autorizador
REQUEST) recibe la identidad del autor de la llamada en una combinación de encabezados, parámetros
de cadena de consulta, stageVariables (p. 436) y variables $context (p. 425).
Para las API de WebSocket, solo se admiten los autorizadores basados en parámetros de la solicitud.
Se puede utilizar una función AWS Lambda de otra cuenta de AWS distinta de la cuenta en la que
creó la función de autorizador de Lambda. Para obtener más información, consulte the section called
“Configuración de un autorizador de Lambda entre cuentas” (p. 320).
Temas
• Flujo de trabajo de autorización para autorizadores de Lambda (p. 306)
• Pasos para crear un autorizador de Lambda de API Gateway (p. 307)
• Crear una función del autorizador de Lambda de API Gateway en la consola de Lambda. (p. 307)
305
Amazon API Gateway Guía del desarrollador
Control de acceso
1. El cliente llama a un método en un método de la API de API Gateway, pasando un token al portador o
parámetros de solicitud.
2. API Gateway comprueba si hay configurado un autorizador de Lambda para el método. Si es así, API
Gateway llama a la función de Lambda.
3. La función de Lambda autentica al intermediario mediante métodos como los siguientes:
• Si se deniega el acceso, API Gateway devuelve un código de estado HTTP apropiado, como por
ejemplo 403 ACCESS_DENIED.
• Si se permite el acceso, API Gateway ejecuta el método. Si el almacenamiento en caché está
habilitado en la configuración de autorizador, API Gateway también almacena en caché la política
de modo que no es necesario volver a invocar la función del autorizador de Lambda.
306
Amazon API Gateway Guía del desarrollador
Control de acceso
1. Cree la función del autorizador de Lambda en la consola de Lambda tal y como se describe en the
section called “Crear una función del autorizador de Lambda en la consola de Lambda.” (p. 307).
Puede utilizar uno de los ejemplos de proyecto como punto de partida y personalizar la
entrada (p. 314) y salida (p. 316) como desee.
2. Configure la función de Lambda como un autorizador de API Gateway y configurar un método de API
para exigirlo tal y como se describe en the section called “Configuración de un autorizador de Lambda
mediante la consola” (p. 312). Por otro lado, si necesita un autorizador de Lambda entre cuentas,
consulte the section called “Configuración de un autorizador de Lambda entre cuentas” (p. 320).
Note
Para las funciones del autorizador de Lambda de ejemplo en esta sección, que no llaman a otros servicios,
puede utilizar el AWSLambdaBasicExecutionRole integrado. Al crear la función de Lambda para el
autorizador de Lambda de API Gateway, tendrá que asignar un rol de ejecución de IAM para la función
de Lambda si esta llama a otros servicios de AWS. Para crear el rol, siga las instrucciones de Rol de
ejecución de AWS Lambda.
Para crear una función de autorizador de Lambda basada en tokens, escriba el siguiente código Node.js
en la consola de Lambda y pruébelo en la consola de API Gateway, tal y como se indica a continuación.
307
Amazon API Gateway Guía del desarrollador
Control de acceso
// string, the authorizer function returns an HTTP 401 status code. For any other token
value,
// the authorizer returns an HTTP 500 status code.
// Note that token values are case-sensitive.
authResponse.principalId = principalId;
if (effect && resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17';
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval",
"numberKey": 123,
"booleanKey": true
};
return authResponse;
}
308
Amazon API Gateway Guía del desarrollador
Control de acceso
17. Elija Create (Crear), y, a continuación, elija Grant & Create (Conceder y crear).
18. Elija Test.
19. Para el valor authorizationToken escriba allow.
20. Elija Test.
En este ejemplo, cuando la API recibe una solicitud de método, API Gateway pasa el token de origen
a esta función de autorizador de Lambda en el atributo event.authorizationToken. La función del
autorizador de Lambda lee el token y actúa como se indica a continuación:
• Si el valor del token es 'allow', la función del autorizador devuelve una respuesta HTTP 200 OK y
una política de IAM que tiene un aspecto similar al siguiente, y la solicitud del método se lleva a cabo
correctamente:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-
stage/GET/"
}
]
}
• Si el valor del token es 'deny', la función del autorizador devolverá una respuesta HTTP 403
Forbidden y una política Deny de IAM similar a la siguiente y se producirá un error en la solicitud del
método:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Deny",
"Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-
stage/GET/"
}
]
}
• Si el valor del token es 'unauthorized' o una cadena vacía, la función del autorizador devolverá una
respuesta HTTP 401 Unauthorized y la llamada al método producirá un error.
• Si el token es cualquier otra cosa, el cliente recibirá una respuesta 500 Invalid token y la llamada al
método producirá un error.
Note
Además de devolver una política de IAM, la función del autorizador de Lambda también debe devolver
el identificador principal del intermediario. También puede devolver un objeto context, que contiene
información adicional que puede pasarse al backend de integración. Para obtener más información,
consulte Salida de un autorizador de Lambda de Amazon API Gateway (p. 316).
309
Amazon API Gateway Guía del desarrollador
Control de acceso
Para crear una función de autorizador de Lambda basada en solicitudes, escriba el siguiente código
Node.js en la consola de Lambda y pruébelo en la consola de API Gateway, tal y como se indica a
continuación.
// Perform authorization to return the Allow policy for correct parameters and
// the 'Unauthorized' error, otherwise.
var authResponse = {};
var condition = {};
condition.IpAddress = {};
310
Amazon API Gateway Guía del desarrollador
Control de acceso
En este ejemplo, la función del autorizador de Lambda comprueba los parámetros de entrada y actúa como
se indica a continuación:
• Si todos los valores de los parámetros necesarios coinciden con los valores previstos, la función del
autorizador devuelve una respuesta HTTP 200 OK y una política de IAM que tiene un aspecto similar al
siguiente, y la solicitud del método se lleva a cabo correctamente:
{
"Version": "2012-10-17",
"Statement": [
311
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-
stage/GET/"
}
]
}
• De lo contrario, la función del autorizador devuelve una respuesta HTTP 401 Unauthorized y la
llamada al método produce un error.
Note
Además de devolver una política de IAM, la función del autorizador de Lambda también debe devolver
el identificador principal del intermediario. También puede devolver un objeto context, que contiene
información adicional que puede pasarse al backend de integración. Para obtener más información,
consulte Salida de un autorizador de Lambda de Amazon API Gateway (p. 316).
Si elige permitir que la consola de API Gateway defina la política basada en recursos, se mostrará el
cuadro de diálogo Add Permission to Lambda Function (Agregar permiso a la función de Lambda).
Seleccione OK. Una vez creada la autorización de Lambda, puede probarla con los valores del token
de autorización adecuados para comprobar que funciona según lo previsto.
8. Para Lambda Event Payload (Carga de evento de Lambda), elija Token para un autorizador TOKEN o
bien Request para un autorizador REQUEST. (Es lo mismo que establecer la propiedad type en TOKEN
o REQUEST).
9. Dependiendo de la elección del paso anterior, lleve a cabo alguna de las siguientes operaciones:
312
Amazon API Gateway Guía del desarrollador
Control de acceso
• Escriba el nombre de un encabezado en Token Source (Origen del token). El cliente de la API
debe incluir un encabezado con este nombre para enviar el token de autorización al autorizador
de Lambda.
• Opcionalmente, proporcione una instrucción RegEx en el campo de entrada Token
Validation. API Gateway realiza la validación inicial del token de entrada contra esta
expresión e invoca el autorizador tras una validación correcta. Esto ayuda a reducir la
posibilidad de que se cobre por tokens no válidos.
• Para Authorization Caching (Almacenamiento en caché de autorizaciones), seleccione o anule
la selección de la opción Enabled (Habilitado), en función de si desea almacenar en caché o
no la política de autorización generada por el autorizador. Cuando se activa el almacenamiento
en caché de políticas, puede modificar el valor TTL. Si establece TTL en cero se desactivará
el almacenamiento en caché de políticas. Cuando el almacenamiento en caché de las políticas
esté habilitado, el nombre del encabezado especificado en Token Source (Origen del token)
pasará a ser la clave de caché.
Note
API Gateway utiliza las fuentes de identidad especificadas como la clave de caché del
autorizador de la solicitud. Cuando está habilitado el almacenamiento en caché, API Gateway
llama a la función de Lambda del autorizador solo después de verificar correctamente que
todas las fuentes de identidad especificadas estén presentes en tiempo de ejecución. Si falta
alguna fuente de identidad especificada, o bien es nula o está vacía, API Gateway devolverá
una respuesta 401 Unauthorized sin llamar a la función de Lambda del autorizador.
Cuando se definen varias fuentes de identidad, todas se utilizan para obtener la clave de caché
del autorizador. Cambiar cualquiera de las partes de la clave de caché hace que el autorizador
descarte el documento de políticas almacenado en caché y genere otro nuevo.
• Para Authorization Caching (Almacenamiento en caché de autorizaciones), seleccione o anule
la selección de la opción Enabled (Habilitado), en función de si desea almacenar en caché o no
la política de autorización generada por el autorizador. Cuando se activa el almacenamiento en
caché de políticas, puede modificar el valor TTL del valor predeterminado (300). Si establece
TTL=0, se desactivará el almacenamiento en caché de políticas.
Note
Para habilitar el almacenamiento en caché, su autorizador debe devolver una política que se
aplique a todos los métodos a través de una API. Para forzar la política especificada por el
método, puede establecer el valor de TTL en cero para deshabilitar el almacenamiento en
caché de políticas para la API.
10. Elija Create (Crear) para crear el nuevo autorizador de Lambda para la API elegida.
11. Una vez que se crea el autorizador para la API, tiene la opción de probar la llamada a un autorizador
antes de configurarlo en un método.
313
Amazon API Gateway Guía del desarrollador
Control de acceso
Para el autorizador TOKEN, escriba un token válido en el campo de texto de entrada Identity token
(Token de identidad) y seleccione Test (Probar). El token se transferirá a la función de Lambda
como el encabezado que especificó en la configuración de Identity token source (Origen de token de
identidad) del autorizador.
Para el autorizador REQUEST, escriba los parámetros de solicitud válidos correspondientes a las
fuentes de identidad especificadas y, a continuación, seleccione Test (Probar).
Además de utilizar la consola de API Gateway, puede utilizar la CLI de AWS o un SDK de AWS para
API Gateway para probar la llamada a un autorizador. Para hacerlo a través de CLI de AWS, consulte
test-invoke-authorizer.
Note
El procedimiento siguiente muestra cómo configurar un método de API para que use el autorizador de
Lambda.
1. Vuelva a la API. Cree un nuevo método o elija un método existente. Si es necesario, cree un nuevo
recurso.
2. En Method Execution (Ejecución del método), elija el enlace Method Request (Solicitud de método).
3. En Settings (Configuración), expanda la lista desplegable Authorization (Autorización) para seleccionar
el autorizador de Lambda que acaba de crear (por ejemplo, myTestApiAuthorizer) y, a continuación,
elija el icono de marca de verificación para guardar la selección.
4. Si lo desea, mientras está en la página Method Request (Solicitud de método), elija Add header
(Añadir encabezado) si también quiere pasar el token de autorización al backend. En Name (Nombre),
escriba un nombre de encabezado que coincida con el nombre de Token Source (Origen del token)
que especificó al crear el autorizador de Lambda para la API. A continuación, haga clic en el icono
de marca de verificación para guardar la configuración. Este paso no se aplica a los autorizadores
REQUEST.
5. Elija Deploy API (Implementar API) para implementar la API en una etapa. Anote el valor de Invoke
URL (Invocar URL). Lo necesitará cuando llame a la API. En el caso de los autorizadores REQUEST
que utilizan variables de etapa, también debe definir las variables de etapa necesarias y especificar
sus valores en Stage Editor (Editor de etapas).
314
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"type":"TOKEN",
"authorizationToken":"{caller-supplied-token}",
"methodArn":"arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/
[{resource}/[{child-resources}]]"
}
En este ejemplo, la propiedad type especifica el tipo de autorizador, que es un autorizador TOKEN.
{caller-supplied-token} procede del encabezado de autorización de una solicitud del cliente.
methodArn es el ARN de la solicitud del método de entrada y lo rellena API Gateway de acuerdo con la
configuración del autorizador de Lambda.
Para la función de Lambda del autorizador TOKEN de ejemplo mostrada en la sección anterior, la cadena
caller-supplied-token es allow, deny, unauthorized o cualquier otro valor de cadena. Una
cadena vacía es lo mismo que unauthorized. A continuación se muestra un ejemplo de este tipo de
entrada para obtener una política Allow en el método GET de una API (ymy8tbxw7b) de la cuenta de
AWS (123456789012) en cualquier etapa (*).
{
"type":"TOKEN",
"authorizationToken":"allow",
"methodArn":"arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/"
}
Para un autorizador de Lambda del tipo REQUEST, API Gateway transmite los parámetros de solicitud
necesarios a la función de Lambda del autorizador como parte del objeto event. Los parámetros de
solicitud afectados incluyen encabezados, parámetros de ruta, parámetros de cadenas de consulta,
variables de etapa y algunas variables de contexto de solicitud. El intermediario de la API puede definir
parámetros de ruta, encabezados y parámetros de cadenas de consulta. El desarrollador de la API debe
establecer las variables de etapa durante la implementación de la API y API Gateway proporciona el
contexto de la solicitud en tiempo de ejecución.
Note
Los parámetros de la ruta se pueden pasar como parámetros de solicitud a la función del
autorizador de Lambda pero no se pueden usar como fuentes de identidad.
El siguiente ejemplo muestra una entrada de un autorizador REQUEST para un método de la API (GET /
request) con una integración de proxy:
{
"type": "REQUEST",
"methodArn": "arn:aws:execute-api:us-east-1:123456789012:s4x3opwd6i/test/GET/request",
"resource": "/request",
"path": "/request",
"httpMethod": "GET",
"headers": {
"X-AMZ-Date": "20170718T062915Z",
"Accept": "*/*",
"headerauth1": "headerValue1",
"CloudFront-Viewer-Country": "US",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Is-Mobile-Viewer": "false",
"User-Agent": "...",
"X-Forwarded-Proto": "https",
"CloudFront-Is-SmartTV-Viewer": "false",
"Host": "....execute-api.us-east-1.amazonaws.com",
"Accept-Encoding": "gzip, deflate",
"X-Forwarded-Port": "443",
"X-Amzn-Trace-Id": "...",
315
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"principalId": "yyyyyyyy", // The principal user identification associated with the token
sent by the client.
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow|Deny",
"Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/
[{resource}/[{child-resources}]]"
}
]
},
"context": {
"stringKey": "value",
316
Amazon API Gateway Guía del desarrollador
Control de acceso
"numberKey": "1",
"booleanKey": "true"
},
"usageIdentifierKey": "{api-key}"
}
Aquí, una instrucción de política especifica si se permite o deniega (Effect) al servicio de ejecución de
API Gateway invocar (Action) el método de API especificado (Resource). Puede utilizar un carácter
comodín (*) para especificar un tipo de recurso (método). Para obtener información sobre la configuración
de políticas válidas para llamar a una API, consulte Referencia de instrucciones de políticas de IAM para
ejecutar la API en API Gateway (p. 296).
En el caso de los ARN del método con autorización habilitada (por ejemplo, arn:aws:execute-
api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-
resources}]]), la longitud máxima es de 1600 bytes. Los valores de parámetros de ruta, cuyo tamaño
se determina en tiempo de ejecución, pueden provocar que la longitud del ARN supere el límite. Cuando
esto ocurra, el cliente de la API recibirá una respuesta 414 Request URI too long.
Además, el ARN de recurso, tal y como se muestra en la instrucción de política de salida que ha realizado
el autorizador, está limitado actualmente a 512 caracteres. Por este motivo, no debe utilizar la URI con un
token JWT que tenga una longitud considerable en una URI de la solicitud. Puede transferir de manera
segura el token JWT en un encabezado de solicitud.
Puede tener acceso al valor principalId de una plantilla de asignación utilizando la variable
$context.authorizer.principalId. Esto resulta útil si desea transmitir el valor al backend. Para
obtener más información, consulte Variables $context para modelos de datos, autorizadores, plantillas
de mapeo y registro de acceso de CloudWatch (p. 425).
Puede obtener acceso al valor de stringKey, numberKey o booleanKey (por ejemplo, "value", "1" o
"true") del mapa context en una plantilla de mapeo llamando a $context.authorizer.stringKey,
$context.authorizer.numberKey o $context.authorizer.booleanKey, respectivamente. Los
valores devueltos se representan en forma de cadena. Observe que no puede establecer un objeto o
matriz JSON como un valor válido de ninguna clave en el mapa context.
Puede utilizar el mapa context para devolver las credenciales almacenadas en caché del autorizador al
backend utilizando una plantilla de mapeo de una solicitud de integración. Esto permite que el backend
proporcione una mejor experiencia de usuario mediante la utilización de las credenciales almacenadas en
caché para reducir la necesidad de obtener acceso a las claves secretas y abrir los tokens de autorización
para cada solicitud.
{api-key} representa una clave de API en el plan de uso de la etapa de API. Para obtener más
información, consulte the section called “Planes de uso” (p. 574).
El siguiente ejemplo muestra la salida del ejemplo de autorizador de Lambda. La salida del ejemplo
contiene una instrucción de política para bloquear (Deny) las llamadas al método GET de una API
(ymy8tbxw7b) de una cuenta de AWS (123456789012) en cualquier etapa (*).
{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Deny",
317
Amazon API Gateway Guía del desarrollador
Control de acceso
"Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/"
}
]
}
}
A continuación, mostramos cómo utilizar Postman para llamar a la API o probarla con el autorizador de
Lambda TOKEN (que se ha descrito anteriormente) habilitado. El método puede usarse para llamar a una
API con un autorizador de Lambda REQUEST si se especifican los parámetros de ruta, encabezado o
cadena de consulta necesarios de forma explícita.
1. Abra Postman, elija el método GET y pegue el valor de Invoke URL (Invocar URL) de la API en el
campo URL contiguo.
318
Amazon API Gateway Guía del desarrollador
Control de acceso
La respuesta muestra que el autorizador de Lambda de API Gateway devuelve una respuesta 200
OK y autoriza correctamente a la llamada para que tenga acceso al punto de enlace HTTP (http://
httpbin.org/get) integrado en el método.
2. Sin salir de Postman, cambie el valor del encabezado de token de autorización de Lambda a deny.
Seleccione Send (enviar).
La respuesta muestra que el autorizador de Lambda de API Gateway devuelve una respuesta 403
Forbidden que no autoriza a la llamada para que tenga acceso al punto de enlace HTTP.
3. En Postman, cambie el valor del encabezado de token de autorización de Lambda a unauthorized y
elija Send (Enviar).
319
Amazon API Gateway Guía del desarrollador
Control de acceso
La respuesta muestra que API Gateway devuelve una respuesta 401 Unauthorized sin autorizar la
llamada para tener acceso al punto de enlace HTTP.
4. Ahora, cambie el valor del encabezado de token de autorización de Lambda a fail. Seleccione Send
(enviar).
La respuesta muestra que API Gateway devuelve una respuesta 500 Internal Server Error sin autorizar
la llamada para tener acceso al punto de enlace HTTP.
En esta sección, mostramos cómo configurar una función de autorización de Lambda entre cuentas
mediante la consola de Amazon API Gateway.
En estas instrucciones, se presupone que ya dispone de una API de API Gateway en una cuenta de AWS
y de una función de autorizador de Lambda en otra cuenta.
Inicie sesión en la consola de Amazon API Gateway de la primera cuenta (la que tiene la API) y haga lo
siguiente:
320
Amazon API Gateway Guía del desarrollador
Control de acceso
Note
Si elige permitir que la consola de API Gateway defina la política basada en recursos, se mostrará el
cuadro de diálogo Add Permission to Lambda Function (Agregar permiso a la función de Lambda).
Seleccione OK. Una vez creada la autorización de Lambda, puede probarla con los valores del token
de autorización adecuados para comprobar que funciona según lo previsto.
7. Para Lambda Event Payload (Carga de evento de Lambda), elija Token para un autorizador TOKEN o
bien Request para un autorizador REQUEST.
8. Dependiendo de la opción elegida en el paso anterior, realice una de las siguientes operaciones:
API Gateway utiliza las fuentes de identidad especificadas como la clave de caché del
autorizador de la solicitud. Cuando está habilitado el almacenamiento en caché, API Gateway
llama a la función de Lambda del autorizador solo después de verificar correctamente que
todas las fuentes de identidad especificadas estén presentes en tiempo de ejecución. Si falta
alguna fuente de identidad especificada, o bien es nula o está vacía, API Gateway devolverá
una respuesta 401 Unauthorized sin llamar a la función de Lambda del autorizador.
Cuando se definen varias fuentes de identidad, se utilizan todas ellas para obtener la clave
de caché del autorizador. Cambiar cualquiera de las partes de la clave de caché hace que el
autorizador descarte el documento de políticas almacenado en caché y genere otro nuevo.
ii. En Authorization Caching (Almacenamiento en caché de autorizaciones), deje seleccionada
la opción Enabled (Habilitado). Deje el valor predeterminado de TTL (300).
9. Elija Create (Crear) para crear el nuevo autorizador de Lambda para la API elegida.
321
Amazon API Gateway Guía del desarrollador
Control de acceso
10. Verá un mensaje con este texto: Add Permission to Lambda Function: You have selected a Lambda
function from another account (Agregar permiso para función de Lambda: ha seleccionado una función
de Lambda de otra cuenta). Please ensure that you have the appropriate Function Policy on this
function. (Asegúrese de que tiene la política de función apropiada en esta función.) Para ello, ejecute
el siguiente comando de la CLI de AWS desde la cuenta 123456789012:, seguido de una cadena de
comandos aws lambda add-permission.
11. Copie y pegue la cadena de comandos aws lambda add-permission en una ventana de la CLI de
AWS configurada para la segunda cuenta. Este concederá a la primera cuenta acceso a la función de
autorizador de Lambda de la segunda cuenta.
12. En el mensaje emergente del paso anterior, haga clic en OK (Aceptar).
Para utilizar un grupo de usuarios de Amazon Cognito con la API, primero debe crear un autorizador del
tipo COGNITO_USER_POOLS y configurar después un método de API para que utilice ese autorizador.
Una vez implementada la API, lo primero que debe hacer el cliente es registrar al usuario en el grupo de
usuarios, obtener un token de acceso o identidad para el usuario y llamar al método de API con uno de
los tokens, que normalmente están establecidos en el encabezado Authorization de la solicitud. La
llamada a la API solo tendrá éxito si se suministra el token solicitado y este es válido; de lo contrario, el
cliente no tendrá autorización para hacer la llamada, ya que carecerá de las credenciales que permitirían
autorizarlo.
El token de identidad se utiliza para autorizar las llamadas a la API en función de las solicitudes de
identidad del usuario conectado. El token de acceso se utiliza para autorizar las llamadas a la API en
función de los ámbitos personalizados de los recursos con protección de acceso especificados. Para
obtener más información, consulte Uso de tokens con grupos de usuarios y Servidor de recursos y ámbitos
personalizados.
Si desea crear y configurar un grupo de usuarios de Amazon Cognito para la API, debe realizar las
siguientes tareas:
• Utilice la API, la CLI, el SDK o la consola de Amazon Cognito para crear un grupo de usuarios; también
puede utilizar un grupo de usuarios de otra cuenta de AWS.
• Utilice la API, la CLI, el SDK o la consola de API Gateway para crear un autorizador de API Gateway con
el grupo de usuarios elegido.
• Utilice la API, la CLI, el SDK o la consola de API Gateway para habilitar el autorizador de los métodos de
API seleccionados.
Para llamar a los métodos de API con un grupo de usuarios habilitado, los clientes de la API tienen que
realizar las siguientes tareas:
• Utilice la API, la CLI o el SDK de Amazon Cognito para registrar el usuario en el grupo de usuarios
elegido y obtener un token de identidad o acceso.
• Utilice una plataforma específica del cliente para llamar a la API de API Gateway implementada y
proporcione el token apropiado en el encabezado Authorization.
Como desarrollador de la API, debe proporcionar a los desarrolladores del cliente el ID del grupo de
usuarios, el ID del cliente y, probablemente, los secretos del cliente asociados que se hayan definido con el
grupo de usuarios.
322
Amazon API Gateway Guía del desarrollador
Control de acceso
Note
Si desea permitir que un usuario inicie sesión con las credenciales de Amazon Cognito y pueda
obtener también unas credenciales temporales para utilizarlas con los permisos de un rol de
IAM, utilice las identidades federadas de Amazon Cognito. Para cada método HTTP de punto de
enlace de recurso de API, establezca el tipo de autorización, categoría Method Execution, en
AWS_IAM.
En esta sección, se explica cómo crear un grupo de usuarios, cómo integrar una API de API Gateway con
el grupo de usuarios y cómo invocar una API que está integrada con el grupo de usuarios.
Temas
• Obtener permisos para crear autorizadores del grupo de usuarios de Amazon Cognito para una API
REST (p. 323)
• Creación de un grupo de usuarios de Amazon Cognito para una API REST (p. 324)
• Integración de una API REST con un grupo de usuarios de Amazon Cognito (p. 325)
• Llamar a una API REST integrada con un grupo de usuarios de Amazon Cognito (p. 329)
• Configuración de un autorizador de Amazon Cognito entre cuentas para una API REST mediante la
consola de API Gateway (p. 330)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:POST"
],
"Resource": "arn:aws:apigateway:*::/restapis/*/authorizers",
"Condition": {
"ArnLike": {
"apigateway:CognitoUserPoolProviderArn": [
"arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-
east-1_aD06NQmjO",
"arn:aws:cognito-idp:us-east-1:234567890123:userpool/us-
east-1_xJ1MQtPEN"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"apigateway:PATCH"
],
"Resource": "arn:aws:apigateway:*::/restapis/*/authorizers/*",
"Condition": {
"ArnLike": {
"apigateway:CognitoUserPoolProviderArn": [
"arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-
east-1_aD06NQmjO",
323
Amazon API Gateway Guía del desarrollador
Control de acceso
"arn:aws:cognito-idp:us-east-1:234567890123:userpool/us-
east-1_xJ1MQtPEN"
]
}
}
}
]
}
Asegúrese de que la política está asociada al usuario de IAM, a un grupo de IAM al que pertenezca o a un
rol de IAM que tenga asignado.
Las cláusulas Condition que se utilizan aquí sirven para restringir los permisos Allowed a los grupos
de usuarios especificados. Cuando hay una cláusula Condition, se deniega el acceso a los grupos
de usuarios que no cumplen las condiciones. Cuando un permiso no tiene una cláusula Condition, se
permite el acceso a cualquier grupo de usuarios.
• Puede definir una expresión condicional ArnLike o ArnEquals para permitir la creación o la
actualización de autorizadores de COGNITO_USER_POOLS únicamente con los grupos de usuarios
especificados.
• Puede definir una expresión condicional ArnNotLike o ArnNotEquals para permitir la creación o la
actualización de autorizadores de COGNITO_USER_POOLS con cualquier grupo de usuarios que no esté
especificado en la expresión.
• Puede omitir la cláusula Condition para permitir la creación o la actualización de autorizadores de
COGNITO_USER_POOLS con cualquier grupo de usuarios de cualquier cuenta de AWS y de cualquier
región.
Para obtener más información sobre las expresiones condicionales del nombre de recurso de Amazon
(ARN), consulte Operadores de condición de nombre de recurso de Amazon (ARN). Tal y como se muestra
en el ejemplo, apigateway:CognitoUserPoolProviderArn es una lista de los ARN de los grupos de
usuarios de COGNITO_USER_POOLS que pueden o no utilizarse con un autorizador de API Gateway de tipo
COGNITO_USER_POOLS.
Si crea grupos para el grupo de usuarios, asegúrese de que los nombres de grupo utilicen solo
caracteres alfanuméricos.
Apunte el ID del grupo de usuarios, el ID del cliente y la clave secreta del cliente. El cliente debe
proporcionarlos a Amazon Cognito para que el usuario pueda registrarse en el grupo de usuarios, para
iniciar sesión en el grupo de usuarios y para obtener un token de identidad o acceso, que debe incluirse
en las solicitudes para llamar a los métodos de la API configurados con el grupo de usuarios. Además, se
debe especificar el nombre del grupo de usuarios al configurar el grupo de usuarios como autorizador de
API Gateway, tal y como se describe a continuación.
324
Amazon API Gateway Guía del desarrollador
Control de acceso
Si utiliza tokens de acceso para autorizar las llamadas a los métodos de la API, asegúrese de configurar
la integración de aplicaciones con el grupo de usuarios para establecer los ámbitos que desee en un
determinado servidor de recursos. Para obtener más información sobre el uso de tokens con grupos
de usuarios de Amazon Cognito, consulte Uso de tokens con grupos de usuarios. Para obtener más
información acerca de los servidores de recursos, consulte Definir servidores de recursos para su grupo de
usuarios.
Anote los identificadores del servidor de recursos configurados y los nombres de ámbito personalizados.
Los necesita para generar los nombres completos de los ámbitos de acceso de OAuth Scopes (Ámbitos de
OAuth) que el autorizador de COGNITO_USER_POOLS utiliza.
325
Amazon API Gateway Guía del desarrollador
Control de acceso
a. Deje la opción OAuth Scopes (Ámbitos de OAuth) sin especificar (como NONE).
b. Si fuera necesario, seleccione Integration Request (Solicitud de integración) para
agregar las expresiones $context.authorizer.claims['property-name'] o
$context.authorizer.claims.property-name a una plantilla de asignación de cuerpo y
pasar la propiedad especificada de las reclamaciones de identidad desde el grupo de usuarios
al backend. En el caso de los nombres de propiedades sencillos, como sub o custom-sub,
las dos notaciones son idénticas. En el caso de los nombres de propiedades complejos, como
custom:role, no se puede usar la notación de puntos. Por ejemplo, las siguientes expresiones
de asignación pasan los campos estándar sub y email de la reclamación al backend:
{
"context" : {
"sub" : "$context.authorizer.claims.sub",
"email" : "$context.authorizer.claims.email"
}
}
326
Amazon API Gateway Guía del desarrollador
Control de acceso
{
"context" : {
"role" : "$context.authorizer.claims.role"
}
}
{
"context" : {
"role" : "$context.authorizer.claims['custom:role']"
}
}
a. Seleccione el icono con forma de lápiz situado junto a OAuth Scopes (Ámbitos de OAuth).
b. Escriba uno o varios nombres completos de un ámbito que se haya configurado cuando creó
el grupo de usuarios de Amazon Cognito. Por ejemplo, siguiendo el ejemplo de Creación de
un grupo de usuarios de Amazon Cognito para una API REST (p. 324), uno de los ámbitos
es com.hamuta.movies/drama.view. Utilice solamente un espacio para separar diferentes
ámbitos.
Con el autorizador COGNITO_USER_POOLS, si la opción OAuth Scopes no está especificada, API Gateway
trata el token proporcionado como un token de identidad y comprueba si la identidad solicitada se
corresponde con alguna del grupo de usuarios. De lo contrario, API Gateway trata el token suministrado
como un token de acceso y comprueba si los ámbitos de acceso solicitados en el token tienen
coincidencias con los ámbitos de autorización declarados en el método.
En lugar de utilizar la consola de API Gateway, también puede habilitar un grupo de usuarios de Amazon
Cognito en un método especificando un archivo de definición de OpenAPI e importando la definición de la
API en API Gateway.
OpenAPI 3.0
"securitySchemes": {
"MyUserPool": {
"type": "apiKey",
"name": "Authorization",
"in": "header",
"x-amazon-apigateway-authtype": "cognito_user_pools",
"x-amazon-apigateway-authorizer": {
327
Amazon API Gateway Guía del desarrollador
Control de acceso
"type": "cognito_user_pools",
"providerARNs": [
"arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
]
}
}
OpenAPI 2.0
"securityDefinitions": {
"MyUserPool": {
"type": "apiKey",
"name": "Authorization",
"in": "header",
"x-amazon-apigateway-authtype": "cognito_user_pools",
"x-amazon-apigateway-authorizer": {
"type": "cognito_user_pools",
"providerARNs": [
"arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
]
}
}
"paths": {
"/": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"text/html"
],
"responses": {
"200": {
"description": "200 response",
"headers": {
"Content-Type": {
"type": "string"
}
}
}
},
"security": [
{
"MyUserPool": []
}
],
"x-amazon-apigateway-integration": {
"type": "mock",
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type": "'text/html'"
},
}
},
"requestTemplates": {
"application/json": "{\"statusCode\": 200}"
328
Amazon API Gateway Guía del desarrollador
Control de acceso
},
"passthroughBehavior": "when_no_match"
}
},
...
}
4. Si desea utilizar el token de acceso para la autorización del método, cambie la definición de seguridad
anterior a { "MyUserPool": [resource-server/scope, ...] }:
"paths": {
"/": {
"get": {
"consumes": [
"application/json"
],
"produces": [
"text/html"
],
"responses": {
"200": {
"description": "200 response",
"headers": {
"Content-Type": {
"type": "string"
}
}
}
},
"security": [
{
"MyUserPool": ["com.hamuta.movies/drama.view", "http://my.resource.com/
file.read"]
}
],
"x-amazon-apigateway-integration": {
"type": "mock",
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-Type": "'text/html'"
},
}
},
"requestTemplates": {
"application/json": "{\"statusCode\": 200}"
},
"passthroughBehavior": "when_no_match"
}
},
...
}
Llamar a una API REST integrada con un grupo de usuarios de Amazon Cognito
Para llamar a un método con un autorizador de grupo de usuarios configurado, el cliente debe hacer lo
siguiente:
329
Amazon API Gateway Guía del desarrollador
Control de acceso
Puede utilizar uno de los SDK de AWS para realizar estas tareas. Por ejemplo:
• Para utilizar el SDK de Android, consulte el tema sobre cómo configurar el AWS Mobile SDK para
Android para que funcione con grupos de usuarios.
• Para utilizar el SDK de iOS, consulte el tema sobre cómo configurar el AWS Mobile SDK para iOS para
que funcione con grupos de usuarios.
• Para utilizar JavaScript, consulte el tema sobre cómo configurar el AWS SDK para JavaScript en el
navegador para que funciones con grupos de usuarios.
El siguiente procedimiento describe los pasos necesarios para realizar estas tareas. Para obtener más
información, consulte las entradas de blog en Uso del SDK de Android con grupos de usuarios de Amazon
Cognito y Uso de grupos de usuarios de Amazon Cognito para iOS.
Para llamar a una API que esté integrada con un grupo de usuarios
Para ver ejemplos de código, consulte un ejemplo de Java para Android y un ejemplo de Objective-C para
iOS.
En esta sección, mostramos cómo configurar un grupo de usuarios de Amazon Cognito entre cuentas
mediante la consola de Amazon API Gateway.
En estas instrucciones, se presupone que ya dispone de una API de API Gateway en una cuenta de AWS
y de un grupo de usuarios de Amazon Cognito en otra cuenta.
Inicie sesión en la consola de Amazon API Gateway de la primera cuenta (la que tiene la API) y haga lo
siguiente:
330
Amazon API Gateway Guía del desarrollador
Integraciones
Al igual que con el método de API, la integración de la API tiene una solicitud de integración y una
respuesta de integración. La solicitud de integración incluye la solicitud HTTP que recibe el backend.
Podría ser distinta o no de la solicitud de método enviada por el cliente. La respuesta de integración es la
respuesta HTTP que encapsula la salida que devuelve el backend.
Configurar una solicitud de integración implica lo siguiente: configurar cómo transferir las solicitudes de
método enviadas por el cliente al backend; configurar cómo transformar los datos de la solicitud, si fuese
necesario, en los datos de la solicitud de integración; especificar qué función de Lambda se debe llamar,
especificar el servidor HTTP al que se debe reenviar la solicitud entrante o especificar la acción del servicio
de AWS que se debe invocar.
Configurar una respuesta de integración (aplicable únicamente a integraciones que no sean de proxy)
implica lo siguiente: configurar cómo transferir el resultado devuelto por el backend a una respuesta de
método de un determinado código de estado; configurar cómo transformar los parámetros de respuesta de
integración especificados en los parámetros de respuesta de método preconfigurados y configurar cómo
asignar el cuerpo de la respuesta de integración al cuerpo de la respuesta de método con arreglo a las
plantillas de mapeo de cuerpo especificadas.
Para configurar una solicitud de integración, debe crear un recurso Integration y utilizarlo para
configurar la URL del punto de enlace de integración. A continuación, defina los permisos de IAM para
acceder al backend y especifique los mapeos para transformar los datos de la solicitud entrante antes de
transmitirlos al backend. Para configurar una respuesta de integración para una integración que no sea de
proxy, debe crear un recurso IntegrationResponse y utilizarlo para establecer su respuesta de método
de destino. A continuación, configure cómo asignar la salida del backend a la respuesta de método.
Temas
331
Amazon API Gateway Guía del desarrollador
Integraciones
1. Elija un tipo de integración que determine cómo se transfieren los datos de la solicitud de método al
backend.
2. Para las integraciones no simuladas, especifique un método HTTP y la URI del punto de enlace de
integración específico, excepto para la integración MOCK.
3. Para integraciones con funciones de Lambda y otras acciones del servicio de AWS, establezca el rol de
IAM con los permisos necesarios para que API Gateway llame al backend en su nombre.
4. Para las integraciones que no sean de proxy, establezca el mapeo de parámetros necesario para
asignar los parámetros de la solicitud de método predefinidos a los parámetros de la solicitud de
integración adecuados.
5. Para las integraciones que no sean de proxy, establezca el mapeo de cuerpo necesario para asignar el
cuerpo de la solicitud de método entrante de un determinado tipo de contenido con arreglo a la plantilla
de mapeo especificada.
6. Para integraciones que no sean de proxy, especifique la condición bajo la cual los datos de la solicitud
de método entrante se transfieren al backend tal y como están.
7. También puede especificar cómo administrar la conversión de tipo para una carga binaria.
8. También puede indicar un nombre del espacio de nombres de la caché y los parámetros de caché clave
para habilitar el almacenamiento en caché de la API.
Estas tareas conllevan la creación de un recurso Integration de API Gateway y la definición de los valores
adecuados para las propiedades. Puede hacerlo con la consola de API Gateway, los comandos de la CLI
de AWS, un SDK de AWS o la API REST de API Gateway.
Temas
• Tareas básicas de una solicitud de integración de la API (p. 332)
• Elegir un tipo de integración de API de API Gateway (p. 334)
• Configuración de una integración de proxy con un recurso de proxy (p. 336)
• Configuración de una solicitud de integración de la API mediante la consola de API Gateway (p. 337)
Por ejemplo, cuando una función de Lambda devuelve un archivo que se recupera de Amazon S3,
puede exponer esta operación de forma intuitiva como una solicitud de método GET al cliente, aunque la
332
Amazon API Gateway Guía del desarrollador
Integraciones
correspondiente solicitud de integración requiere que se utilice una solicitud POST para invocar la función
de Lambda. En el caso de los puntos de enlace HTTP, es probable que tanto la solicitud del método como
la correspondiente solicitud de integración utilicen el mismo verbo HTTP. Sin embargo, no es necesario.
Puede integrar la siguiente solicitud de método:
GET /{var}?query=value
Host: api.domain.net
POST /
Host: service.domain.com
Content-Type: application/json
Content-Length: ...
{
path: "{var}'s value",
type: "value"
}
Como desarrollador de la API, puede utilizar el verbo HTTP y la URI para la solicitud de método que mejor
se adapte a sus necesidades. Sin embargo, debe cumplir los requisitos del punto de enlace de integración.
Cuando los datos de la solicitud de método son distintos de los datos de la solicitud de integración, puede
solucionar esta diferencia asignando los datos de la solicitud de método a los datos de la solicitud de
integración.
En los ejemplos anteriores, el mapeo traduce los valores de la variable de ruta ({var}) y el parámetro de
consulta (query) de la solicitud de método GET en los valores de las propiedades de carga de la solicitud
de integración para path y type. Podrían asignarse otros datos de la solicitud, como los encabezados y el
cuerpo. Esto se describe en Configuración de mapeo de datos de solicitud y respuesta mediante la consola
de API Gateway (p. 401).
Al configurar la solicitud HTTP o de integración de proxy HTTP, asigne la URL del punto de enlace HTTP
del backend como el valor de la URI de la solicitud de integración. Por ejemplo, en la API de PetStore,
la solicitud de método para obtener una página de mascotas tiene la siguiente URI de la solicitud de
integración:
http://petstore-demo-endpoint.execute-api.com/petstore/pets
arn:aws:apigateway:api-region:lambda:path//2015-03-31/functions/arn:aws:lambda:lambda-
region:account-id:function:lambda-function-name/invocations
Cuando se configura la solicitud de integración con otra acción del servicio de AWS, la URI de la solicitud
de integración también es un ARN, de modo similar a la integración con la acción de Lambda Invoke.
333
Amazon API Gateway Guía del desarrollador
Integraciones
Por ejemplo, en el caso de la integración con la acción GetBucket de Amazon S3, la URI de la solicitud de
integración es un ARN con el siguiente formato:
arn:aws:apigateway:api-region:s3:path/{bucket}
La URI de la solicitud de integración utiliza la convención de ruta para especificar la acción, donde
{bucket} es el marcador de posición de un nombre de bucket. También se puede hacer referencia a una
acción del servicio de AWS por su nombre. Si se utiliza el nombre de la acción, la URI de la solicitud de
integración para la acción GetBucket de Amazon S3 se convierte en lo siguiente:
arn:aws:apigateway:api-region:s3:action/GetBucket
Con la URI de la solicitud de integración basada en la acción, el nombre del bucket ({bucket}) se debe
especificar en el cuerpo de la solicitud de integración ({ Bucket: "{bucket}" }), siguiendo el formato
de entrada de la acción GetBucket.
Para las integraciones de AWS, también debe configurar las credenciales para permitir que API Gateway
llame a las acciones integradas. Puede crear uno nuevo o bien elegir un rol de IAM existente para que
API Gateway llame a la acción y, a continuación, especificar el rol mediante su ARN. A continuación se
muestra un ejemplo de este ARN:
arn:aws:iam::account-id:role/iam-role-name
Este rol de IAM debe contener una política para permitir que se ejecute la acción. También se debe haber
declarado API Gateway (en la relación de confianza del rol) como una entidad de confianza para asumir
el rol. Estos permisos se pueden conceder en la propia acción. Se conocen como permisos basados en
recursos. Para la integración de Lambda, puede llamar a la acción addPermission de Lambda para definir
los permisos basados en recursos y, a continuación, establecer credentials en null en la solicitud de
integración de API Gateway.
El tipo de integración de la API se selecciona con arreglo a los tipos de punto de enlace de integración
con los que trabaje y al modo en que desea transferir los datos hacia y desde el punto de enlace de
integración. Para una función de Lambda, puede tener la integración de proxy de Lambda o la integración
personalizada de Lambda. Para un punto de enlace HTTP, puede elegir entre la integración de proxy
HTTP o una integración HTTP personalizada. Para una acción del servicio de AWS, dispone de la
integración de AWS solo para el tipo que no sea proxy. API Gateway también admite la integración
simulada, donde API Gateway actúa como punto de enlace de integración para responder a una solicitud
de método.
334
Amazon API Gateway Guía del desarrollador
Integraciones
integración de proxy HTTP y la integración HTTP, el valor es HTTP_PROXY y HTTP, respectivamente. Para
la integración simulada, el valor type es MOCK.
La integración de proxy de Lambda admite una configuración de integración simplificada con una única
función de Lambda. La configuración es sencilla y puede evolucionar con el backend sin tener que eliminar
la configuración existente. Por estas razones, es muy recomendable para la integración con una función de
Lambda.
Del mismo modo, la integración de proxy HTTP tiene una configuración de integración simplificada y
puede evolucionar con el backend sin tener que eliminar la configuración existente. La integración HTTP
personalizada resulta más compleja de configurar, pero permite la reutilización de las plantillas de mapeo
configuradas para otros puntos de enlace de integración.
• AWS: este tipo de integración permite a una API exponer acciones del servicio de AWS. En la integración
de AWS, debe configurar tanto la solicitud de integración como la respuesta de integración y también
configurar el mapeo necesario de los datos entre la solicitud de método y la solicitud de integración, y
entre la respuesta de integración y la respuesta de método.
• AWS_PROXY: este tipo de integración permite que se integre un método de la API con la acción de
invocación de la función de Lambda a través de una configuración de integración flexible, versátil y
simplificada. Esta integración se basa en las interacciones directas entre el cliente y la función de
Lambda integrada.
Con este tipo de integración, que también se conoce como integración de proxy de Lambda, no
tiene que establecer la solicitud de integración ni la respuesta de integración. API Gateway transmite
la solicitud entrante del cliente, como entrada, a la función de Lambda del backend. La función de
Lambda integrada toma la entrada de este formato (p. 348) y analiza la entrada de todos los orígenes
disponibles, incluidos los encabezados de solicitudes, las variables de ruta de la URL, los parámetros de
cadena de consulta y el cuerpo aplicable. Esta función devuelve un resultado con el siguiente formato de
salida (p. 351).
Este es el tipo de integración recomendable para llamar a la función de Lambda a través de API
Gateway y no es aplicable a ninguna otra acción del servicio de AWS, incluidas las acciones Lambda
que no sean la acción que invoca las funciones.
• HTTP: este tipo de integración permite que una API exponga puntos de enlace de HTTP en el backend.
Con la integración HTTP, que también se conoce como integración HTTP personalizada, debe configurar
tanto la solicitud de integración como la respuesta de integración. Debe establecer la asignación
necesaria de los datos entre la solicitud de método y la solicitud de integración, y entre la respuesta de
integración y la respuesta de método.
• HTTP_PROXY: La integración de proxy HTTP permite que un cliente tenga acceso a puntos de enlace
HTTP de backend con una configuración de la integración simplificada en un único método de API.
No tiene que establecer la solicitud de integración ni la respuesta de integración. API Gateway pasa la
solicitud entrante del cliente al punto de enlace HTTP y pasa la respuesta saliente del punto de enlace
HTTP al cliente.
• MOCK: este tipo de integración permite que API Gateway devuelva una respuesta sin enviar la solicitud
al backend. Esto es útil en las pruebas de la API, ya que se puede utilizar para probar la configuración
de la integración sin incurrir en cargos por utilizar el backend y para permitir el desarrollo colaborativo de
una API.
335
Amazon API Gateway Guía del desarrollador
Integraciones
de integraciones MOCK. También se utiliza para devolver encabezados relacionados con CORS y
garantizar que el método de API permita el acceso a CORS. De hecho, la consola de API Gateway
integra el método OPTIONS para admitir CORS con una integración simulada. Las respuestas de
gateway (p. 438) son otros ejemplos de integraciones simuladas.
Note
Las variables de ruta expansiva, los métodos ANY y los tipos de integración de proxy son
características independientes, aunque se utilizan normalmente juntas. Puede configurar un
método HTTP específico en un recurso expansivo o aplicar tipos de integración distintos de proxy
en un recurso de proxy.
API Gateway establece determinadas restricciones y limitaciones al manipular métodos con una
integración de proxy de Lambda o una integración de proxy HTTP. Para obtener más información, consulte
the section called “Notas importantes” (p. 847).
Note
Cuando se utiliza la integración de proxy con acceso directo, API Gateway devuelve el
encabezado predeterminado Content-Type:application/json si no se especifica el tipo de
contenido de una carga.
Un recurso de proxy es más eficaz cuando se integra con un backend que usa la integración de proxy
HTTP o la integración de proxy de Lambda.
La integración de proxy HTTP, designada por HTTP_PROXY en la API REST de API Gateway, es para
la integración de una solicitud de método con un punto de enlace HTTP del backend. Con este tipo de
integración, API Gateway simplemente transmite toda la solicitud y la respuesta entre el frontend y el
backend, aunque esto está sujeto a determinadas restricciones y limitaciones (p. 847).
Note
La integración de proxy HTTP admite encabezados y cadenas de consulta con varios valores.
Cuando aplica la integración de proxy HTTP a un recurso de proxy, puede configurar la API para que
exponga una parte o la totalidad de la jerarquía del punto de enlace del backend HTTP con una sola
integración configurada. Supongamos, por ejemplo, que el backend del sitio web está organizado en varias
ramas de nodos de árbol desde el nodo raíz (/site) como: /site/a0/a1/.../aN, /site/b0/b1/.../
bM, etc. Si integra el método ANY en un recurso de proxy de /api/{proxy+} con los puntos de enlace
del backend con rutas URL de /site/{proxy}, una sola solicitud de integración puede admitir todas las
operaciones HTTP (GET, POST, etc.) en cualquiera de [a0, a1, ..., aN, b0, b1, ...bM, ...]. Si
aplica una integración de proxy a un método HTTP específico (por ejemplo, GET), en su lugar, la solicitud
de integración resultante funcionará con las operaciones especificadas (es decir, GET) en cualquiera de los
nodos del backend.
336
Amazon API Gateway Guía del desarrollador
Integraciones
La integración de proxy de Lambda, designada por AWS_PROXY en la API REST de API Gateway, es para
la integración de una solicitud de método con una función de Lambda en el backend. Con este tipo de
integración, API Gateway aplica una plantilla de mapeo predeterminada para enviar toda la solicitud a la
función de Lambda y transforma la salida de la función de Lambda en respuestas HTTP.
Del mismo modo, puede aplicar la integración de proxy de Lambda a un recurso proxy de /api/{proxy
+} para configurar una sola integración, si desea que la función de Lambda del backend reaccione
individualmente a los cambios que se produzcan en cualquiera de los recursos de la API bajo /api.
El siguiente procedimiento describe cómo utilizar la consola de API Gateway para especificar la
configuración de un método.
• Elija Lambda Function (Función de Lambda) si la API se va a integrarse con una función de
Lambda. En el nivel de API, este es un tipo de integración AWS.
• Elija HTTP si la API se va a integrar con un punto de enlace HTTP. En el nivel de API, este es el tipo
de integración HTTP.
• Elija AWS Service (Servicio de AWS) si la API se va a integrar directamente con un servicio de
AWS. En el nivel de API, este es el tipo de integración AWS. La opción Lambda Function (Función de
Lambda) anterior es un caso especial de la integración de AWS para invocar una función de Lambda
y solo está disponible en la consola de API Gateway. Para configurar una API de API Gateway
para crear una nueva función de Lambda en AWS Lambda, establecer un permiso de recurso en
la función de Lambda o realizar cualquier otra acción de servicio de Lambda, debe elegir aquí la
opción AWS Service (Servicio de AWS) .
• Elija Mock (Simulación) si desea que API Gateway actúe como backend y devuelva respuestas
estáticas. En el nivel de API, este es el tipo de integración MOCK. Normalmente, puede usar la
integración MOCK si la API aún no es definitiva, pero desea generar respuestas de API para permitir
que los equipos dependientes realicen pruebas. En el método OPTION, API Gateway establece la
integración MOCK como predeterminada para devolver encabezados que habilitan CORS para el
recurso de la API que se aplicó. Si elige esta opción, omita el resto de las instrucciones de este
tema y consulte Configurar integraciones simuladas en API Gateway (p. 373).
3. Si ha elegido Lambda Function (Función de Lambda), proceda de la forma siguiente:
337
Amazon API Gateway Guía del desarrollador
Integraciones
a. En HTTP method (Método HTTP), elija el tipo de método HTTP que más se parezca al método del
backend HTTP.
b. En Endpoint URL (URL del punto de enlace), escriba la dirección URL del backend HTTP que
desea que utilice este método.
c. Seleccione Save.
5. Si ha elegido Mock (Simulación), proceda de la forma siguiente:
a. En AWS Region (Región de AWS), elija la región de AWS que desea que utilice este método para
llamar a la acción.
b. En AWS Service (Servicio de AWS), elija el servicio de AWS al que desea que llame este método.
c. En AWS Subdomain (Subdominio de AWS), escriba el subdominio que utilice el servicio de AWS.
Normalmente, puede dejarlo en blanco. Algunos servicios de AWS admiten subdominios como
parte de los hosts. En la documentación del servicio encontrará la disponibilidad y los detalles, si
están disponibles.
d. En HTTP method (Método HTTP), seleccione el tipo de método HTTP correspondiente a
la acción. Para el tipo de método HTTP, consulte la documentación de referencia de la API
correspondiente al servicio de AWS que eligió en AWS Service (Servicio de AWS).
e. En Action (Acción), escriba la acción que desea utilizar. Para ver una lista de las acciones
disponibles, consulte la documentación de referencia de la API correspondiente al servicio de
AWS que eligió en AWS Service (Servicio de AWS).
f. En Execution Role (Rol de ejecución), escriba el ARN del rol de IAM que usará el método para
llamar a la acción.
Para crear el rol de IAM, puede adaptar las instrucciones de "Para crear el rol de invocación de
Lambda y sus políticas" y "Para crear el rol de ejecución de Lambda y sus políticas" de la sección
Crear funciones de Lambda (p. 34). Especifique una política de acceso con el siguiente formato y
con el número de acciones e instrucciones de recursos que desee:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"action-statement"
],
"Resource": [
"resource-statement"
]
},
...
]
}
Para ver la sintaxis de las acciones e instrucciones de recursos, consulte la documentación del
servicio de AWS que eligió en AWS Service (Servicio de AWS).
Para la relación de confianza del rol de IAM, especifique lo siguiente, que permite a API Gateway
realizar una acción en nombre de su cuenta de AWS:
{
"Version": "2012-10-17",
"Statement": [
338
Amazon API Gateway Guía del desarrollador
Integraciones
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
g. Si la acción que especificó para Action (Acción) proporciona una ruta de recurso personalizada
que desea que utilice este método, en Path Override (Invalidación de ruta), escriba esta ruta.
Para la ruta de recurso personalizada, consulte la documentación de referencia de la API
correspondiente al servicio de AWS que eligió en AWS Service (Servicio de AWS).
h. Elija Save (Guardar).
Para una integración de proxy, API Gateway pasa automáticamente la salida del backend al cliente como
una respuesta HTTP. No debe configurar la respuesta de integración ni la respuesta del método.
Para configurar una respuesta de integración, debe llevar a cabo las siguientes tareas obligatorias y
opcionales:
1. Especifique el código de estado HTTP de la respuesta del método a la que se asignan los datos de la
respuesta de integración. Esto es necesario.
2. Defina una expresión regular para seleccionar que la salida del backend esté representada por esta
respuesta de integración. Si lo deja vacío, la respuesta será la respuesta predeterminada que se utiliza
para detectar las respuestas que no se hayan configurado aún.
3. Si es necesario, declare mapeos compuestos de pares de clave-valor para asignar los parámetros de la
respuesta de integración especificados a los parámetros de una respuesta de método determinada.
4. Si es necesario, añada plantillas de mapeo de cuerpo para transformar las cargas de una respuesta de
integración determinada en las cargas de la respuesta de método especificada.
5. Si es necesario, especifique cómo administrar la conversión de tipo para una carga binaria.
Una respuesta de integración es una respuesta HTTP que encapsula la respuesta del backend. Para
un punto de enlace HTTP, la respuesta del backend es una respuesta HTTP. El código de estado de
la respuesta de integración puede tomar el código de estado que devuelve el backend, y el cuerpo de
la respuesta de integración es la carga que devuelve el backend. Para un punto de enlace Lambda, la
respuesta del backend es la salida que devuelve la función de Lambda. Con la integración de Lambda,
la salida de la función de Lambda se devuelve como una respuesta 200 OK. La carga puede contener
el resultado como datos JSON, incluida una cadena JSON o un objeto JSON, o un mensaje de error
como un objeto JSON. Puede asignar una expresión regular a la propiedad selectionPattern para asignar
una respuesta de error a la respuesta de error HTTP adecuada. Para obtener más información acerca
de la respuesta de error de una función de Lambda, consulte Gestionar los errores de Lambda en API
Gateway (p. 357). Con la integración de proxy de Lambda, la función de Lambda debe devolver una
salida con el siguiente formato:
{
statusCode: "...", // a valid HTTP status code
headers: {
339
Amazon API Gateway Guía del desarrollador
Integraciones
Para devolver el resultado al cliente, configure la respuesta de integración para pasar la respuesta del
punto de enlace como está a la correspondiente respuesta de método. También puede asignar los datos
de la respuesta del punto de enlace a los datos de la respuesta de método. Entre los datos de respuesta
que se pueden asignar se incluyen el código de estado de la respuesta, los parámetros de encabezado de
la respuesta y el cuerpo de la respuesta. Si no se define ninguna respuesta de método para el código de
estado devuelto, API Gateway devuelve un error 500. Para obtener más información, consulte Trabajo con
modelos y plantillas de asignación (p. 395).
En la integración de Lambda que no sea de proxy, además de los pasos de configuración de integración
de proxy, también debe especificar cómo se asignan los datos entrantes a la solicitud de integración y
cómo se asignan los datos resultantes de respuesta de la integración a la respuesta de método.
Temas
• Configuración de las integraciones de proxy de Lambda en API Gateway (p. 340)
• Configuración de integraciones de Lambda personalizadas en API Gateway (p. 353)
• Configurar la invocación asíncrona de la función de Lambda de backend (p. 356)
• Gestionar los errores de Lambda en API Gateway (p. 357)
340
Amazon API Gateway Guía del desarrollador
Integraciones
En la integración de proxy de Lambda, cuando un cliente envía una solicitud de API, API Gateway pasa
a la función de Lambda integrada la solicitud sin procesar tal y como está, salvo que no se conserve el
orden de los parámetros de la solicitud. Estos datos de la solicitud (p. 348) incluyen los encabezados
de solicitud, los parámetros de cadena de consulta, las variables de ruta de la URL, la carga y los
datos de configuración de la API. Los datos de configuración pueden incluir el nombre de la etapa de
implementación actual, las variables de la etapa, la identidad del usuario o el contexto de autorización (si
lo hubiera). La función de Lambda del backend analiza los datos de la solicitud entrante para determinar
la respuesta que devuelve. Para que API Gateway transmita la salida de Lambda como la respuesta de la
API al cliente, la función de Lambda debe devolver el resultado en este formato (p. 351).
Dado que API Gateway no interviene mucho entre el cliente y la función de Lambda del backend para
la integración de proxy de Lambda, el cliente y la función de Lambda integrada pueden adaptarse a los
cambios de cada uno sin interrumpir la configuración de integración existente de la API. Para habilitar esto,
el cliente debe seguir los protocolos de aplicación promulgados por la función de Lambda del backend.
Puede configurar una integración de proxy de Lambda para cualquier método de API. Sin embargo,
una integración de proxy de Lambda es más potente cuando se configura para un método de API que
implica un recurso de proxy genérico. El recurso de proxy genérico se puede indicar mediante una variable
especial de ruta basada en plantilla de {proxy+}, el marcador de posición del método catch-all ANY o
ambos. El cliente puede transmitir la entrada a la función de Lambda del backend en la solicitud entrante
según lo soliciten los parámetros o la carga aplicable. Los parámetros de solicitud incluyen encabezados,
variables de ruta de la URL, parámetros de cadenas de consulta y la carga aplicable. La función de
Lambda integrada verifica todas las fuentes de entrada antes de procesar la solicitud y de responder al
cliente con mensajes de error importantes si falta alguna de las entradas requeridas.
Al llamar a un método de API integrado con el método HTTP genérico de ANY y el recurso genérico de
{proxy+}, el cliente envía una solicitud con un método HTTP específico en lugar de ANY. El cliente
también especifica una ruta de URL específica en lugar de {proxy+} e incluye cualquier encabezado,
parámetro de cadena de consulta o una carga aplicable.
En la siguiente lista se resumen los comportamientos de tiempo de ejecución de los diferentes métodos de
API con la integración de proxy de Lambda:
• ANY /{proxy+}: el cliente debe elegir un método HTTP específico, debe establecer una jerarquía de
ruta de recursos específica y puede establecer cualquier encabezado, parámetro de cadena de consulta
y carga aplicable para transmitir los datos como entrada a la función de Lambda integrada.
• ANY /res: el cliente debe elegir un método HTTP específico y puede establecer cualquier encabezado,
parámetro de cadena de consulta y carga aplicable para transmitir los datos como entrada a la función
de Lambda integrada.
• GET|POST|PUT|... /{proxy+}: el cliente puede establecer una jerarquía de ruta de recursos
específica, cualquier encabezado, parámetro de cadena de consulta y carga aplicable para transmitir los
datos como entrada a la función de Lambda integrada.
• GET|POST|PUT|... /res/{path}/...: el cliente debe elegir un segmento de ruta específico (para
la variable {path}) y puede establecer cualquier encabezado de solicitud, parámetro de cadena de
consulta y carga aplicable para transmitir los datos de entrada a la función de Lambda integrada.
• GET|POST|PUT|... /res: el cliente puede elegir cualquier encabezado de solicitud, parámetro
de cadena de consulta y carga aplicable para transmitir los datos de entrada a la función de Lambda
integrada.
Tanto el recurso de proxy de {proxy+} como el recurso personalizado de {custom} se expresan como
variables de ruta basada en plantilla. Sin embargo, {proxy+} puede hacer referencia a cualquier recurso
en una jerarquía de ruta, mientras que {custom} se refiere únicamente a un segmento de ruta específico.
Por ejemplo, una tienda de comestibles podría organizar un inventario de productos en línea por nombres
de departamento, categorías de productos y tipos de productos. El sitio web de la tienda de comestibles
puede entonces representar los productos disponibles con las siguientes variables de ruta basada en
plantilla para los recursos personalizados: /{department}/{produce-category}/{product-type}.
Por ejemplo, las manzanas están representadas con /produce/fruit/apple y las zanahorias con
341
Amazon API Gateway Guía del desarrollador
Integraciones
• /produce
• /produce/fruit
• /produce/vegetables/carrot
Para que los clientes puedan buscar cualquier producto disponible, su categoría de producto y el
departamento asociado en la tienda, puede exponer un único método de GET /{proxy+} con permisos
de solo lectura. Del mismo modo, para permitir que un supervisor actualice el inventario del departamento
produce, puede configurar otro método único de PUT /produce/{proxy+} con permisos de lectura
y escritura. Para permitir que un cajero actualice el total de unidades de una verdura, puede configurar
un método POST /produce/vegetables/{proxy+} con permisos de lectura y escritura. Para que
el gerente de una tienda pueda realizar cualquier acción posible en cualquier producto disponible, el
desarrollador de la tienda en línea puede exponer el método ANY /{proxy+} con permisos de lectura
y escritura. En cualquier caso, en el tiempo de ejecución, el cliente o el empleado debe seleccionar un
producto específico de un tipo determinado en un departamento elegido o en un departamento específico.
Para obtener más información acerca de la configuración de las integraciones del proxy de API Gateway,
consulte Configuración de una integración de proxy con un recurso de proxy (p. 336).
La integración del proxy requiere que el cliente tenga un conocimiento más detallado de los requisitos del
backend. Por lo tanto, para garantizar un óptimo rendimiento de la aplicación y experiencia del usuario,
el desarrollador del backend debe comunicar con claridad al desarrollador del cliente los requisitos del
backend y proporcionar un mecanismo de comentarios de errores sólido cuando los requisitos no se
cumplan.
El siguiente archivo de definición de API de OpenAPI muestra un ejemplo de una API con un recurso de
proxy que se integra con la función de Lambda denominada SimpleLambda4ProxyResource.
OpenAPI 3.0
{
"openapi": "3.0.0",
"info": {
"version": "2016-09-12T17:50:37Z",
"title": "ProxyIntegrationWithLambda"
},
342
Amazon API Gateway Guía del desarrollador
Integraciones
"paths": {
"/{proxy+}": {
"x-amazon-apigateway-any-method": {
"parameters": [
{
"name": "proxy",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-east-1:123456789012:function:SimpleLambda4ProxyResource/invocations",
"passthroughBehavior": "when_no_match",
"httpMethod": "POST",
"cacheNamespace": "roq9wj",
"cacheKeyParameters": [
"method.request.path.proxy"
],
"type": "aws_proxy"
}
}
}
},
"servers": [
{
"url": "https://gy415nuibc.execute-api.us-east-1.amazonaws.com/{basePath}",
"variables": {
"basePath": {
"default": "/testStage"
}
}
}
]
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"version": "2016-09-12T17:50:37Z",
"title": "ProxyIntegrationWithLambda"
},
"host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
"basePath": "/testStage",
"schemes": [
"https"
],
"paths": {
"/{proxy+}": {
"x-amazon-apigateway-any-method": {
"produces": [
"application/json"
],
"parameters": [
343
Amazon API Gateway Guía del desarrollador
Integraciones
{
"name": "proxy",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-east-1:123456789012:function:SimpleLambda4ProxyResource/invocations",
"passthroughBehavior": "when_no_match",
"httpMethod": "POST",
"cacheNamespace": "roq9wj",
"cacheKeyParameters": [
"method.request.path.proxy"
],
"type": "aws_proxy"
}
}
}
}
}
Con la integración de proxy de Lambda, API Gateway asigna en tiempo de ejecución una solicitud entrante
en el parámetro de entrada event de la función de Lambda. La entrada incluye el método de solicitud, la
ruta, los encabezados, todos los parámetros de cadena de consulta, todas las cargas, el contexto asociado
y todas las variables de etapa definidas. El formato de entrada se explica en Formato de entrada de una
función de Lambda para la integración de proxy (p. 348). Para que API Gateway asigne la salida de
Lambda a respuestas HTTP correctamente, la función de Lambda debe producir el resultado en el formato
que se describe en Formato de salida de una función de Lambda para la integración de proxy (p. 351).
Con la integración de proxy de Lambda de un recurso de proxy a través del método ANY, la función de
Lambda del backend actúa como el controlador de eventos de todas las solicitudes a través del recurso
de proxy. Por ejemplo, para registrar patrones de tráfico, puede hacer que el dispositivo móvil envíe la
información de ubicación del país, la ciudad, la calle y el edificio enviando una solicitud con /state/
city/street/house en la ruta URL del recurso de proxy. La función de Lambda del backend puede
analizar la ruta URL e insertar tuplas de ubicación en una tabla de DynamoDB.
Como ejemplo, utilizaremos la siguiente función de Lambda de muestra como el backend de la API:
344
Amazon API Gateway Guía del desarrollador
Integraciones
"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;
}
{
"name": "HelloWorldProxy (AWS CLI)",
"id": "te6si5ach7",
"createdDate": 1508461860
}
{
"items": [
{
"path": "/",
"id": "krznpq9xpg"
}
345
Amazon API Gateway Guía del desarrollador
Integraciones
]
}
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:
{
"path": "/{proxy+}",
"pathPart": "{proxy+}",
"id": "2jf6xt",
"parentId": "krznpq9xpg"
}
Anote el valor id del recurso {proxy+} (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+}:
{
"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.
346
Amazon API Gateway Guía del desarrollador
Integraciones
Important
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 the section called “ Modelo de permisos de API Gateway
para invocar una API” (p. 288).
{
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/
arn:aws:lambda:us-east-1: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:
347
Amazon API Gateway Guía del desarrollador
Integraciones
En todos estos casos, la salida es una respuesta 200 con el siguiente cuerpo de respuesta:
Hello, jane!
{
"resource": "Resource path",
"path": "Path parameter",
"httpMethod": "Incoming request's method name"
"headers": {String containing incoming request headers}
"multiValueHeaders": {List of strings containing incoming request headers}
"queryStringParameters": {query string parameters }
"multiValueQueryStringParameters": {List of query string parameters}
"pathParameters": {path parameters}
"stageVariables": {Applicable stage variables}
"requestContext": {Request context, including authorizer-returned key-value pairs}
"body": "A JSON string of the request payload."
"isBase64Encoded": "A boolean flag to indicate if the applicable request payload is
Base64-encoded"
}
Note
En la entrada:
La siguiente solicitud POST muestra una API implementada en testStage con una variable de etapa de
stageVariableName=stageVariableValue:
{
"a": 1
}
Esta solicitud produce la siguiente carga de respuesta que contiene la salida devuelta por la función de
Lambda del backend, donde input se ha establecido en el parámetro event de la función de Lambda.
{
"message": "Hello me!",
"input": {
"resource": "/{proxy+}",
"path": "/hello/world",
"httpMethod": "POST",
348
Amazon API Gateway Guía del desarrollador
Integraciones
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"cache-control": "no-cache",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Content-Type": "application/json",
"headerName": "headerValue",
"Host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
"Postman-Token": "9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f",
"User-Agent": "PostmanRuntime/2.4.5",
"Via": "1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==",
"X-Forwarded-For": "54.240.196.186, 54.182.214.83",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"multiValueHeaders":{
'Accept':[
"*/*"
],
'Accept-Encoding':[
"gzip, deflate"
],
'cache-control':[
"no-cache"
],
'CloudFront-Forwarded-Proto':[
"https"
],
'CloudFront-Is-Desktop-Viewer':[
"true"
],
'CloudFront-Is-Mobile-Viewer':[
"false"
],
'CloudFront-Is-SmartTV-Viewer':[
"false"
],
'CloudFront-Is-Tablet-Viewer':[
"false"
],
'CloudFront-Viewer-Country':[
"US"
],
'':[
""
],
'Content-Type':[
"application/json"
],
'headerName':[
"headerValue"
],
'Host':[
"gy415nuibc.execute-api.us-east-1.amazonaws.com"
],
'Postman-Token':[
"9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f"
],
'User-Agent':[
"PostmanRuntime/2.4.5"
349
Amazon API Gateway Guía del desarrollador
Integraciones
],
'Via':[
"1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)"
],
'X-Amz-Cf-Id':[
"pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A=="
],
'X-Forwarded-For':[
"54.240.196.186, 54.182.214.83"
],
'X-Forwarded-Port':[
"443"
],
'X-Forwarded-Proto':[
"https"
]
},
"queryStringParameters": {
"name": "me",
"multivalueName": "me"
},
"multiValueQueryStringParameters":{
"name":[
"me"
],
"multivalueName":[
"you",
"me"
]
},
"pathParameters": {
"proxy": "hello/world"
},
"stageVariables": {
"stageVariableName": "stageVariableValue"
},
"requestContext": {
"accountId": "12345678912",
"resourceId": "roq9wj",
"stage": "testStage",
"requestId": "deef4878-7910-11e6-8f14-25afc3e9ae33",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": null,
"sourceIp": "192.168.196.186",
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "PostmanRuntime/2.4.5",
"user": null
},
"resourcePath": "/{proxy+}",
"httpMethod": "POST",
"apiId": "gy415nuibc"
},
"body": "{\r\n\t\"a\": 1\r\n}",
"isBase64Encoded": false
}
}
350
Amazon API Gateway Guía del desarrollador
Integraciones
En función de las características habilitadas, el mapa requestContext puede variar de API en API.
Por ejemplo, en el ejemplo anterior, no se especifica ningún tipo de autorización, por lo que no hay
propiedades $context.authorizer.* o $context.identity.* presentes. Cuando se especifica un
tipo de autorización, esto hace que API Gateway transfiera información del usuario autorizado al punto de
enlace de integración en un objeto requestContext.identity tal y como se indica a continuación:
• Cuando el tipo de autorización es AWS_IAM, la información del usuario autorizado incluye propiedades
$context.identity.*.
• Cuando el tipo de autorización es COGNITO_USER_POOLS (autorizador de Amazon Cognito), la
información del usuario autorizado incluye las propiedades $context.identity.cognito* y
$context.authorizer.claims.*.
• Cuando el tipo de autorización es CUSTOM (autorizador de Lambda), la información del usuario
autorizado incluye las propiedades $context.authorizer.principalId y otras propiedades
$context.authorizer.* aplicables.
{
...,
"requestContext": {
"requestTime": "20/Feb/2018:22:48:57 +0000",
"path": "/test/",
"accountId": "123456789012",
"protocol": "HTTP/1.1",
"resourceId": "yx5mhem7ye",
"stage": "test",
"requestTimeEpoch": 1519166937665,
"requestId": "3c3ecbaa-1690-11e8-ae31-8f39f1d24afd",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": "123456789012",
"cognitoIdentityId": null,
"caller": "AIDAJ........4HCKVJZG",
"sourceIp": "51.240.196.104",
"accessKey": "IAM_user_access_key",
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": "arn:aws:iam::123456789012:user/alice",
"userAgent": "PostmanRuntime/7.1.1",
"user": "AIDAJ........4HCKVJZG"
},
"resourcePath": "/",
"httpMethod": "GET",
"apiId": "qr2gd9cfmf"
},
...
}
Con la integración de proxy de Lambda, API Gateway requiere que la función de Lambda del backend
devuelva la salida de acuerdo con el siguiente formato JSON:
351
Amazon API Gateway Guía del desarrollador
Integraciones
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
"body": "..."
}
En la salida:
Para habilitar CORS para la integración de proxy de Lambda, debe agregar Access-Control-Allow-
Origin:domain-name a la salida headers. domain-name puede ser * para cualquier nombre de
dominio. La salida body se serializa en el frontend como la carga de respuesta del método. Si body es un
blob binario, puede codificarlo como una cadena codificada en Base64 estableciendo isBase64Encoded
en true y configurando */* como Binary Media Type (Tipo de medio binario). De lo contrario, puede
establecerlo en false o dejarlo sin especificar.
Note
Para obtener más información acerca de cómo habilitar la compatibilidad con datos
binarios, consulte Habilitar la compatibilidad con datos binarios mediante la consola de API
Gateway (p. 457). Para ver una función de Lambda de ejemplo, consulte Devolver medios
binarios desde una integración de proxy de Lambda (p. 465).
Si la salida de la función tiene un formato diferente, API Gateway devuelve una respuesta de error 502
Bad Gateway.
Para devolver una respuesta en una función de Lambda de Node.js, puede utilizar comandos como los
siguientes:
352
Amazon API Gateway Guía del desarrollador
Integraciones
Puede crearla en la consola de Lambda o mediante la CLI de AWS. En esta sección, hacemos referencia a
esta función mediante los siguientes ARN:
arn:aws:lambda:us-east-1:123456789012:function:HelloWorld
{
"name": "HelloWorld (AWS CLI)",
"id": "te6si5ach7",
"createdDate": 1508461860
}
353
Amazon API Gateway Guía del desarrollador
Integraciones
{
"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:
{
"path": "/greeting",
"pathPart": "greeting",
"id": "2jf6xt",
"parentId": "krznpq9xpg"
}
Anote el valor id del recurso greeting (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}:
{
"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}:
354
Amazon API Gateway Guía del desarrollador
Integraciones
{"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}
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')\"}"
355
Amazon API Gateway Guía del desarrollador
Integraciones
},
"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.
{
"selectionPattern": "",
"statusCode": "200"
}
Puede configurar la función de Lambda para una integración de Lambda que no sea proxy para invocarla
de forma asíncrona especificando 'Event' como el tipo de invocación de Lambda. Esto se realiza de la
siguiente manera:
356
Amazon API Gateway Guía del desarrollador
Integraciones
Para que los clientes decidan si las invocaciones son asincrónicas o sincrónicas:
Hay dos tipos de errores que Lambda puede devolver: errores estándar y errores personalizados. En la
API, debe tratarlos de forma diferente.
Con la integración de proxy de Lambda, Lambda debe devolver una salida con el siguiente formato:
{
"isBase64Encoded" : "boolean",
"statusCode": "number",
"headers": { ... },
"body": "JSON string"
}
En esta salida, statusCode es normalmente 4XX para un error del cliente y 5XX para un error del
servidor. API Gateway trata estos errores asignando el error de Lambda a una respuesta de error HTTP,
de acuerdo con el statusCode especificado. Para que API Gateway transmita el tipo de error (por
ejemplo, InvalidParameterException), como parte de la respuesta al cliente, la función de Lambda
debe incluir un encabezado (por ejemplo, "X-Amzn-ErrorType":"InvalidParameterException")
en la propiedad headers.
Temas
• Gestionar los errores de Lambda estándares en API Gateway. (p. 357)
• Gestionar los errores de Lambda personalizados en API Gateway (p. 359)
{
"errorMessage": "<replaceable>string</replaceable>",
"errorType": "<replaceable>string</replaceable>",
"stackTrace": [
"<replaceable>string</replaceable>",
...
]
357
Amazon API Gateway Guía del desarrollador
Integraciones
Aquí, errorMessage es una expresión de cadena del error. errorType es un tipo de error o excepción
dependiente del lenguaje. stackTrace es una lista de expresiones de cadena que indican la pila de
rastreo que conduce a la aparición del error.
Esta función devuelve el siguiente error de Lambda estándar, que contiene Malformed input ... como
el mensaje de error:
{
"errorMessage": "Malformed input ...",
"errorType": "Error",
"stackTrace": [
"exports.handler (/var/task/index.js:3:14)"
]
}
Asimismo, considere la siguiente función de Lambda de Python, que produce una Exception con el
mismo mensaje de error Malformed input ....
{
"stackTrace": [
[
"/var/task/lambda_function.py",
3,
"lambda_handler",
"raise Exception('Malformed input ...')"
]
],
"errorType": "Exception",
"errorMessage": "Malformed input ..."
}
Tenga en cuenta que los valores de las propiedades errorType y stackTrace dependen del lenguaje.
El error estándar también se aplica a cualquier objeto de error que sea una extensión del objeto Error o
una subclase de la clase Exception.
Para asignar el error de Lambda estándar a una respuesta del método, primero debe decidir cuál es el
código de estado HTTP para un error de Lambda determinado. Seguidamente, debe establecer un patrón
de expresiones regulares en la propiedad selectionPattern del recurso IntegrationResponse asociado
con el código de estado HTTP especificado. En la consola de API Gateway, selectionPattern se
indica como Lambda Error Regex (Expresión regular de error Lambda) en el editor de configuración de
Integration Response (Respuesta de integración).
Note
API Gateway utiliza expresiones regulares de estilo de patrón de Java para el mapeo de
respuesta. Para obtener más información, consulte Pattern (Patrón) en la documentación de
Oracle.
358
Amazon API Gateway Guía del desarrollador
Integraciones
Por ejemplo, para configurar una nueva expresión selectionPattern mediante la CLI de AWS, llame al
siguiente comando put-integration-response:
Para actualizar un valor de selectionPattern existente mediante la CLI de AWS, llame a la operación
update-integration-response para reemplazar el valor de ruta de /selectionPattern por la expresión
regular especificada con el patrón Malformed*.
Para establecer la expresión selectionPattern con la consola de API Gateway, escriba la expresión en
el cuadro de texto Lambda Error Regex (Expresión regular de error Lambda) cuando configure o actualice
una respuesta de integración de un código de estado HTTP especificado.
En lugar del error estándar descrito en la sección anterior, AWS Lambda le permite devolver un objeto
de error personalizado como una cadena JSON. El error puede ser cualquier objeto JSON válido. Por
ejemplo, la siguiente función de Lambda en JavaScript (Node.js) devuelve un error personalizado:
Debe activar el objeto myErrorObj en una cadena JSON antes de llamar a callback para salir de la
función. De lo contrario, myErrorObj se devuelve como una cadena de "[object Object]". Cuando
un método de la API está integrado con la función API Gateway anterior, Lambda recibe una respuesta de
integración con la siguiente carga:
359
Amazon API Gateway Guía del desarrollador
Integraciones
"errorMessage": "{\"errorType\":\"InternalServerError\",\"httpStatus\":500,\"requestId
\":\"e5849002-39a0-11e7-a419-5bb5807c9fb2\",\"trace\":{\"function\":\"abc()\",\"line\":123,
\"file\":\"abc.js\"}}"
}
Al igual que con cualquier respuesta de integración, puede transferir esta respuesta de error tal como está
a la respuesta del método. O puede usar una plantilla de asignación de cuerpo para transformar la carga
en un formato diferente. Considere, por ejemplo, la siguiente plantilla de asignación de cuerpo para una
respuesta de método del código de estado 500:
{
errorMessage: $input.path('$.errorMessage');
}
Esta plantilla traduce el cuerpo de respuesta de la integración que contiene la cadena JSON del error
personalizado en el siguiente cuerpo de respuesta del método. Este cuerpo de respuesta del método
contiene el objeto JSON del error personalizado:
{
"errorMessage" : {
errorType : "InternalServerError",
httpStatus : 500,
requestId : context.awsRequestId,
trace : {
"function": "abc()",
"line": 123,
"file": "abc.js"
}
}
};
En función de los requisitos de la API, es posible que tenga que pasar algunas o todas las propiedades
de errores personalizados como parámetros de encabezado de la respuesta del método. Para ello,
puede aplicar asignaciones de errores personalizados desde el cuerpo de respuesta de integración a los
encabezados de respuesta del método.
Por ejemplo, la siguiente extensión de OpenAPI define una asignación desde las propiedades
errorMessage.errorType, errorMessage.httpStatus, errorMessage.trace.function y
errorMessage.trace a error_type, error_status, error_trace_function y error_trace,
respectivamente.
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.error_trace_function":
"integration.response.body.errorMessage.trace.function",
"method.response.header.error_status":
"integration.response.body.errorMessage.httpStatus",
"method.response.header.error_type":
"integration.response.body.errorMessage.errorType",
"method.response.header.error_trace":
"integration.response.body.errorMessage.trace"
},
...
}
}
}
360
Amazon API Gateway Guía del desarrollador
Integraciones
"error_status":"500",
"error_trace":"{\"function\":\"abc()\",\"line\":123,\"file\":\"abc.js\"}",
"error_trace_function":"abc()",
"error_type":"InternalServerError"
API Gateway admite los siguientes puertos de punto de enlace: 80, 443 y 1024-65535.
Con la integración de proxy, la configuración es sencilla. Solo tiene que establecer el método HTTP y el
URI del punto de enlace HTTP, según los requisitos de backend, si no le preocupa la codificación o el
almacenamiento en caché del contenido.
Con la integración personalizada, la configuración requiere más pasos. Además de los pasos de
configuración de integración de proxy, debe especificar cómo se mapean los datos entrantes de la solicitud
a la solicitud de integración y cómo se mapean los datos resultantes de respuesta de la integración a la
respuesta del método.
Temas
• Configurar integraciones de proxy HTTP en API Gateway (p. 361)
• Configurar integraciones HTTP personalizadas en API Gateway (p. 365)
Al igual que con un recurso que no es de proxy, puede configurar un recurso de proxy con la integración
de proxy HTTP mediante la consola de API Gateway, importando un archivo de definición de OpenAPI
o llamando a la API REST de API Gateway directamente. Para obtener instrucciones detalladas acerca
de cómo utilizar la consola de API Gateway para configurar un recurso de proxy con la integración HTTP,
consulte Tutorial: Desarrollo de una API de REST con integración de proxy HTTP (p. 51).
El siguiente archivo de definición de API de OpenAPI muestra un ejemplo de una API con un recurso de
proxy que está integrado en el sitio web PetStore.
OpenAPI 3.0
361
Amazon API Gateway Guía del desarrollador
Integraciones
"openapi": "3.0.0",
"info": {
"version": "2016-09-12T23:19:28Z",
"title": "PetStoreWithProxyResource"
},
"paths": {
"/{proxy+}": {
"x-amazon-apigateway-any-method": {
"parameters": [
{
"name": "proxy",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.path.proxy": "method.request.path.proxy"
},
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/{proxy}",
"passthroughBehavior": "when_no_match",
"httpMethod": "ANY",
"cacheNamespace": "rbftud",
"cacheKeyParameters": [
"method.request.path.proxy"
],
"type": "http_proxy"
}
}
}
},
"servers": [
{
"url": "https://4z9giyi2c1.execute-api.us-east-1.amazonaws.com/{basePath}",
"variables": {
"basePath": {
"default": "/test"
}
}
}
]
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"version": "2016-09-12T23:19:28Z",
"title": "PetStoreWithProxyResource"
},
"host": "4z9giyi2c1.execute-api.us-east-1.amazonaws.com",
"basePath": "/test",
"schemes": [
"https"
],
362
Amazon API Gateway Guía del desarrollador
Integraciones
"paths": {
"/{proxy+}": {
"x-amazon-apigateway-any-method": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "proxy",
"in": "path",
"required": true,
"type": "string"
}
],
"responses": {},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"requestParameters": {
"integration.request.path.proxy": "method.request.path.proxy"
},
"uri": "http://petstore-demo-endpoint.execute-api.com/petstore/{proxy}",
"passthroughBehavior": "when_no_match",
"httpMethod": "ANY",
"cacheNamespace": "rbftud",
"cacheKeyParameters": [
"method.request.path.proxy"
],
"type": "http_proxy"
}
}
}
}
}
Las instancias en tiempo de ejecución del método ANY y el recurso de proxy son válidas. La llamada
devolverá una respuesta 200 OK con la carga que contiene el primer lote de mascotas, tal y como se
devuelve desde el backend.
• Establecer ANY en GET y {proxy+} en pets?type=dog
363
Amazon API Gateway Guía del desarrollador
Integraciones
Las instancias en tiempo de ejecución del método ANY y el recurso de proxy son válidas. La llamada
devolverá una respuesta 200 OK con la carga que contiene el primer lote de perros especificados, tal y
como se devuelve desde el backend.
• Establecer ANY en GET y {proxy+} en pets/{petId}
Las instancias en tiempo de ejecución del método ANY y el recurso de proxy son válidas. La llamada
devolverá una respuesta 200 OK con la carga que contiene la mascota especificada, tal y como se
devuelve desde el backend.
• Establecer ANY en POST y {proxy+} en pets
{
"type" : "dog",
"price" : 1001.00
}
{
"type" : "dog",
"price" : 1001.00
}
Las instancias en tiempo de ejecución del método ANY y el recurso de proxy son válidas. La llamada
devolverá una respuesta 200 OK con la carga que contiene la mascota recién creada, tal y como se
devuelve desde el backend.
• Establecer ANY en GET y {proxy+} en pets/cat
364
Amazon API Gateway Guía del desarrollador
Integraciones
GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets/cat
GET http://petstore-demo-endpoint.execute-api.com/petstore/pets/cat
La instancia en tiempo de ejecución de la ruta del recurso de proxy no se corresponde con un punto de
enlace del backend y la solicitud resultante no es válida. Como resultado, se devuelve una respuesta
400 Bad Request con el siguiente mensaje de error.
{
"errors": [
{
"key": "Pet2.type",
"message": "Missing required field"
},
{
"key": "Pet2.price",
"message": "Missing required field"
}
]
}
GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test
GET http://petstore-demo-endpoint.execute-api.com/petstore/pets
El recurso de destino es el elemento principal del recurso de proxy, pero la instancia en tiempo de
ejecución del método ANY no está definida en la API de ese recurso. Como resultado, esta solicitud GET
devuelve una respuesta 403 Forbidden con el mensaje de error Missing Authentication Token
devuelto por API Gateway. Si la API expone el método ANY o GET en el recurso principal (/), la llamada
devuelve una respuesta 404 Not Found con el mensaje Cannot GET /petstore, tal y como se
devuelve desde el backend.
Para cualquier solicitud cliente, si la URL del punto de enlace de destino no es válida o el verbo HTTP
es válido pero no es compatible, el backend devuelve una respuesta 404 Not Found. Para un método
HTTP no admitido, se devuelve una respuesta 403 Forbidden.
365
Amazon API Gateway Guía del desarrollador
Integraciones
para especificar plantillas de mapeo, una para cada tipo de contenido admitido. Dichas plantillas mapean
los parámetros de solicitud de método, o el cuerpo, al cuerpo de solicitud de integración.
De forma similar, como parte de la configuración de respuesta de método, debe establecer la propiedad
responseParameters en el recurso MethodResponse. Esto declara qué parámetros de respuesta de
método, que se van a enviar al cliente, se mapean desde los parámetros de respuesta de integración o
ciertas propiedades de cuerpo aplicables que se devolvieron desde el backend. A continuación, como
parte de la configuración de respuesta de integración, debe establecer la propiedad responseParameters
en el recurso IntegrationResponse correspondiente para especificar los mapeos entre parámetros.
También debe establecer el mapa responseTemplates para especificar plantillas de mapeo, una para cada
tipo de contenido admitido. Dichas plantillas mapean los parámetros de respuesta de integración, o bien
las propiedades de cuerpo de respuesta de integración, al cuerpo de respuesta del método.
Para obtener más información sobre la configuración de plantillas de mapeo, consulte Configuración de
transformaciones de datos para API REST (p. 389).
Para crear una integración privada, primero debe crear un Balanceador de carga de red. El Balanceador
de carga de red debe tener un agente de escucha que enrute las solicitudes a los recursos de la VPC. A
continuación, cree un vínculo de VPC que utilice para conectar la API y el Balanceador de carga de red.
Después de crear un vínculo de VPC, se crean integraciones privadas para enrutar el tráfico de la API a los
recursos de la VPC a través de dicho vínculo y el Balanceador de carga de red.
Note
El balanceador de carga de red y la API deben pertenecer a la misma cuenta de AWS.
Con la integración privada de API Gateway, puede habilitar el acceso a recursos HTTP/HTTPS dentro de
una VPC sin conocer al detalle la configuración de las redes privadas o los dispositivos específicos de las
tecnologías.
Temas
• Configuración de un balanceador de carga de red para integraciones privadas de API
Gateway (p. 366)
• Concesión de permisos para crear un enlace VPC (p. 367)
• Configurar una API de API Gateway con integración privada a través de la consola de API
Gateway (p. 368)
• Configurar una API de API Gateway con integración privada a través de la CLI de AWS (p. 368)
• Configuración de una API con integraciones privadas a través de OpenAPI (p. 371)
• Cuentas de API Gateway utilizadas para integraciones privadas (p. 372)
Para cada VPC en la que disponga de recursos, solo necesita configurar un NLB y un VPCLink. El NLB
admite varios agentes de escucha y grupos de destino por NLB. Puede configurar cada servicio como un
366
Amazon API Gateway Guía del desarrollador
Integraciones
agente de escucha específico en el NLB y utilizar un único VPCLink para conectarse al NLB. Al crear la
integración privada en API Gateway, defina cada servicio utilizando el puerto específico asignado a cada
servicio. Para obtener más información, consulte the section called “Tutorial: Creación de una API con
integración privada” (p. 87).
Note
Si desea crear un balanceador de carga de red privada para una integración privada con la
consola de API Gateway
Una vez que haya creado el balanceador de carga de red, anote su ARN. Lo necesitará para crear un
enlace VPC en API Gateway e integrar la API con los recurso de la VPC detrás del balanceador de
carga de red.
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"ec2:CreateVpcEndpointServiceConfiguration",
"ec2:DeleteVpcEndpointServiceConfigurations",
"ec2:DescribeVpcEndpointServiceConfigurations",
"ec2:ModifyVpcEndpointServicePermissions"
],
"Resource":"*"
},
{
"Effect":"Allow",
"Action":[
"elasticloadbalancing:DescribeLoadBalancers"
],
"Resource":"*"
}
]
}
367
Amazon API Gateway Guía del desarrollador
Integraciones
3. Asigne el rol de IAM a sí mismo o al usuario de la cuenta que está creando los enlaces VPC.
Configurar una API de API Gateway con integración privada a través de la CLI de
AWS
Antes de crear una API con la integración privada, debe haber configurado el recurso de VPC y haber
creado y configurado un balanceador de carga de red con el origen de la VPC como el objetivo. Si no se
cumplen los requisitos, siga Configuración de un balanceador de carga de red para integraciones privadas
de API Gateway (p. 366) para instalar el recurso de VPC, crear un balanceador de carga de red y definir
el recurso de VPC como objetivo del balanceador de carga de red.
Note
Para crear y administrar un VpcLink, también debe haber configurado los permisos correspondientes.
Para obtener más información, consulte Concesión de permisos para crear un enlace VPC (p. 367).
Note
Solo necesita los permisos para crear un VpcLink en la API. No necesita los permisos para
utilizar el VpcLink.
Una vez que haya creado el balanceador de carga de red, anote su ARN. Lo necesitará para crear un
enlace VPC para la integración privada.
Para configurar una API con integración privada a través de la CLI de AWS
1. Cree un enlace VpcLink que tenga como destino el balanceador de carga de red especificado.
{
"status": "PENDING",
"targetArns": [
"arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/net/my-
vpclink-test-nlb/1f8df693cd094a72"
],
"id": "gim7c3",
"name": "my-test-vpc-link"
}
368
Amazon API Gateway Guía del desarrollador
Integraciones
Solo si VpcLink se crea correctamente, podremos crear la API e integrarla con el recurso de la VPC
a través de VpcLink.
Anote el valor id del enlace VpcLink creado (gim7c3 en la salida anterior). Lo necesitará para
configurar la integración privada.
2. Configure una API creando un recurso RestApi de API Gateway:
Hemos quitado los parámetros de entrada endpoint-url y region para utilizar la región
predeterminada especificada en la configuración de AWS.
Anote el valor id de RestApi del resultado devuelto. En este ejemplo, supondremos que es
6j4m3244we. Necesitará este valor para realizar otras operaciones en la API, como la configuración
de los métodos e integraciones.
A efectos de esta explicación, crearemos una API con un solo método GET en el recurso raíz (/) y lo
integraremos con VpcLink.
3. Configure el método GET /. En primer lugar, obtenga el identificador del recurso raíz (/):
Si desea utilizar los permisos de IAM, un autorizador de Lambda o un grupo de usuarios de Amazon
Cognito para autenticar al intermediario, establezca authorization-type en AWS_IAM, CUSTOM o
COGNITO_USER_POOLS, respectivamente.
Si no utiliza la integración de proxy con VpcLink, también debe configurar al menos un método de
respuesta del código de estado 200. Aquí, utilizaremos la integración de proxy.
4. Configure la integración privada de tipo HTTP_PROXY y llame al comando put-integration tal y
como se indica a continuación:
369
Amazon API Gateway Guía del desarrollador
Integraciones
{
"passthroughBehavior": "WHEN_NO_MATCH",
"timeoutInMillis": 29000,
"connectionId": "gim7c3",
"uri": "http://myApi.example.com",
"connectionType": "VPC_LINK",
"httpMethod": "GET",
"cacheNamespace": "skpp60rab7",
"type": "HTTP_PROXY",
"cacheKeyParameters": []
}
Al utilizar una variable de etapa, la propiedad connectionId queda definida al crear la integración:
Si lo desea, también puede actualizar la integración para restablecer el valor connectionId con una
variable de etapa:
No olvide utilizar una lista JSON con forma de cadena como valor del parámetro patch-
operations.
370
Amazon API Gateway Guía del desarrollador
Integraciones
Si utiliza una variable de etapa para establecer el valor de connectionId, tiene la ventaja de que
puede integrar la misma API con diferentes enlaces VpcLink restableciendo el valor de esta variable.
Esto resulta útil para establecer la API en diferentes enlaces VPC y migrar a otro balanceador de
carga de red u otra VPC.
Como hemos utilizado la integración de proxy privada, ahora la API está lista para la implementación
y para que la prueba se ejecute. En las integraciones que no son de proxy, también debe configurar
la respuesta del método y la integración, al igual que haría al configurar una API con integraciones
personalizadas de HTTP (p. 57).
5. Para probar la API, impleméntela. Esto es necesario si ha utilizado la variable de etapa como
marcador del ID de VpcLink. Para implementar la API con una variable de etapa, llame al comando
create-deployment tal y como se muestra a continuación:
Para actualizar la variable de etapa con un ID de VpcLink diferente (por ejemplo, asf9d7), llame al
comando update-stage:
Si lo desea, también puede escribir la URL de invocación de la API en un navegador web para ver los
resultados.
Si codifica la propiedad connection-id con el literal del ID de VpcLink, también puede llamar a
test-invoke-method para probar la invocación de la API antes de implementarla.
Puede utilizar una variable de etapa para hacer referencia al ID de VpcLink. También puede asignar el
valor del ID directamente a connectionId.
371
Amazon API Gateway Guía del desarrollador
Integraciones
El archivo de OpenAPI con formato JSON contiene un ejemplo de una API con un enlace VPC al que hace
referencia una variable de etapa (${stageVariables.vpcLinkId}):
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"version": "2017-11-17T04:40:23Z",
"title": "MyApiWithVpcLink"
},
"host": "p3wocvip9a.execute-api.us-west-2.amazonaws.com",
"basePath": "/test",
"schemes": [
"https"
],
"paths": {
"/": {
"get": {
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
}
}
},
"x-amazon-apigateway-integration": {
"responses": {
"default": {
"statusCode": "200"
}
},
"uri": "http://myApi.example.com",
"passthroughBehavior": "when_no_match",
"connectionType": "VPC_LINK",
"connectionId": "${stageVariables.vpcLinkId}",
"httpMethod": "GET",
"type": "http_proxy"
}
}
}
},
"definitions": {
"Empty": {
"type": "object",
"title": "Empty Schema"
}
}
}
372
Amazon API Gateway Guía del desarrollador
Integraciones
Región ID de cuenta
us-east-1 392220576650
us-east-2 718770453195
us-west-1 968246515281
us-west-2 109351309407
ca-central-1 796887884028
eu-west-1 631144002099
eu-west-2 544388816663
eu-west-3 061510835048
eu-central-1 474240146802
eu-north-1 394634713161
ap-northeast-1 969236854626
ap-northeast-2 020402002396
ap-southeast-1 195145609632
ap-southeast-2 798376113853
ap-south-1 507069717855
ap-east-1 174803364771
sa-east-1 287228555773
me-south-1 855739686837
Como desarrollador de una API, puede decidir cómo API Gateway responde a una solicitud de integración
simulada. Para ello, configura la solicitud de integración y la respuesta de integración del método para
asociar una respuesta a un código de estado determinado. Para que un método con la integración
simulada devuelva una respuesta 200, configure la plantilla de asignación del cuerpo de la solicitud de
integración para que devuelva lo siguiente.
{"statusCode": 200}
Configure una respuesta de integración 200 para que tenga la siguiente plantilla de asignación de cuerpo;
por ejemplo:
373
Amazon API Gateway Guía del desarrollador
Integraciones
{
"statusCode": 200,
"message": "Go ahead without me."
}
De igual modo, para que el método devuelva, por ejemplo, una respuesta de error 500, configure la
plantilla de asignación del cuerpo de la solicitud de integración para que devuelva lo siguiente.
{"statusCode": 500}
Configure una respuesta de integración 500 con, por ejemplo, la siguiente plantilla de asignación:
{
"statusCode": 500,
"message": "The invoked method is not supported on the API resource."
}
Si lo desea, también puede hacer que un método de la integración simulada devuelva la respuesta de
integración predeterminada sin definir la plantilla de asignación de solicitudes de integración. La respuesta
de integración predeterminada es la única que tiene la opción HTTP status regex (Expresión regular de
estado de HTTP) sin definir. Asegúrese de que se establecen los comportamientos de acceso directo
apropiados.
Note
Las integraciones simuladas no se han diseñado para admitir plantillas de respuestas grandes. Si
las necesita para su caso de uso, considere el uso de una integración de Lambda en su lugar.
Si utiliza una plantilla de asignación de solicitudes de integración, puede insertar la lógica de la aplicación
para decidir qué respuesta de integración simulada debe devolverse en función de unas determinadas
condiciones. Por ejemplo, puede utilizar un parámetro de consulta scope en la solicitud de entrada para
determinar si se va a devolver una respuesta de éxito o error:
{
#if( $input.params('scope') == "internal" )
"statusCode": 200
#else
"statusCode": 500
#end
}
De esta forma, el método de la integración simulada permite realizar llamadas internas mientras que otros
tipos de llamadas se rechazan con respuestas de error.
En esta sección, se describe cómo utilizar la consola de API Gateway para habilitar la integración simulada
para un método de la API.
Temas
• Habilitar la integración simulada a través de la consola de API Gateway (p. 374)
1. Elija un recurso de API y cree un método. En el panel del método Setup (Configuración), seleccione
Mock (Simulación) en Integration type (Tipo de integración) y elija Save (Gaurdar).
374
Amazon API Gateway Guía del desarrollador
Integraciones
2. En Method Execution (Ejecución del método), elija Method Request (Solicitud de método). Expanda
URL Query String Parameters (Parámetros de cadena de consulta URL). Seleccione Add query string
(Añadir cadena de consulta) para agregar un parámetro de consulta scope. Esto determina si el
intermediario es o no interno.
3. En Method Execution (Ejecución del método), elija Method Response (Respuesta de método).
4. En HTTP Status (Estado HTTP), agregue 500.
5. Seleccione Integration Request (Solicitud de integración) en Method Execution (Ejecución del
método). Expanda Mapping Templates (Plantillas de asignación). Seleccione o añada una plantilla de
asignación application/json. Escriba lo siguiente el editor de la plantilla:
{
#if( $input.params('scope') == "internal" )
"statusCode": 200
#else
"statusCode": 500
#end
}
{
"statusCode": 200,
"message": "Go ahead without me"
}
{
"statusCode": 500,
"message": "The invoked method is not supported on the API resource."
}
Request: /?scope=internal
Status: 200
Latency: 26 ms
Response Body
375
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
"statusCode": 200,
"message": "Go ahead without me"
}
Response Headers
{"Content-Type":"application/json"}
Request: /
Status: 500
Latency: 16 ms
Response Body
{
"statusCode": 500,
"message": "The invoked method is not supported on the API resource."
}
Response Headers
{"Content-Type":"application/json"}
También puede devolver los encabezados de una respuesta de integración simulada agregando primero
un encabezado a la respuesta del método y configurando después una asignación de encabezado en la
respuesta de integración. De hecho, es así como la consola de API Gateway permite la compatibilidad con
CORS, devolviendo los encabezados requeridos por CORS.
Temas
• Información general de la validación básica de solicitudes en API Gateway (p. 376)
• Configuración de la validación básica de solicitudes en API Gateway (p. 377)
• Prueba de la validación básica de solicitudes en API Gateway (p. 383)
• Definiciones de OpenAPI de una API de ejemplo con la validación básica de solicitudes (p. 386)
• Los parámetros de la solicitud necesarios en el URI, cadena de consulta y encabezados de una solicitud
de entrada están presentes y no están vacíos.
376
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
• La carga de la solicitud aplicable sigue el modelo (p. 395) de solicitud del esquema JSON del método.
Para habilitar la validación básica, especifica reglas de validación en un validador de solicitudes, agregue
el validador al mapa de validadores de solicitudes de la API y asigne el validador a métodos de la API
individuales.
Note
Solicitar la validación del cuerpo y solicitar el "acceso directo" (o passthrough) al cuerpo (p. 424)
son dos cosas distintas. Cuando una carga de solicitud no se puede validar porque no se
encuentra un esquema de modelo coincidente, puede elegir acceder directamente a ella
(passthrough) o bloquear la carga original.
Por ejemplo, cuando se habilita la validación de solicitudes con una plantilla de mapeo para el
tipo de medios application/json, es posible que desee transmitir una carga XML a través del
backend aún sabiendo que la validación de solicitudes habilitada devolverá un error. Este puede
ser el caso si espera que la carga XML sea compatible con el método en el futuro. Para que la
solicitud con una carga XML devuelva un error, debe elegir la opción NEVER en el comportamiento
de "acceso directo" (o passthrough) del contenido.
Temas
• Configuración de la validación básica de solicitudes importando la definición de OpenAPI (p. 377)
• Configurar validadores de solicitudes mediante la API REST de API Gateway (p. 381)
• Configurar la validación básica de solicitudes mediante la consola de API Gateway (p. 382)
1. Declare los validadores de solicitudes en OpenAPI especificando un conjunto de los objetos Objeto
x-amazon-apigateway-request-validators.requestValidator (p. 804) en el mapa Objeto x-amazon-
apigateway-request-validators (p. 803) en el nivel de API. Por ejemplo, el archivo de OpenAPI de la
API de ejemplo (p. 386) contiene el mapa x-amazon-apigateway-request-validators, con
los nombres de los validadores como claves.
OpenAPI 3.0
{
"openapi": "3.0.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"servers": [
377
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
{
"url": "/{basePath}",
"variables": {
"basePath": {
"default": "/v1"
}
}
}
],
"x-amazon-apigateway-request-validators": {
"all": {
"validateRequestBody": true,
"validateRequestParameters": true
},
"params-only": {
"validateRequestBody": false,
"validateRequestParameters": true
}
}
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"schemes": [
"https"
],
"basePath": "/v1",
"produces": [
"application/json"
],
"x-amazon-apigateway-request-validators" : {
"all" : {
"validateRequestBody" : true,
"validateRequestParameters" : true
},
"params-only" : {
"validateRequestBody" : false,
"validateRequestParameters" : true
}
},
...
}
OpenAPI 3.0
378
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
"openapi": "3.0.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"servers": [
{
"url": "/{basePath}",
"variables": {
"basePath": {
"default": "/v1"
}
}
}
],
"x-amazon-apigateway-request-validator": "params-only",
...
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"schemes": [
"https"
],
"basePath": "/v1",
"produces": [
"application/json"
],
...
"x-amazon-apigateway-request-validator" : "params-only",
...
}
OpenAPI 3.0
{
"openapi": "3.0.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"servers": [
{
"url": "/{basePath}",
"variables": {
"basePath": {
"default": "/v1"
}
}
}
],
379
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
"paths": {
"/validation": {
"post": {
"x-amazon-apigateway-request-validator": "all",
...
}
}
}
...
}
OpenAPI 2.0
{
"swagger": "2.0",
"info": {
"title": "ReqValidation Sample",
"version": "1.0.0"
},
"schemes": [
"https"
],
"basePath": "/v1",
"produces": [
"application/json"
],
...
"paths": {
"/validation": {
"post": {
"x-amazon-apigateway-request-validator" : "all",
...
},
...
}
}
...
}
3. En API Gateway, cree la API con validadores de solicitudes habilitados importando esta definición de
OpenAPI de ejemplo (p. 386):
Copy the JSON object from this sample OpenAPI definition (p. 386) and paste it here.
380
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
{
"stageName" : "testStage",
"stageDescription" : "Test stage",
"description" : "First deployment",
"cacheClusterEnabled" : "false"
}
Para obtener instrucciones sobre cómo probar la validación de solicitudes mediante la API REST
de API Gateway, consulte Probar la validación básica de solicitudes mediante la API REST de API
Gateway (p. 383). Para obtener instrucciones sobre cómo realizar las pruebas mediante la consola
de API Gateway, consulte Probar la validación básica de solicitudes mediante la consola de API
Gateway (p. 386).
Para habilitar la validación básica de solicitudes mediante la API REST de API Gateway
Suponemos que tiene una API similar a la API de ejemplo (p. 386), pero que no ha
configurado validadores de solicitudes. Si su API ya tiene validadores de solicitudes, llame
a la acción requestvalidator:update o method:put correspondiente en lugar de a
requestvalidator:create o method:put.
{
"name" : "params-only",
"validateRequestBody" : "false",
"validateRequestParameters" : "true"
}
{
"name" : "all",
"validateRequestBody" : "true",
"validateRequestParameters" : "true"
}
381
Amazon API Gateway Guía del desarrollador
Validación de solicitudes
Si las claves del validador anteriores ya existen en el mapa RequestValidators, llame a la acción
requestvalidator:update en lugar de restablecer las reglas de validación.
3. Para aplicar el validador de solicitudes