Manage serverless APIs with Apache APISIX
January 18, 2023
La computación sin servidor permite a los desarrolladores construir aplicaciones más rápido al eliminar la necesidad de gestionar infraestructura. Con las API sin servidor en la nube, el proveedor de servicios en la nube aprovisiona, escala y gestiona automáticamente la infraestructura necesaria para ejecutar el código. En este artículo, aprenderás cómo integrar Apache APISIX API Gateway con Azure Functions para gestionar API sin servidor basadas en Java.
Objetivos de aprendizaje
A lo largo del artículo, aprenderás lo siguiente:
- ¿Qué son las API sin servidor?
- El papel de la API Gateway en la gestión del tráfico complejo de API sin servidor.
- Cómo configurar Apache APISIX Gateway.
- Cómo construir API sin servidor con Azure Functions.
- Cómo exponer API sin servidor como servicios upstream.
- Cómo proteger API sin servidor con plugins de autenticación de APISIX.
- Cómo aplicar políticas de limitación de tasa.
Apache APISIX ofrece plugins adicionales que pueden usarse con otras soluciones sin servidor como AWS Lambda.
Antes de comenzar con la parte práctica del tutorial, repasemos algunos conceptos.
¿Qué son las API sin servidor?
Las API sin servidor son iguales a las API tradicionales, excepto que utilizan un backend sin servidor. Para las empresas y los desarrolladores, la computación sin servidor significa que ya no tienen que preocuparse por el mantenimiento del servidor o el escalado de los recursos del servidor para satisfacer las demandas de los usuarios. Además, las API sin servidor evitan el problema del escalado porque crean recursos del servidor cada vez que se realiza una solicitud. Las API sin servidor reducen la latencia porque están alojadas en un servidor de origen. Por último, pero no menos importante, la computación sin servidor es mucho más rentable que la alternativa tradicional, como construir microservicios completos.
API sin servidor usando Azure Functions
Una Azure Function es una forma sencilla de ejecutar pequeños fragmentos de código en la nube. No tienes que preocuparte por la infraestructura necesaria para alojar ese código. Puedes escribir la función en C#, Java, JavaScript, PowerShell, Python o cualquiera de los lenguajes que se enumeran en los lenguajes admitidos.
Con Azure Functions, puedes construir rápidamente API HTTP para tus aplicaciones web sin el dolor de cabeza de los frameworks web. Azure Functions es sin servidor, por lo que solo se te cobra cuando se llama a un punto final HTTP. Cuando los puntos finales no se están utilizando, no se te cobra. Estas dos cosas combinadas hacen que plataformas sin servidor como Azure Functions sean una opción ideal para API donde experimentas picos inesperados de tráfico.
API Gateway para la gestión del tráfico de API sin servidor
Un API Gateway es una parte fundamental de las API sin servidor porque es responsable de la conexión entre una API definida y la función que maneja las solicitudes a esa API. Hay muchos beneficios de usar un API Gateway en la arquitectura de API basadas en sin servidor. Además de las funcionalidades principales de un API Gateway, como autenticación, limitación de tasa, observabilidad, almacenamiento en caché, etc., es capaz de invocar API sin servidor, suscribirse a eventos, luego procesarlos usando callbacks y reenviar solicitudes de autenticación a servicios de autorización externos con lógica de función sin servidor completamente personalizada.
Gestión de API sin servidor con demostración de Apache APISIX
Con suficiente conocimiento teórico en mente, ahora podemos pasar a una sesión práctica. Usamos un proyecto de ejemplo apisix-manage-serverless-apis alojado en GitHub. Puedes encontrar el código fuente y los comandos curl de ejemplo que usamos en este tutorial.
Para nuestro mini-proyecto, trabajaremos con dos funciones simples de Azure escritas en Java que simulan nuestras API sin servidor para los servicios de Producto y Revisión.
Requisitos previos
- Debes estar familiarizado con los conceptos fundamentales de API.
- Debes tener conocimientos prácticos de Azure Functions, por ejemplo, este módulo de aprendizaje muestra cómo construir una API HTTP usando la extensión de Azure Functions para Visual Studio Code.
- Docker
- Cuenta de Azure
- CLI de Azure
- Kit de desarrollo de Java, al menos la versión 8
- Maven
- Azure Functions Core Tools
- Visual Studio Code
- Azure Functions Core Tools (versión mínima 2.6.666)
- Extensión de Azure Functions para Visual Studio Code
Configuración del proyecto
Lo primero que debes hacer es clonar el repositorio del proyecto desde GitHub:
git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git
Abre la carpeta del proyecto en tu editor de código favorito. El tutorial utiliza VS Code.
Ejecutar Apache APISIX
Para ejecutar Apache APISIX y Azure Functions localmente, puedes seguir estos pasos:
Abre una nueva ventana de terminal y ejecuta el comando docker compose up
desde la carpeta raíz del proyecto:
docker compose up -d
El comando anterior ejecutará Apache APISIX y etcd junto con Docker. Por ejemplo, si tienes Docker Desktop instalado en tu máquina, puedes ver los contenedores en ejecución allí:
En esta demostración, instalamos APISIX en nuestro entorno local, pero también puedes desplegarlo en Azure y ejecutarlo en Azure Container Instance. Consulta el siguiente tutorial.
Ejecutar Azure Functions
Luego, navega a la carpeta /upstream
:
mvn clean install
mvn azure-functions:run
Las dos funciones se iniciarán en una ventana de terminal. Puedes solicitar ambas API sin servidor en tu navegador:
Por ejemplo:
Desplegar Azure Functions
A continuación, desplegamos el código de las funciones en Azure Function App ejecutando el siguiente comando:
mvn azure-functions:deploy
O simplemente puedes seguir este tutorial sobre cómo desplegar el proyecto de función en Azure
Ten en cuenta que el nombre de la aplicación de función se genera aleatoriamente en función de tu
artifactId
, seguido de un número generado aleatoriamente. En los comandos del tutorial, se menciona el nombre de la aplicación de funciónserverless-apis
.
Solo para asegurarnos de que nuestra función funciona, podemos probar una llamada de invocación solicitando directamente su URL en el navegador:
https://serverless-apis.azurewebsites.net/api/products
https://serverless-apis.azurewebsites.net/api/reviews
Exponer API sin servidor en APISIX
Una vez completada la configuración, ahora expondremos las API sin servidor de Azure Functions como servicios upstream en APISIX. Para hacerlo, necesitamos crear una nueva Ruta con el plugin azure-function
habilitado para ambas API sin servidor de backend de productos
y revisiones
.
Si el plugin azure-function
está habilitado en una ruta, APISIX escucha las solicitudes en la ruta de esa ruta y luego invoca el código de la función remota de Azure con los parámetros de esa solicitud.
Crear una Ruta para Productos
Para crear una ruta para la función de Productos, ejecuta el siguiente comando:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Crear una ruta con el plugin de Azure function",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
}
},
"uri": "/products"
}'
Ten en cuenta que establecemos el atributo
ssl_verify
del pluginazure-functions
enfalse
para deshabilitar la verificación SSL solo con fines de demostración. También puedes habilitarlo para realizar solicitudes más seguras desde APISIX a Azure Functions. Aprende otros parámetros de configuración.
Probar con una solicitud curl
Podemos usar curl para enviar una solicitud, viendo si APISIX escucha en la ruta correctamente y reenvía la solicitud al servicio upstream con éxito:
curl -i -XGET http://127.0.0.1:9080/products
HTTP/1.1 200 OK
[
{
"id": 1,
"name": "Product1",
"description": "Description1"
},
{
"id": 2,
"name": "Product2",
"description": "Description2"
}
]
¡Genial! Recibimos una respuesta de la API sin servidor real en Azure Function.
A continuación, haremos una configuración similar para la función de reviews
.
Crear una Ruta para Revisiones y probar
Crea la segunda ruta con el plugin de Azure function habilitado:
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
"ssl_verify": false
}
},
"uri": "/reviews"
}'
Probar la respuesta de la API sin servidor:
curl -i -XGET http://127.0.0.1:9080/reviews
En esta sección, introdujimos la nueva ruta y agregamos el plugin azure-functions
a nuestras API sin servidor para que APISIX pueda invocar funciones remotas de Azure y gestionar el tráfico. En las siguientes secciones, aprenderemos cómo autenticar a los consumidores de API y aplicar políticas en tiempo de ejecución como la limitación de tasa.
Proteger API sin servidor con plugins de autenticación de APISIX
Hasta ahora, nuestras API sin servidor son públicas y accesibles por usuarios no autorizados. En esta sección, habilitaremos la función de autenticación para evitar solicitudes no autorizadas a las API sin servidor.
Apache APISIX puede verificar la identidad asociada con las solicitudes de API a través de la validación de credenciales y tokens. Además, es capaz de determinar qué tráfico está autorizado para pasar a través de la API a los servicios backend. Puedes consultar todos los plugins de autenticación disponibles.
Vamos a crear un nuevo consumidor para nuestras API sin servidor y agregar el plugin basic-auth a la ruta existente para que solo los usuarios permitidos puedan acceder a ellas.
Crear un nuevo consumidor para API sin servidor
El siguiente comando creará nuestro nuevo consumidor con sus credenciales, como nombre de usuario y contraseña:
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "consumer1",
"plugins": {
"basic-auth": {
"username": "username1",
"password": "password1"
}
}
}'
Agregar el plugin basic auth a las rutas existentes de Productos y Servicios
Ahora configuramos el plugin basic-auth
para las rutas para que APISIX verifique el encabezado de la solicitud con las credenciales del consumidor de API cada vez que se llamen las API:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Crear una ruta con el plugin de Azure function",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
},
"basic-auth": {}
},
"uri": "/products"
}'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
"ssl_verify": false
},
"basic-auth": {}
},
"uri": "/reviews"
}'
Probar el plugin basic auth
Ahora, si solicitamos las API sin servidor sin las credenciales del usuario en el encabezado, obtendremos un error de no autorizado:
curl -i http://127.0.0.1:9080/products
HTTP/1.1 401 Unauthorized
{"message":"Falta autorización en la solicitud"}
El resultado es el esperado. Pero si proporcionamos las credenciales correctas del usuario en la solicitud y accedemos al mismo punto final, debería funcionar correctamente:
curl -i -u username1:password1 http://127.0.0.1:9080/products
HTTP/1.1 200 OK
Hemos validado la identidad del cliente que intenta solicitar las API sin servidor utilizando el plugin de autenticación básica con la ayuda de Apache APISIX.
Aplicar políticas de limitación de tasa para API sin servidor
En esta sección, protegeremos las API sin servidor del abuso aplicando una política de limitación de tasa. En Apache APISIX Gateway, podemos aplicar la limitación de tasa para restringir el número de llamadas entrantes.
Aplicar y probar la política de limitación de tasa
Con las configuraciones de ruta existentes para las funciones de Productos y Revisiones seleccionadas, podemos aplicar una política de limitación de tasa con el plugin limit-count para proteger nuestra API del uso anormal. Limitaremos el número de llamadas API a 2 por 60 segundos por consumidor de API.
Para habilitar el plugin limit-count
para la ruta existente de Productos, necesitamos agregar el plugin al atributo de plugins en nuestra configuración de ruta Json:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Crear una ruta con el plugin de Azure function",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
},
"basic-auth": {},
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 403,
"rejected_msg": "Las solicitudes son demasiado frecuentes, por favor inténtalo de nuevo más tarde."
}
},
"uri": "/products"
}'
Apache APISIX manejará las dos primeras solicitudes como de costumbre. Sin embargo, una tercera solicitud en el mismo período devolverá un código 403 HTTP Forbidden
con nuestro mensaje de error personalizado:
HTTP/1.1 403 Forbidden
{"error_msg":"Las solicitudes son demasiado frecuentes, por favor inténtalo de nuevo más tarde."}
Próximos pasos
En este artículo, aprendimos paso a paso cómo crear API sin servidor basadas en Java con Azure Functions y Apache APISIX Gateway para gestionar tus API a lo largo de su ciclo de vida completo, desde exponer las API sin servidor como servicios upstream en APISIX hasta protegerlas adecuadamente y aplicar limitación de tasa para limitar el número de solicitudes. Esto abre las puertas a otros casos de uso de integración de API Gateway y API sin servidor.
Puedes explorar otras capacidades de APISIX Gateway encadenando varios plugins integrados para transformar solicitudes, monitorear la disponibilidad, el rendimiento y el uso de nuestras API sin servidor, almacenar en caché las respuestas de la API y evolucionarlas aún más mediante versionado de API que te ayuda a reducir el tiempo de desarrollo, aumentar la escalabilidad y ahorrar costos.
Apache APISIX es una solución de API Gateway completamente de código abierto. Si necesitas funciones más avanzadas de gestión de API para API sin servidor, puedes usar API7 Enterprise o API7 Cloud que están potenciados por APISIX.
Recursos relacionados
-
Crear una función de Java en Azure usando Visual Studio Code.
-
Ejecutar Apache APISIX en Microsoft Azure Container Instance.