Explore el desarrollo completo de aplicaciones web nativas en la nube con Green Boost - Recomendaciones de AWS

Explore el desarrollo completo de aplicaciones web nativas en la nube con Green Boost

Ben Stickley y Amiin Samatar, Amazon Web Services

Resumen

En respuesta a las necesidades cambiantes de los desarrolladores, Amazon Web Services (AWS) reconoce la demanda crítica de un enfoque eficiente para desarrollar aplicaciones web nativas en la nube. El objetivo de AWS es ayudarlo a superar los obstáculos comunes asociados con la implementación de aplicaciones web en la nube de AWS. Al aprovechar las capacidades de tecnologías modernas como TypeScript, AWS Cloud Development Kit (AWS CDK), React y Node.js, este patrón tiene como objetivo agilizar y acelerar el proceso de desarrollo.

Basado en el kit de herramientas Green Boost (GB), el patrón ofrece una guía práctica para crear aplicaciones web que utilicen al máximo las amplias capacidades de AWS. Actúa como una hoja de ruta integral que lo guía a través del proceso de implementación de una aplicación web CRUD (creación, lectura, actualización, eliminación) fundamental integrada con la edición compatible con Amazon Aurora PostgreSQL. Esto se logra mediante el uso de la interfaz de la línea de comandos de Green Boost (CLI de Green Boost) y el establecimiento de un entorno de desarrollo en las instalaciones.

Tras la implementación exitoso de la aplicación, el patrón profundiza en los componentes clave de la aplicación web, como el diseño de la infraestructura, el desarrollo del backend y el frontend, y en herramientas esenciales como cdk-dia para la visualización, lo que facilita la gestión eficiente de los proyectos.

Requisitos previos y limitaciones

Requisitos previos

Versiones de producto

  • AWS SDK para JavaScript versión 3

  • AWS CDK versión 2

  • CLI de AWS versión 2.2

  • Node.js versión 18

  • React versión 18

Arquitectura

Pila de tecnología de destino

  • Edición de Amazon Aurora compatible con PostgreSQL

  • Amazon CloudFront

  • Amazon CloudWatch

  • Amazon Elastic Compute Cloud (Amazon EC2)

  • AWS Lambda

  • AWS Secrets Manager

  • Amazon Simple Notification Service (Amazon SNS)

  • Amazon Simple Storage Service (Amazon S3)

  • AWS WAF

Arquitectura de destino

El siguiente diagrama muestra que las solicitudes de los usuarios pasan por Amazon CloudFront, AWS WAF y AWS Lambda antes de interactuar con un bucket de S3, una base de datos de Aurora o una instancia de EC2 y, finalmente, llegar a los desarrolladores. Los administradores, por otro lado, utilizan Amazon SNS y Amazon CloudWatch con fines de notificación y supervisión.

Proceso de implementación de una aplicación web CRUD integrada con Amazon Aurora PostgreSQL mediante la CLI de Green Boost.

Para obtener una visión más profunda de la aplicación tras su implementación, puede crear un diagrama con cdk-dia, como se muestra en el siguiente ejemplo.

El primer diagrama muestra una vista centrada en el usuario; el diagrama cdk-dia muestra una vista de la infraestructura técnica.

Estos diagramas muestran la arquitectura de la aplicación web desde dos ángulos distintos. El diagrama cdk-dia ofrece una vista técnica detallada de la infraestructura de CDK de AWS y destaca servicios específicos de AWS, como Amazon Aurora, compatible con PostgreSQL, y AWS Lambda. Por el contrario, el otro diagrama adopta una perspectiva más amplia y hace hincapié en el flujo lógico de los datos y las interacciones de los usuarios. La diferencia clave reside en el nivel de detalle: el cdk-dia profundiza en las complejidades técnicas, mientras que el primer diagrama ofrece una visión más centrada en el usuario.

La creación del diagrama cdk-dia se describe en la epopeya Comprenda la infraestructura de aplicaciones mediante AWS CDK.

Herramientas

Servicios de AWS

  • La edición de Amazon Aurora compatible con PostgreSQL es un motor de base de datos relacional compatible con ACID, completamente administrado que le permite configurar, utilizar y escalar implementaciones de PostgreSQL.

  • AWS Cloud Development Kit (AWS CDK) es un marco de desarrollo de software que lo ayuda a definir y aprovisionar la infraestructura de la nube de AWS en código.

  • La Interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en el intérprete de comandos de la línea de comandos.

  • Amazon CloudFront acelera la distribución del contenido web distribuyéndolo a través de una red mundial de centros de datos, lo que reduce la latencia y mejora el rendimiento.

  • Amazon CloudWatch le ayuda a monitorizar las métricas de sus recursos de AWS y las aplicaciones que se ejecutan en AWS en tiempo real.

  • Amazon Elastic Compute Cloud (Amazon EC2) proporciona capacidad de computación escalable en la nube de AWS. Puede lanzar tantos servidores virtuales como necesite y escalarlos o reducirlos con rapidez.

  • 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.

  • AWS Secrets Manager le permite reemplazar las credenciales codificadas en el código, incluidas las contraseñas, con una llamada a la API de Secrets Manager para recuperar el secreto mediante programación.

  • AWS Systems Manager le permite administrar las aplicaciones y la infraestructura que se ejecutan en la nube de AWS. Simplifica la administración de aplicaciones y recursos, reduce el tiempo requerido para detectar y resolver problemas operativos y ayuda a utilizar y administrar los recursos de AWS a escala de manera segura. Este patrón utiliza el administrador de sesiones de AWS Systems Manager.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le permite almacenar, proteger y recuperar cualquier cantidad de datos. Amazon Simple Notification Service (Amazon SNS) le permite coordinar y administrar el intercambio de mensajes entre publicadores y clientes, incluidos los servidores web y las direcciones de correo electrónico.

  • AWS WAF es un firewall de aplicación web que le permite monitorizar las solicitudes HTTP y HTTPS que se reenvíen a los recursos de su aplicación web protegida

Otras herramientas

  • Git es un sistema de control de versiones distribuido y de código abierto.

  • Green Boost es un conjunto de herramientas para crear aplicaciones web en AWS.

  • Next.js es un marco de React para añadir funciones y optimizaciones.

  • Node.js es un entorno de tiempo de ejecución de JavaScript basado en eventos y diseñado para crear aplicaciones de red escalables.

  • pgAdmin es una herramienta de gestión de código abierto para PostgreSQL. Proporciona una interfaz gráfica que permite crear, mantener y utilizar objetos de bases de datos.

  • pnpm es un administrador de paquetes para las dependencias del proyecto Node.js.

Prácticas recomendadas

Consulte la sección Epics para obtener más información sobre las siguientes recomendaciones:

  • Supervise la infraestructura mediante paneles y alarmas de Amazon CloudWatch.

  • Aplique las prácticas recomendadas de AWS mediante cdk-nag para ejecutar análisis estáticos de infraestructura como código (IaC).

  • Establezca el reenvío de puertos de base de datos a través de túneles SSH (Secure Shell) con Systems Manager Session Manager, que es más seguro que tener una dirección IP expuesta públicamente.

  • Gestione las vulnerabilidades ejecutando pnpm audit.

  • Aplique las prácticas recomendadas utilizando ESLint para realizar análisis estáticos de código TypeScript y Prettier para estandarizar el formato del código.

Epics

TareaDescripciónHabilidades requeridas

Instale la CLI de Green Boost.

Para instalar Green Boost CLI, ejecute el siguiente comando.

pnpm add -g gboost
Desarrollador de aplicaciones

Cree una aplicación GB.

  1. Para crear una aplicación mediante Green Boost, ejecute el comando gboost create.

  2. Elige la plantilla CRUD App with Aurora PostgreSQL.

Desarrollador de aplicaciones

Instale las dependencias e implemente la aplicación.

  1. Desplácese hasta el directorio del proyecto: cd <your directory>.

  2. Utilice el comando pnpm i para instalar las dependencias.

  3. Vaya al directorio infra: cd infra.

  4. Para implementar la aplicación, ejecute el siguiente comando pnpm deploy:local.

    Se trata de un alias para un comando cdk deploy ... definido en infra/package.json.

Espere a que finalice la implementación (aproximadamente 20 minutos). Mientras espera, supervise las pilas de AWS CloudFormation en la consola de CloudFormation. Observe cómo las estructuras definidas en el código se corresponden con el recurso implementado. Revise la vista en árbol de CDK Construct en la consola de CloudFormation.

Desarrollador de aplicaciones

Accede a la aplicación.

Tras implementar la aplicación GB de forma en las instalaciones, puede acceder a ella mediante la URL de CloudFront. La URL se imprime en la salida del terminal, pero encontrarla puede resultar un poco abrumador. Siga los pasos siguientes para encontrarlo rápidamente:

  1. Abra la terminal en la que ejecutó el comando pnpm deploy:local.

  2. Busque una sección en la salida del terminal que se parezca al texto siguiente.

    myapp5stickbui9C39A55A.CloudFrontDomainName = d1q16n5pof924c.cloudfront.net

    La URL será exclusiva para la implementación.

Como alternativa, puede encontrar la URL de CloudFront accediendo a la consola de Amazon CloudFront:

  1. Inicie sesión en la consola de administración de AWS y vaya al servicio de CloudFront.

  2. Busque la última distribución implementada en la lista.

Copie el nombre de dominio asociado a la distribución. Tendrá un aspecto similar a your-unique-id.cloudfront.net.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Vea el panel de CloudWatch.

  1. Abra la consola de CloudWatch y elija Paneles.

  2. Seleccione el panel que tiene el nombre <appId>-<stageName>-dashboard.

  3. Revise el panel. ¿Qué recursos se están supervisando? ¿Qué métricas se registran? Este panel es posible gracias al constructo de código abierto cdk-monitoring-constructs.

Desarrollador de aplicaciones

Habilitar de alertas.

Un panel de CloudWatch le ayuda a supervisar activamente su aplicación web. Para supervisar de forma pasiva su aplicación web, puede activar las alertas.

  1. Navegue hasta /infra/src/app/stateless/monitor-stack.ts, que define la pila de monitores.

  2. Elimine los comentarios de la siguiente línea y sustituya admin@example.com por su dirección de correo electrónico.

    onAlarmTopic.addSubscription(new EmailSubscription("admin@example.com"));
  3. Añada la información siguiente sobre las importaciones a la parte superior del archivo.

    import { EmailSubscription } from "aws-cdk-lib/aws-sns-subscriptions";
  4. En infra/, ejecute el siguiente comando.

    cdk deploy "*/monitor" --exclusively.
  5. Para confirmar su suscripción al tema de SNS que se inicia cuando se activa una alarma de monitorización, elija el enlace del mensaje de correo electrónico.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree un diagrama de arquitectura.

Genere un diagrama de arquitectura de su aplicación web mediante cdk-dia. La visualización de la arquitectura ayuda a mejorar la comprensión y la comunicación entre los miembros del equipo. Proporciona una visión general clara de los componentes del sistema y sus relaciones.

  1. Instale Graphviz.

  2. En infra/, ejecute el comando pnpm cdk-dia.

  3. Ver su infra/diagram.png.

Desarrollador de aplicaciones

Use cdk-nag para aplicar las prácticas recomendadas.

Utilice cdk-nag para ayudarle a mantener una infraestructura segura y que cumpla con las normas, aplicando las prácticas recomendadas y reduciendo el riesgo de vulnerabilidades de seguridad y errores de configuración.

  1. Conozca las prácticas recomendadas de cdk-nag en su sección de reglas, que incluye las comprobaciones del paquete de reglas de la biblioteca de soluciones de AWS.

  2. Para ver cómo cdk-nag aplica las reglas, realice un cambio en el código. Por ejemplo, en infra/src/app/stateful/data-stacks.ts, cambie storageEncrypted: true a storageEncrypted: false.

  3. En infra/, ejecute el comando cdk synth "*/data". Durante la síntesis, se producirá un error de compilación que indica una infracción de la regla.

    AwsSolutions-RDS2: The RDS instance or Aurora DB cluster does not have storage encryption enabled.

    Este error muestra cómo cdk-nag es un mecanismo de seguridad para aplicar las prácticas recomendadas de infraestructura y evitar errores de configuración de seguridad.

  4. Si es necesario, también puede suprimir las reglas en diferentes ámbitos. Por ejemplo, para suprimir AWSSolutions-RDS2, añada el siguiente código debajo de la instancia de DbIamCluster.

    NagSuppressions.addResourceSuppressions( cluster.node.findChild("Resource"), [ { id: "AwsSolutions-RDS2", reason: "Customer requirement necessitates having unencrypted DB storage", }, ], );
  5. Tras la supresión, vuelva a ejecutar cdk synth "*/data". Su aplicación AWS CDK ahora debería sintetizarse correctamente. Puede encontrar todas las reglas suprimidas en infra/cdk.out/assembly-<appId>-<stageName>/AwsSolutions-<appId>-<stageName>-${stackId}-NagReport.csv.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Adquiera variables de entorno.

Para obtener las variables de entorno requeridas, siga los siguientes pasos:

  1. Para encontrar el DB_BASTION_ID, inicie sesión en la consola y navegue hasta la consola EC2. Elija Instancias (en ejecución) y busque la fila que contiene <stageName>-ssm-db-bastion Name. El Identificador de instancia comienza por i-.

  2. Para buscar DB_ENDPOINT, en la consola de Amazon Relational Database Service (Amazon RDS), elija Instancias de base de datos y seleccione el clúster regional que tiene un identificador de base de datos que comience por <appId>-<stageName>-data-. Localice el punto de conexión de la instancia de escritura, que termina en rds.amazonaws.com.

Desarrollador de aplicaciones

Establezca el reenvío de puertos.

Para establecer el reenvío de puertos, siga estos pasos:

  1. Instale el complemento Administrador de sesiones de AWS Systems Manager.

  2. Inicie el reenvío de puertos ejecutando pnpm db:connect dentro de core/ para establecer una conexión segura a través del host bastión.

  3. Cuando vea el texto Waiting for connections..., en su terminal, significa que se ha establecido correctamente un túnel SSH entre su máquina local y el servidor Aurora a través del host bastión de EC2.

Desarrollador de aplicaciones

Ajuste el tiempo de espera del Administrador de sesiones de Systems Manager.

(Opcional) Si el tiempo de espera predeterminado de la sesión de 20 minutos es demasiado corto, puede aumentarlo hasta 60 minutos en la consola de Systems Manager seleccionando Administrador de sesiones, Preferencias, Editar, Tiempo de espera de sesión inactiva.

Desarrollador de aplicaciones

Visualice la base de datos.

pgAdmin es una herramienta de código abierto fácil de usar para administrar bases de datos PostgreSQL. Simplifica las tareas de las bases de datos, lo que le permite crear, administrar y optimizar las bases de datos de manera eficiente. Esta sección le guía a través de la instalación de pgAdmin y el uso de sus funciones para la administración de bases de datos PostgreSQL.

  1. En el Explorador de objetos, abra el menú contextual (haga clic con el botón derecho) de Servidores y, a continuación, seleccione Registrar, Servidor.

  2. En la pestaña General, escriba <appId>-<stageName> para el campo Nombre.

  3. Para obtener la contraseña de la base de datos, abra la consola de AWS Secrets Manager, seleccione el secreto que contenga la descripción Generated by the CDK for the stack: <appId>-<stageName>-data y elija la tarjeta Valor secreto. Seleccione Recuperar Valor secreto y copie el Valor secreto con una clave o contraseña.

  4. En la pestaña Conexión, introduzca 0.0.0 para el campo Nombre/dirección del host y <appId>_admin para el campo Nombre de usuario. Para el campo Contraseña, use el secreto que obtuvo anteriormente. Seleccione en el campo ¿Guardar contraseña?.

  5. Seleccione Save.

  6. Para ver las tablas, vaya a <appId>-<stageName>, Bases de datos, <appId>_db, Esquemas, <appId>, Tablas.

  7. Abra el menú contextual (haga clic con el botón derecho) de la tabla de Elementos y, a continuación, seleccione Ver/editar datos, Todas las filas.

  8. Explore la tabla.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Depura el caso práctico de creación de objetos.

Para depuración del caso práctico de creación de elementos, siga estos pasos:

  1. Abra el archivo core/src/modules/item/create-item.use-case.ts e inserte el siguiente código.

    import { fileURLToPath } from "node:url"; // existing create-item.use-case.ts code here if (process.argv[1] === fileURLToPath(import.meta.url)) { createItemUseCase({ description: "Item 1's Description", name: "Item 1", }); }
  2. El código agregado en el paso anterior garantiza que se llame a la función de createItemUseCase cuando este módulo se ejecute directamente. Establezca puntos de interrupción en las líneas de este bloque de código donde desee iniciar la depuración línea por línea.

  1. Abra la Terminal de depuración de JavaScript de VS Code y, a continuación, ejecute pnpm tsx core/src/modules/item/create-item.use-case.ts para ejecutar el código con la depuración línea por línea. Como alternativa, puede usar sentencias e console.log, pero las instrucciones impresas pueden resultar inadecuadas cuando trabajas con una lógica empresarial compleja. La depuración línea por línea proporciona más contexto.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Configure el servidor de desarrollo.

  1. Navegue hasta ui/ y ejecute pnpm dev para iniciar el servidor de desarrollo Next.js.

  2. Acceda a su aplicación web de forma local en http://localhost:3000. El servidor de desarrollo Next.js está configurado con información instantánea de Fast Refresh sobre las modificaciones realizadas en sus componentes de React.

  3. Experimente con la personalización del color de la barra de la aplicación. Abre el archivo ui/src/components/theme/theme.tsx y busque la sección que define el tema de la barra de la aplicación. En la sección colorSchemes.light.palette.primary, actualice el valor principal de colors.lagoon a colors.carrot. Tras realizar este cambio, guarde el archivo y observe la actualización en su navegador.

  4. Experimente modificando el texto y los componentes y añadiendo nuevas páginas.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Configure monorepo y el administrador de paquetes pnpm.

  1. Revise pnpm-workspace.yaml en la raíz de su repositorio de GB y observe cómo se definen los espacios de trabajo. Para obtener más información sobre espacios de trabajo, consulte la documentación de pnpm.

  2. Revise ui/package.json y observe cómo hace referencia al espacio de trabajo core/ con el nombre de paquete "<appId>/core": "workspace:^",.

  3. Observe cómo la configuración de TypeScript y ESLint está centralizada en los paquetes de utilidades definidos en packages/. Esta configuración es utilizada luego por paquetes de aplicaciones como core/, infra/ y ui/. Esto resulta útil cuando la aplicación se escala y se definen más paquetes de aplicaciones, que pueden hacer referencia a los paquetes de utilidades sin duplicar el código de configuración.

Desarrollador de aplicaciones

Ejecute scripts pnpm.

Ejecute los siguientes comandos en la raíz de su repositorio:

  1. Ejecuta pnpm lint. Este comando ejecuta un análisis de código estático con ESLint.

  2. Ejecuta pnpm typecheck. Este comando ejecuta el compilador de TypeScript para comprobar los tipos de código.

  3. Ejecuta pnpm test. Este comando ejecuta Vitest para ejecutar pruebas unitarias.

Observe cómo se ejecutan estos comandos en todos los espacios de trabajo. Los comandos se definen en el campo package.json#scripts de cada espacio de trabajo.

Desarrollador de aplicaciones

Utilice ESLint para el análisis de código estático.

Para probar la capacidad de análisis de código estático de ESLint, haga lo siguiente:

  1. Primero, asegúrese de que la extensión ESLint de VS Code (ID: dbaeumer.vscode-eslint) esté instalada. También recomendamos instalar VS Code Error Lens (ID: usernamehw.errorlens) para ver los errores en línea.

  2. Incluya en el código una línea de código que utilice la función eval() como se muestra en el siguiente ejemplo.

    const userInput = "import("fs").then((fs) => console.log(fs.readFileSync("/etc/passwd", { encoding: "utf8" })))"; eval(userInput);
    importante

    Esto es solo con fines de prueba. Usar eval() se considera potencialmente peligroso y debe evitarse debido a los riesgos de seguridad.

  3. Después de incluir la línea eval(), abra su editor de código para confirmar que ESLint indicó el olor del código con garabatos rojos.

  4. Revise los complementos y la configuración de ESLint en packages/eslint-config-{node,next}/.eslintrc.cjs.

Desarrollador de aplicaciones

Gestione las dependencias y vulnerabilidades.

  1. Para identificar cualquier vulnerabilidad y exposición común (CVE), ejecute pnpm audit en la raíz de su repositorio.

    Debería ver No se ha encontrado ninguna vulnerabilidad conocida.

  2. Instale un paquete intencionalmente vulnerable en core/ al ejecutar pnpm add minimist@0.2.3 y, a continuación, ejecute pnpm audit. Observe cómo se informa de la vulnerabilidad.

  3. Desinstale el paquete vulnerable que contiene core/ pnpm remove minimistal ejecutar .

Desarrollador de aplicaciones

Precomete los enlaces con Husky.

  1. Realiza un par de pequeños cambios en los archivos de TypeScript en todo el repositorio. Los cambios pueden ser tan básicos como añadir comentarios.

  2. Organice y confirme estos cambios utilizando git add -A y, a continuación, git commit -m "test husky".

    El activador del enlace Husky previo a la confirmación, que se define en .husky/pre-commit, ejecuta el comando pnpm lint-staged.

  3. Observe cómo lint-staged ejecuta los comandos especificados en los archivos */.lintstagedrc.js de todo el repositorio en archivos que Git ha preparado.

Estas herramientas son mecanismos que ayudan a evitar que el código incorrecto llegue a su aplicación.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Elimine la implementación de su cuenta.

  1. Para destruir la infraestructura que aprovisionó en la primera epopeya, ejecute pnpm destroy:local en infra/.

  2. Espere 15 minutos después de que pnpm destroy:local haya finalizado y, a continuación, elimine la función de Lambda @Edge retenida buscando el identificador de su aplicación en la consola de Lambda. Las funciones Lambda @Edge se replican, lo que dificulta su eliminación. Para obtener más información sobre cómo eliminar funciones de Lambda @Edge, consulte la documentación de CloudFront.

Desarrollador de aplicaciones

Solución de problemas

ProblemaSolución

No se pudo establecer el reenvío de puertos

Asegúrese de que sus credenciales de AWS estén configuradas correctamente y tengan los permisos necesarios.

Compruebe que las variables de entorno del identificador de host bastión (DB_BASTION_ID) y del punto de conexión de la base de datos (DB_ENDPOINT) estén configuradas correctamente.

Si sigue teniendo problemas, consulte la documentación de AWS para solucionar problemas de conexiones SSH y Administrador de sesiones.

Sitio web no está cargando en localhost:3000

Confirme que la salida del terminal indica que el reenvío de puertos se ha realizado correctamente, incluida la dirección de reenvío.

Asegúrese de que no haya procesos conflictivos al utilizar el puerto 3000 de su máquina en las instalaciones.

Compruebe que la aplicación Green Boost esté correctamente configurada y ejecutándose en el puerto esperado (3000).

Compruebe en su navegador web si hay extensiones o ajustes de seguridad que puedan bloquear las conexiones en las instalacioneses.

Mensajes de error durante la implementación local (pnpm deploy:local)

Revise los mensajes de error detenidamente para identificar la causa del problema.

Compruebe que las variables de entorno y los archivos de configuración necesarios estén configurados correctamente.

Recursos relacionados