Construyendo un sofisticado CodePipeline con CDK en una configuración de Monorepo

Rate this content
Bookmark

Muchas empresas están adoptando completamente AWS y, por lo tanto, están adoptando su conjunto completo de herramientas de código para sus procesos de CI/CD. Sin embargo, aunque CodePipeline es la plataforma para este proceso, puede que no sea la más fácil de usar. En una configuración de Monorepo, es típico crear múltiples pipelines de CI/CD para cada paquete. Sin embargo, hay varias precauciones que debes tener en cuenta. Por ejemplo, es posible que te encuentres con escenarios en los que se activan múltiples pipelines incluso si solo modificaste un archivo, o puedes cuestionar la necesidad de crear múltiples ramas para cada pipeline. En esta charla, proporcionamos consejos valiosos para construir un sofisticado CodePipeline utilizando CDK en un entorno de Monorepo. Las técnicas discutidas en esta charla también son aplicables a otras herramientas de CI/CD.

John Nguyen
John Nguyen
8 min
15 Feb, 2024

Video Summary and Transcription

Imagina comenzar como ingeniero de DevOps de AWS en una pequeña empresa. Tu jefe quiere un enfoque completo de AWS, con CI/CD completamente en AWS para implementaciones automatizadas. Utiliza AWS CDK para crear un pipeline, etapas y acciones. Aprende cómo manejar múltiples pipelines para diferentes cuentas y cómo aprobar manualmente los entornos de puesta en escena y producción. Descubre cómo activar pipelines con EventBridge y Lambda, y crear pipelines sofisticados para diferentes escenarios.

Available in English

1. Introduction to AWS CDK and Pipeline Creation

Short description:

Imagina comenzar como ingeniero de DevOps de AWS en una pequeña empresa. Tu jefe quiere un enfoque completo de AWS, con CICD completamente en AWS para implementaciones automatizadas. Utiliza AWS CDK para crear una canalización, etapas y acciones. Importa el código desde CodeCommit, crea etapas con la acción de origen de CodeCommit y la acción de fragmento de código. A continuación, implementa en diferentes cuentas de AWS.

Hola. Imagina que comenzaste como ingeniero de DevOps de AWS en una pequeña empresa y tu jefe quiere que vayamos por completo con AWS. Por supuesto, el CICD debe estar completamente en AWS para implementaciones automatizadas. Toda la infraestructura debe estar en código. Y estamos utilizando un monorepo que contiene un backend y frontend, ambos en TypeScript.

Genial. Has estado trabajando con GitLab CI o GitHub Actions donde solo necesitas definir el archivo YAML y crea en la plataforma la canalización por ti. En AWS, es un poco diferente. Cada recurso debes crearlo tú mismo. Por lo tanto, decidiste utilizar AWS CDK porque puedes usar TypeScript. Puedes utilizar las mismas herramientas que los desarrolladores. Puedes poner el código dentro de su monorepo. Y también tienes una buena abstracción, que también puede entender el desarrollador.

Pongamos manos a la obra. Comienzas creando una canalización utilizando esta nueva abstracción de canalización. Y cada canalización de código contiene etapas. Y una etapa contiene acciones. Las acciones generan resultados y producen un artefacto. Este artefacto se puede almacenar en un bucket de S3. Por lo tanto, importas el código desde CodeCommit donde se encuentra alojado el monorepo. Y puedes usarlo para crear tu primera etapa utilizando el comando 'add stage'. Y aquí creas la acción de origen de CodeCommit. Por lo tanto, esto se activará cada vez que ocurra algo en la rama principal. Y creas una segunda etapa utilizando la acción de fragmento de código. Y allí utilizas un proyecto de fragmento de código. Puedes definir cada fase del proyecto de fragmento de código. En este caso, utilizo la fase de construcción, donde quiero instalar el linting y las pruebas unitarias. Y el resultado de esta acción se puede almacenar en esta carpeta en este caso. Y ahora las siguientes etapas son las etapas de implementación. Por lo tanto, deseas implementar en diferentes cuentas de AWS.

2. Handling Multiple Pipelines and Manual Approval

Short description:

Crear múltiples canalizaciones para diferentes cuentas utilizando la abstracción de CDK. Utilizar un método personalizado para la creación de canalizaciones, asumiendo roles e implementando con CDK. Manejar la aprobación manual para los entornos de puesta en escena y producción. Crear canalizaciones separadas para las implementaciones de front-end y back-end. Utilizar variables de entorno para activar la canalización adecuada.

Por lo tanto, creas el bucle de todas las cuentas. Y también puedes hacer uso de la abstracción de CDK. Por lo tanto, puedes crear tu propio método, en este caso, el proyecto de creación de canalización. Entonces, en lugar de usar este código, nuevamente, puedes hacerlo más fácil abstrayéndolo y colocándolo en tu propio método, y luego simplemente hacer uso de cada fase. Primero, asumes el rol y luego utilizas el comando CDK deploy. Y después de eso, después de la implementación, puedes ejecutar pruebas de integración. También puedes utilizar operaciones de mantenimiento. Como puedes ver en los entornos de puesta en escena y producción, tenemos la aprobación manual. Y esta acción de aprobación manual, puedes combinarla con la acción corporativa. Por lo tanto, solo si no está en def, de lo contrario, simplemente omitimos la acción de aprobación manual. Pero cada vez que haya un cambio en el front-end, también se implementará el back-end. Entonces, ¿cómo lo manejas? Para eso, necesitas crear múltiples canalizaciones. Ahora tienes una canalización para el front-end, y otra canalización para el back-end. Este podría ser el código, cómo se ve. Por lo tanto, puedes encontrar múltiples canalizaciones, y puedes manejarlo utilizando variables de entorno.

3. Triggering Pipelines with EventBridge and Lambda

Short description:

Aprende cómo activar las canalizaciones con EventBridge y Lambda. Cada servicio de AWS emite un evento que puede ser capturado utilizando EventBridge. Utiliza una única función Lambda para manejar los eventos y activar las canalizaciones correspondientes. Define las canalizaciones y sus disparadores dentro de la función Lambda. Maneja los cambios de archivos y activa las canalizaciones en consecuencia. Utiliza CDK y métodos de abstracción para una creación eficiente de canalizaciones. Utiliza EventBridge para activar las canalizaciones basadas en eventos como solicitudes de extracción. Crea canalizaciones sofisticadas para diferentes escenarios.

Pero la verdadera pregunta será cuándo activar qué canalización. Y la solución para eso es utilizar EventBridge y Lambda de AWS. Así que debes saber que cada servicio de AWS emite un evento. En este caso, cada vez que algo sucede en el repositorio de código, queremos capturar este evento. Queremos capturarlo utilizando EventBridge. Y queremos decirle a la canalización: `Oye, utiliza EventBridge para emitir este evento`. Y este evento será luego enviado a una función Lambda. Definimos la función Lambda aquí. Con este código, nos aseguramos de tener solo una función Lambda. De lo contrario, crearíamos múltiples funciones Lambda.

Pero con este código, nos aseguramos de tener esta función Lambda solo una vez. La función Lambda utiliza el comando de diferencias de confirmación de código. Así verifica qué archivo ha cambiado y luego activa la canalización en consecuencia. Dentro de la función Lambda, definimos cada canalización. Creamos un objeto donde tenemos la canalización de la pila de front-end, la canalización de la pila de back-end y la canalización de la pila de front-end y back-end. También definimos cuándo se debe activar esta canalización. Aquí definimos la ruta de cada canalización.

Entonces, en este caso, cada vez que cambie un archivo en la carpeta de back-end o cambiemos algo en la pila de back-end, se debe activar la canalización de la pila de back-end. También tenemos la capacidad de tener una carpeta común. Digamos que tienes un paquete que se comparte entre el back-end y el front-end. Y para eso, podemos utilizar el operador de propagación para activar todas las canalizaciones. Utilizamos el SDK de JavaScript para confirmación de código y canalización de código. Y el controlador utiliza el comando de obtener diferencias para obtener todos los cambios de archivos. Luego recorremos cada canalización y recorremos cada ruta de canalización para verificar si el nombre del archivo forma parte del cambio. Y si es así, comenzamos a ejecutar la canalización de código.

Lo que hemos visto aquí es que podemos utilizar CDK para hacer que la canalización de código sea menos complicada. También podemos hacer algo como la ingeniería de plataformas para utilizar la abstracción de manera que cada vez que crees una nueva canalización, puedas utilizar ciertos métodos como el método de creación de proyecto de canalización. Podemos utilizar EventBridge para activar cada canalización en consecuencia. Por lo tanto, también podemos decir que cada vez que haya una nueva solicitud de extracción, activamos la canalización, o hay muchos otros eventos que puedes verificar, puedes encontrar en línea. Y con eso, puedes crear canalizaciones sofisticadas. Gracias. Encontrarás toda la información aquí. También puedes encontrar el repositorio. Y gracias por tu tiempo.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Levelling up Monorepos with npm Workspaces
DevOps.js Conf 2022DevOps.js Conf 2022
33 min
Levelling up Monorepos with npm Workspaces
Top Content
Learn more about how to leverage the default features of npm workspaces to help you manage your monorepo project while also checking out some of the new npm cli features.
End the Pain: Rethinking CI for Large Monorepos
DevOps.js Conf 2024DevOps.js Conf 2024
25 min
End the Pain: Rethinking CI for Large Monorepos
Scaling large codebases, especially monorepos, can be a nightmare on Continuous Integration (CI) systems. The current landscape of CI tools leans towards being machine-oriented, low-level, and demanding in terms of maintenance. What's worse, they're often disassociated from the developer's actual needs and workflow.Why is CI a stumbling block? Because current CI systems are jacks-of-all-trades, with no specific understanding of your codebase. They can't take advantage of the context they operate in to offer optimizations.In this talk, we'll explore the future of CI, designed specifically for large codebases and monorepos. Imagine a CI system that understands the structure of your workspace, dynamically parallelizes tasks across machines using historical data, and does all of this with a minimal, high-level configuration. Let's rethink CI, making it smarter, more efficient, and aligned with developer needs.
AWS Lambda under the hood
Node Congress 2023Node Congress 2023
22 min
AWS Lambda under the hood
Top Content
In this talk I explain how the AWS Lambda service works explaining the architecture, how it scales and how a developer should think about when they design their software using Lambda functions
Federated Microfrontends at Scale
React Summit 2023React Summit 2023
31 min
Federated Microfrontends at Scale
Top Content
The talk will be a story of how Personio went from rendering through a Monolithical PHP architecture, to a microfrontend oriented Next JS app, powered by Module Federation and the NX monorepo toolchain.
Scale Your React App without Micro-frontends
React Summit 2022React Summit 2022
21 min
Scale Your React App without Micro-frontends
As your team grows and becomes multiple teams, the size of your codebase follows. You get to 100k lines of code and your build time dangerously approaches the 10min mark 😱 But that’s not all, your static CI checks (linting, type coverage, dead code) and tests are also taking longer and longer...How do you keep your teams moving fast and shipping features to users regularly if your PRs take forever to be tested and deployed?After exploring a few options we decided to go down the Nx route. Let’s look at how to migrate a large codebase to Nx and take advantage of its incremental builds!
The Age of Monorepos
JSNation 2022JSNation 2022
25 min
The Age of Monorepos
The history of the web can be divided into evolutionary development leaps. The age of inline scripts, the age of jQuery, the age of SPAs, the age of JAMStack...We are now entering the next stage that has been carefully prepared in the past few years. Let me invite you to the world of modern monorepo solutions and share with you the benefits you will reap by using them in every project size and setup. It's time you automate those boilerplate tasks and reduce the bottlenecks so you can focus on what truly matters.Get ready for the next leap! Welcome to the age of monorepos!

Workshops on related topic

React at Scale with Nx
React Summit 2023React Summit 2023
145 min
React at Scale with Nx
Top Content
Featured WorkshopFree
Isaac Mann
Isaac Mann
We're going to be using Nx and some its plugins to accelerate the development of this app.
Some of the things you'll learn:- Generating a pristine Nx workspace- Generating frontend React apps and backend APIs inside your workspace, with pre-configured proxies- Creating shared libs for re-using code- Generating new routed components with all the routes pre-configured by Nx and ready to go- How to organize code in a monorepo- Easily move libs around your folder structure- Creating Storybook stories and e2e Cypress tests for your components
Table of contents: - Lab 1 - Generate an empty workspace- Lab 2 - Generate a React app- Lab 3 - Executors- Lab 3.1 - Migrations- Lab 4 - Generate a component lib- Lab 5 - Generate a utility lib- Lab 6 - Generate a route lib- Lab 7 - Add an Express API- Lab 8 - Displaying a full game in the routed game-detail component- Lab 9 - Generate a type lib that the API and frontend can share- Lab 10 - Generate Storybook stories for the shared ui component- Lab 11 - E2E test the shared component
Node Monorepos with Nx
Node Congress 2023Node Congress 2023
160 min
Node Monorepos with Nx
Top Content
WorkshopFree
Isaac Mann
Isaac Mann
Multiple apis and multiple teams all in the same repository can cause a lot of headaches, but Nx has you covered. Learn to share code, maintain configuration files and coordinate changes in a monorepo that can scale as large as your organisation does. Nx allows you to bring structure to a repository with hundreds of contributors and eliminates the CI slowdowns that typically occur as the codebase grows.
Table of contents:- Lab 1 - Generate an empty workspace- Lab 2 - Generate a node api- Lab 3 - Executors- Lab 4 - Migrations- Lab 5 - Generate an auth library- Lab 6 - Generate a database library- Lab 7 - Add a node cli- Lab 8 - Module boundaries- Lab 9 - Plugins and Generators - Intro- Lab 10 - Plugins and Generators - Modifying files- Lab 11 - Setting up CI- Lab 12 - Distributed caching
Building Serverless Applications on AWS with TypeScript
Node Congress 2021Node Congress 2021
245 min
Building Serverless Applications on AWS with TypeScript
Workshop
Slobodan Stojanović
Slobodan Stojanović
This workshop teaches you the basics of serverless application development with TypeScript. We'll start with a simple Lambda function, set up the project and the infrastructure-as-a-code (AWS CDK), and learn how to organize, test, and debug a more complex serverless application.
Table of contents:        - How to set up a serverless project with TypeScript and CDK        - How to write a testable Lambda function with hexagonal architecture        - How to connect a function to a DynamoDB table        - How to create a serverless API        - How to debug and test a serverless function        - How to organize and grow a serverless application


Materials referred to in the workshop:
https://excalidraw.com/#room=57b84e0df9bdb7ea5675,HYgVepLIpfxrK4EQNclQ9w
DynamoDB blog Alex DeBrie: https://www.dynamodbguide.com/
Excellent book for the DynamoDB: https://www.dynamodbbook.com/
https://slobodan.me/workshops/nodecongress/prerequisites.html
Frontend to the Cloud Made Easy - A ReactJS + AWS Workshop
DevOps.js Conf 2024DevOps.js Conf 2024
59 min
Frontend to the Cloud Made Easy - A ReactJS + AWS Workshop
Workshop
Eyal Keren
Eyal Keren
This workshop enables you to learn how to develop React applications, and then deploy them to the cloud (or building them to the console) coupled with a backend, fully abstracted, with no complex backend configuration, simplifying the building and deployment of frontend & web apps to the cloud.