Implementación del control de versiones de API basado en rutas mediante dominios personalizados en Amazon API Gateway - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implementación del control de versiones de API basado en rutas mediante dominios personalizados en Amazon API Gateway

Corey Schnedl, Marcelo Barbosa, Mario Lopez Martinez, Anbazhagan Ponnuswamy, Gaurav Samudra y Abhilash Vinod, Amazon Web Services

Resumen

Este patrón demuestra cómo puede utilizar la característica de asignación de API de dominios personalizados para implementar una solución de control de versiones de API basado en rutas para Amazon API Gateway.

Amazon API Gateway es un servicio totalmente gestionado que puede utilizar para crear, publicar, mantener, supervisar y proteger APIs a cualquier escala. Al utilizar la función de dominio personalizado del servicio, puede crear nombres de dominio personalizados que sean más sencillos e intuitivos y URLs que pueda proporcionarlos a los usuarios de su API. Puede utilizar las asignaciones de API para conectar etapas de la API a un nombre de dominio personalizado. Después de crear un nombre de dominio y configurar los registros de DNS, utiliza las asignaciones de API para enviarle tráfico a APIs través de su nombre de dominio personalizado.

Cuando una API pasa a estar disponible públicamente, los consumidores la utilizan. A medida que evoluciona una API pública, su contrato de servicio también evoluciona para reflejar las nuevas características y funcionalidades. Sin embargo, no es aconsejable cambiar ni eliminar las características existentes. Cualquier cambio importante podría afectar a las aplicaciones del consumidor y provocar fallos durante el tiempo de ejecución. El control de versiones de las API es importante para evitar interrumpir la compatibilidad con versiones anteriores e infringir un contrato.

Se necesita una estrategia clara de control de versiones de las API para ayudar a los consumidores a adoptarlas. El control de versiones APIs mediante rutas URLs es el enfoque más sencillo y más utilizado. En este tipo de control de versiones, las versiones se definen explícitamente como parte de la API. URIs El siguiente ejemplo URLs muestra cómo un consumidor puede usar el URI para especificar una versión de API para su solicitud:

https://api.example.com/api/v1/orders

https://api.example.com/api/v2/orders

https://api.example.com/api/vX/orders

Este patrón lo utiliza AWS Cloud Development Kit (AWS CDK) para crear, implementar y probar un ejemplo de implementación de una solución de control de versiones escalable basada en rutas para su API. AWS CDK es un marco de desarrollo de software de código abierto para modelar y aprovisionar los recursos de sus aplicaciones en la nube mediante lenguajes de programación conocidos.

Requisitos previos y limitaciones

Requisitos previos

  • Un activo Cuenta de AWS.

  • Se requiere la propiedad de un dominio para usar el repositorio de muestras de este patrón y para usar la funcionalidad de dominios personalizados de Amazon API Gateway. Puede usar Amazon Route 53 para crear y administrar los dominios de su organización. Para obtener información sobre cómo registrar o transferir un dominio con Route 53, consulte Registering new domains en la documentación de Route 53.

  • Antes de configurar un nombre de dominio personalizado para una API, debe disponer de un certificado SSL/TLS listo en AWS Certificate Manager.

  • Debe crear o actualizar el registro de recursos del proveedor de DNS para asignarlo al punto de conexión de la API. Si no se lleva a cabo esta asignación, las solicitudes de API vinculadas al nombre de dominio personalizado no pueden llegar a API Gateway.

Limitaciones

  • Los nombres de dominio personalizados no son compatibles con los nombres de dominio privados APIs.

  • Un nombre de dominio personalizado debe ser único dentro de un Región de AWS todo Cuentas de AWS.

  • Para configurar asignaciones de la API con varios niveles, debe usar un nombre de dominio personalizado regional y usar la política de seguridad de TLS 1.2.

  • En una asignación de API, el nombre de dominio personalizado y el mapeado APIs deben coincidir Cuenta de AWS.

  • Las asignaciones de API deben contener solo letras, números y los siguientes caracteres: $-_.+!*'()/

  • La longitud máxima de la ruta en una asignación de API es de 300 caracteres.

  • Puede tener 200 asignaciones de API con varios niveles para cada nombre de dominio.

  • Solo puede asignar HTTP APIs a un nombre de dominio personalizado regional con la política de seguridad TLS 1.2.

  • No puedes asignarlo WebSocket APIs al mismo nombre de dominio personalizado que una API HTTP o una API REST.

  • Algunas Servicios de AWS no están disponibles en todas Regiones de AWS. Para obtener información sobre la disponibilidad en regiones, consulte AWS Services by Region. Para ver los puntos de conexión específicos, consulte Service endpoints and quotas y elija el enlace del servicio.

Versiones de producto

Arquitectura

En el siguiente diagrama se muestra el flujo de trabajo de la arquitectura.

Flujo de trabajo con asignaciones de API y dominios personalizados para implementar una solución de control de versiones de API basado en rutas.

En el siguiente diagrama se ilustra lo siguiente:

  1. El usuario de la API envía una solicitud a Amazon API Gateway con un nombre de dominio personalizado.

  2. API Gateway dirige dinámicamente la solicitud del usuario a una instancia y etapa adecuadas de API Gateway, según la ruta indicada en la URL de la solicitud. En la siguiente tabla se muestra un ejemplo de cómo se pueden enrutar las distintas rutas basadas en URL a etapas específicas para distintas instancias de API Gateway.

    API

    Etapa

    Ruta

    Punto de conexión predeterminado

    Cálculo APIv1

    api

    apiv1

    Habilitado

    Cálculo APIv2

    api

    apiv2

    Habilitado

    Cálculo APIv X

    api

    apivX

    Habilitado

  3. La instancia de API Gateway de destino procesa la solicitud y devuelve el resultado al usuario.

Automatización y escala

Te recomendamos que utilices AWS CloudFormation pilas independientes para cada versión de la API. Con este enfoque, puedes tener un aislamiento total entre el backend al APIs que se puede enrutar mediante la función de mapeo de API de dominio personalizado. Una ventaja de este enfoque es que se pueden implementar o eliminar diferentes versiones de la API de forma independiente sin que ello suponga el riesgo de modificar otra API. Este enfoque aumenta la resiliencia mediante el aislamiento de las CloudFormation pilas. Además, le proporciona diferentes opciones de back-end para su API AWS Lambda AWS Fargate, como los puntos finales HTTP y las acciones de. Servicios de AWS

Puedes usar estrategias de ramificación de Git, como Gitflow, en combinación con CloudFormation pilas aisladas para administrar el código fuente que se implementa en las diferentes versiones de la API. Al usar esta opción, puede mantener diferentes versiones de su API sin necesidad de duplicar el código fuente para las nuevas versiones. Con Gitflow, puede agregar etiquetas a las confirmaciones dentro de su repositorio de Git a medida que se vayan llevando a cabo los lanzamientos. Como resultado, tiene una instantánea completa del código fuente en relación con un lanzamiento específico. Como es necesario realizar actualizaciones, puedes consultar el código de una versión específica, realizar actualizaciones y, después, implementar el código fuente actualizado en la CloudFormation pila que se ajuste a la versión principal correspondiente. Este enfoque reduce el riesgo de interrumpir otra versión de la API, ya que cada versión de la API tiene un código fuente aislado y se implementa en CloudFormation pilas independientes.

Tools (Herramientas)

Servicios de AWS

  • Amazon API Gateway le ayuda a crear, publicar, mantener, supervisar y proteger REST, HTTP y WebSocket APIs a cualquier escala.

  • AWS Certificate Manager (ACM) le ayuda a crear, almacenar y renovar claves y certificados SSL/TLS X.509 públicos y privados que protegen sus AWS sitios web y aplicaciones.

  • AWS Cloud Development Kit (AWS CDK)es un marco de desarrollo de software de código abierto para definir su infraestructura de nube en código y aprovisionarla mediante ella. CloudFormationEl ejemplo de implementación de este patrón utiliza el AWS CDK in. TypeScript Para trabajar con AWS CDK in se TypeScript utilizan herramientas conocidas, como el TypeScript compilador de Microsoft (tsc), Node.js y el administrador de paquetes de nodos (npm). Si lo prefiere, puede usar Yarn, aunque en los ejemplos de este patrón se utiliza npm. Los módulos que componen la Biblioteca de constructos de AWS se distribuyen a través del repositorio npm , npmjs.org.

  • CloudFormationle ayuda a configurar AWS los recursos, aprovisionarlos de forma rápida y coherente y administrarlos durante todo su ciclo de vida en Cuentas de AWS y Regiones de AWS.

  • AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

  • Amazon Route 53 es un servicio web de sistema de nombres de dominio (DNS) escalable y de alta disponibilidad.

  • AWS WAF es un firewall de aplicación web que lo ayuda a supervisar las solicitudes HTTP y HTTPS que se reenvían a los recursos de su aplicación web protegida.

Otras herramientas

  • Bruno es un cliente de pruebas de API de código abierto y compatible con Git.

  • cdk-nag es una utilidad de código abierto que comprueba AWS CDK las mejores prácticas en las aplicaciones mediante paquetes de reglas.

Repositorio de código

El código de este patrón está disponible en el repositorio -api-gateway. GitHub path-based-versioning-with

Prácticas recomendadas

  • Utilice una sólida canalización de integración y entrega continuas (CI/CD) para automatizar las pruebas y el despliegue de las CloudFormation pilas creadas con. AWS CDK Para obtener más información relacionada con esta recomendación, consulte la Guía de AWS DevOps Well-Architected.

  • AWS WAF es un firewall gestionado que se integra fácilmente con servicios como Amazon API Gateway. Si bien AWS WAF no es un componente necesario para que este patrón de control de versiones funcione, recomendamos incluirlo en API Gateway como práctica recomendada AWS WAF de seguridad.

  • Anime a los consumidores de la API a que actualicen periódicamente a la versión más reciente de su API para que las versiones anteriores queden obsoletas y se eliminen de forma eficiente.

  • Antes de utilizar este enfoque en un entorno de producción, implemente una estrategia de firewall y autorización para su API.

  • Implemente el acceso a la administración de sus AWS recursos Cuenta de AWS mediante el modelo de acceso con privilegios mínimos.

  • Para aplicar las mejores prácticas y las recomendaciones de seguridad para las aplicaciones creadas con él AWS CDK, le recomendamos que utilice la utilidad cdk-nag.

Epics

TareaDescripciónHabilidades requeridas

Clonar el repositorio.

Para clonar el repositorio de la aplicación de ejemplo, ejecute el siguiente ejemplo:

git clone https://github.com/aws-samples/path-based-versioning-with-api-gateway
Desarrollador de aplicaciones

Navegue hasta el repositorio clonado.

Para ir a la ubicación de la carpeta del repositorio clonado, ejecute el siguiente comando:

cd api-gateway-custom-domain-versioning
Desarrollador de aplicaciones

Instale las dependencias requeridas.

Para instalar las dependencias necesarias, ejecute el siguiente comando:

npm install
Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Iniciar la implementación de la pila de enrutamiento.

Para iniciar la implementación de la pila de CloudFormation enrutamientoCustomDomainRouterStack, ejecute el siguiente comando y example.com sustitúyalo por el nombre del dominio que posee:

npx cdk deploy CustomDomainRouterStack --parameters PrerequisiteDomainName=example.com
nota

La implementación de la pila no se llevará a cabo correctamente hasta que la siguiente tarea de validación del DNS del dominio se efectúe correctamente.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Verificar la propiedad de su dominio.

El certificado permanecerá en estado Pendiente de validación hasta que demuestre la propiedad del dominio asociado.

Para demostrar la propiedad, agregue registros CNAME a la zona alojada asociada al dominio. Para obtener más información, consulte la validación de DNS en la AWS Certificate Manager documentación.

Agregar los registros adecuados permite que la implementación de CustomDomainRouterStack se lleve a cabo correctamente.

Desarrollador de aplicaciones, administrador de sistemas de AWS, administrador de redes

Crear un registro de alias que apunte a su dominio personalizado de API Gateway.

Una vez que el certificado se haya emitido y validado correctamente, cree un registro de DNS que apunte a la URL del dominio personalizado de Amazon API Gateway.

La URL del dominio personalizado se genera exclusivamente mediante el aprovisionamiento del dominio personalizado y se especifica como parámetro de CloudFormation salida. A continuación, se muestra un ejemplo del registro:

Política de enrutamiento: enrutamiento sencillo

Nombre del registro: demo.api-gateway-custom-domain-versioning.example.com

Alias: sí

Tipo de registro: registro DNS de tipo «A» que apunta a un AWS recurso

Valor: d-xxxxxxxxxx.execute-api.xx-xxxx-x.amazonaws.com

TTL (segundos): 300

Desarrollador de aplicaciones, administrador de sistemas de AWS, administrador de redes
TareaDescripciónHabilidades requeridas

Implemente la pila de ApiStackV1.

Para implementar la pila de ApiStackV1, use el siguiente comando:

npm run deploy-v1

El siguiente código de CDK agrega la asignación de API:

var apiMapping = new CfnApiMapping(this, "ApiMapping", { apiId: this.lambdaRestApi.restApiId, domainName: props.customDomainName.domainName, stage: "api", apiMappingKey: "api/v1", });
Desarrollador de aplicaciones

Implemente la pila de ApiStackV2.

Para implementar la pila de ApiStackV2, use el siguiente comando:

npm run deploy-v2
Desarrollador de aplicaciones

Invoque la API .

Para invocar la API y probar los puntos de conexión de la API mediante Bruno, consulte las instrucciones de Información adicional.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Eliminación de recursos.

Para destruir los recursos asociados a esta aplicación de ejemplo, utilice el comando siguiente:

npx cdk destroy --all
nota

Asegúrese de limpiar todos los registros de DNS de Route 53 que se hayan agregado manualmente para el proceso de verificación de la propiedad del dominio.

Desarrollador de aplicaciones

Resolución de problemas

ProblemaSolución

La implementación de CustomDomainRouterStack agota el tiempo de espera porque el certificado no se puede validar.

Asegúrese de haber agregado los registros CNAME de validación de DNS adecuados, tal como se describió en la tarea anterior. El nuevo certificado podría continuar mostrando el estado Pendiente de validación durante un máximo de 30 minutos después de agregar los registros de validación de DNS. Para obtener más información, consulta la validación de DNS en la AWS Certificate Manager documentación.

Recursos relacionados

Información adicional

Prueba de la API con Bruno

Le recomendamos que utilice Bruno, una herramienta de prueba de API de código abierto, para comprobar que el enrutamiento basado en rutas funciona correctamente en la aplicación de ejemplo. Este patrón proporciona una colección de ejemplo para facilitar las pruebas de la API de ejemplo.

Para invocar y probar la API, use los siguientes pasos:

  1. Instale Bruno.

  2. Abra Bruno.

  3. En el repositorio de código de este patrón, selecciona Bruno/Sample-API- Gateway-Custom-Domain-Versioning y abre la colección.

  4. Para ver el menú desplegable Entornos en la parte superior derecha de la interfaz de usuario (UI), seleccione cualquier solicitud de la colección.

  5. En el menú desplegable Entornos, seleccione Configurar.

  6. Sustituya el valor de REPLACE_ME_WITH_YOUR_DOMAIN por su dominio personalizado.

  7. Elija Guardar y, a continuación, cierre la sección Configuración.

  8. En Entorno de pruebas, compruebe que esté seleccionada la opción Activo.

  9. Invoque su API mediante el botón -> de la solicitud seleccionada.

  10. Observe cómo se gestiona la validación (pasando valores no numéricos) en V1 en comparación con V2.

Para ver capturas de pantalla de ejemplos de invocación de la API y una comparación de las validaciones de V1 y V2, consulte Testing your sample API en el archivo README.md del repositorio de código de este patrón.