API Gateway

Es un mecanismo que nos permite exponer una API REST, para que otros servicios o aplicaciones puedan hacer llamadas a través de la API que definamos.

Características

Algunas características de este servicio:

  • Soporta protocolo WebSocket
  • Gestiona versionado de la API
  • Se pueden controlar diferentes entornos (dev, test, prod, …)
  • Integra la seguridad (autenticación y autorización)
  • Puede crear claves de API, y gestionar el flujo de peticiones
  • Posibilidad de importar Swagger/Open API
  • Genera un SDK y especificaciones del API
  • Puede cachear respuestas al API
  • Tiene un límite de 10.000 peticiones por segundo, pero se puede solicitar que lo aumenten. Si se alcanza el límite, devuelve un 429 Too Many Requests.

Integración

El API se puede integrar con los siguientes servicios como Backend:

  • Lambda:
    • Se crea una llamada a una función Lambda
    • Es una forma sencilla de exponer un REST API
  • HTTP
    • Es muy habitual exponer un backend de tipo HTTP
    • Puede ser un servicio HTTP OnPremise, un ALB, …
    • Permite gestionar rate-limit, cacheo, autenticación de usuarios, …
  • Servicio AWS:
    • Se puede exponer otros servicios de AWS fácilmente.
    • Ejemplo: un AWS Step Function, un mensaje a SQS, …

Publicación

Y existen tres modos de exponer cada API:

  • Edge-Optimized: El API está en una sola Región, pero a través de CloudFront se enruta internamente en AWS el tráfico de clientes desde el Edge más cercano.
  • Regional: para clientes que estén en la misma Región, y se puede combinar con CloudFront
  • Privado: solo accesible desde el VPC

Seguridad

El acceso al API se gestiona mediante IAM, mediante la creación de una policy asociada a un usuario o rol.

Se utiliza una característica llamada «Sig v4», para enviar las credenciales en las cabeceras de la llamada:

También se puede utilizar Lambda Authorizer para validar la autenticatión de las peticiones:

O se puede utilizar el servicio de Cognito:

Deployment and Stages

Cada vez que hacemos cambios en un API Gateway, estos cambios no son efectivos hasta que se hace un «deployment» de esos cambios. Este despliegue debe hacerse en un «stage» (ej: prod, dev, test, …), y cada Stage tiene sus propia configuración. Es posible hacer rollback de un Stage porque se mantiene todo el histórico de despliegues.

Existen Stage variables, que se pueden utilizar para pasar valores que cambian al backend, como una función lambda en el «contexto». De esta forma podemos definir 3 Stages, que llaman a la misma función Lambda pero cambiando el valor de esta variable. En Lambda, puedo utilizar esta variable para llamar a distintas versiones de la misma función.

Caché

Utilizar una caché en API Gateway reduce el número de llamadas que se hace al backend (Lambda, ASG, …):

  • El TTL por defecto son 300 segundos (máximo 3600s)
  • La caché se define por Stage, y se puede personalizar por Método
  • Posibilidad de cifrar la caché
  • La capacidad es entre 0,5GB y 237GB
  • Es un servicio caro, solo conviene para entornos de producción

Para invalidar la caché se puede hacer desde la consola borrando todo el contenido, o un cliente puede hacerlo utiliznado la cabecera «header: Cache-Control: max-age=0«. Esta operación requiere una política para permitir que solo un cliente autorizado pueda realizarlo.

Usage Plans y API Keys

Se puede utilizar el servicio de API Gateway para ofrecer un servicio a clientes, de forma que se pueda especificar unas condiciones de uso y de autenticación a cada uno de los clientes que lo utilicen:

  • Usage Plan, permite definir lo siguiente:
    • Quién puede acceder a cada API Stage o Método
    • Qué volumen de llamadas pueden hacer y cómo de rápido
    • Si deben utilizar API Keys para autenticarse y medir su uso
    • Throttling limits y límites de cuota
  • API Keys:
    • Es una cadena de caracteres que identifica a cada cliente (ej: Xh4H43Shekmc32H7jMhsikeERxKxQrmL2huHUGT2)
    • El throttling limit se aplica sobre este identificador
    • El límite de cuota especifica el número total de peticiones permitido
    • Se añade a la petición con la cabecera X-API-Key

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.