Consideramos qué es IaC (Infraestructura como Código) y por qué deberíamos invertir nuestro tiempo/dinero en ello. Será una charla estilo masterclass y al finalizar, tendrás una infraestructura completa como código para una aplicación React en AWS escrita en TypeScript
Infraestructura como Código para Aplicaciones React en AWS Escritas en TypeScript
Video Summary and Transcription
Esta charla cubre la infraestructura como código utilizando Terraform y CDK. El orador demuestra cómo construir la infraestructura para una aplicación React, incluyendo un bucket S3 y la conexión a un dominio real. También se discute la configuración del comportamiento de la caché, CloudFront y los backends remotos. TypeScript se destaca como un lenguaje poderoso para la infraestructura como código, y se enfatiza la importancia de la automatización y el código bien documentado para infraestructuras a escala global.
1. Introducción a la Infraestructura como Código
Vamos a hablar de infraestructura como código. Mi equipo en The Zone está cambiando la forma en que los fanáticos se involucran con los deportes. Tenemos una amplia gama de infraestructura. Para evitar errores manuales y garantizar la escalabilidad, necesitamos utilizar la infraestructura como código. Hay dos paradigmas de programación: imperativo y declarativo. Terraform, un software de código abierto, admite miles de proveedores y nos permite administrar la infraestructura con código, incluido TypeScript.
Genial. Sí, como dije, ahora vamos a hablar de infraestructura como código. Pero antes, permítanme presentarme y darles un poco de contexto sobre por qué lo necesitamos. ¿Qué está pasando? Genial. Mi nombre es Denys Artyukhovic. Soy el líder del equipo en The Zone. Originalmente, soy de Bielorrusia, pero ahora estoy basado en Londres. Y en The Zone, estamos cambiando todos los aspectos de cómo los fanáticos se involucran con los deportes, desde la distribución de contenido hasta una experiencia verdaderamente inmersiva en tiempo real donde puedes ver datos aumentados para las transmisiones de video. Estamos disponibles en más de 200 países y en varios tipos de dispositivos, incluidos televisores inteligentes, tabletas, computadoras portátiles y, por supuesto, Xbox, PS5 y otras consolas de juegos. Y creo que puedes imaginar la cantidad de infraestructura que tenemos. Y mi equipo ha construido características que son multiplataforma. Están disponibles en la web y en los televisores. Entonces, la respuesta ahora, probablemente sea obvia, pero consideremos el flujo normal de desarrollo de sus aplicaciones. Comenzamos con una característica, o digamos un servicio, luego una nueva y brillante idea llega al escenario y tenemos una característica más, y luego boom, cientos de ellas. Y en nuestro caso, podemos esperar cambios en nuestra infraestructura incluso varias veces al día, y creo que puedes imaginar lo estresante que podría ser si todo fuera manual, porque necesitas replicar algunos cambios manuales, ¿y qué pasa si algunos de los desarrolladores olvidan actualizar la documentación? ¿O qué pasa si la interfaz de usuario misma ha cambiado en nuestro proveedor de la nube, como AWS, y hacemos clic en la casilla de verificación incorrecta y Facebook no está disponible durante unas horas? Así que puede ser realmente estresante, ¿verdad? Para evitar esta situación y solucionar este problema y nunca tener un problema así, nuevamente, necesitamos aprovechar la infraestructura como código. Pero antes de comenzar a hablar sobre la infraestructura en sí, consideremos estos dos paradigmas de programación, ya que son bastante relevantes cuando hablamos de codificación para la infraestructura. Por un lado, tenemos el enfoque imperativo, que se basa en instrucciones explícitas para todo literalmente. Por lo general, nos referimos a algunos scripts de shell, y de hecho, la instrucción explícita es la mayor ventaja de este enfoque. Pero al mismo tiempo, es la mayor preocupación, porque debes mantener todo tú mismo y no es realmente escalable a lo largo del tiempo. Por otro lado, tenemos el enfoque declarativo, que se basa en describir el resultado y dejar que el proveedor haga el resto del trabajo, lo cual es mucho más fácil y mejor para escalar. Entonces, sí, nuevamente, con el enfoque imperativo, eres inteligente y siempre culpas al sistema de que no funciona como esperas, porque escribiste tantas líneas de código. Cuando con el enfoque declarativo, simplemente no te importa hasta que los proveedores inteligentes se encarguen de todo por ti. Y la buena noticia es que Terraform, en realidad, es un software de código abierto. ¿Quién ha trabajado con Terraform antes? Permítanme hacer esta pregunta primero. Sí. Ok. Algunas personas. Increíble. Entonces, Terraform es un software de código abierto que fue desarrollado originalmente por HashiCorp, y admite miles de proveedores diferentes, y nos permite administrar nuestra infraestructura con código, y lo que es más importante para hoy es que también admite TypeScript. O mejor dicho, CDK, que significa
2. Construyendo Infraestructura con Terraform y CDK
Para implementar infraestructura, antes necesitabas aprender un nuevo lenguaje. El lenguaje de Terraform no es complejo y creo que es un cambio de juego. En los próximos 30 minutos, construiremos una infraestructura lista para producción para una aplicación de React, paso a paso. Comenzaremos creando carpetas e instalando CDK. Luego, usaremos React Create App para crear una aplicación básica de React con TypeScript. A continuación, inicializaremos el proyecto con CDK-TF, especificando una plantilla de TypeScript y un backend local. Si encuentras errores de TypeScript, agrega la bandera skip-loop check al archivo ts-config de Terraform.
3. Implementando Infraestructura con S3 Bucket
Vamos a comenzar a implementar nuestra infraestructura utilizando el archivo main.ts. Más adelante, se puede refactorizar. Agregamos el proveedor de AWS a la configuración CDKTF.json y definimos nuestras necesidades de infraestructura. Lo primero que necesitamos es almacenamiento, específicamente un bucket de S3. Creamos el bucket con la configuración deseada, incluido el acceso de lectura público. Después de realizar los cambios necesarios, construimos y sintetizamos los cambios.
Y lo primero que podemos necesitar es almacenamiento, ¿verdad? Necesitamos almacenar nuestra aplicación en algún lugar. No sé cuántos de ustedes han trabajado con buckets de S3 en AWS, pero es solo un simple servicio de almacenamiento que tiene una gran disponibilidad, 99.99%, lo cual es genial, pero para nosotros, lo importante es que lo vamos a usar para almacenar nuestros activos estáticos, ¿de acuerdo? Entonces, para esto, podemos importar el proveedor de AWS y el bucket de S3. Esa va a ser una infraestructura simple que puedes imaginar, y es muy sencilla. Como va a estar lista para producción, más adelante planeo conectar un dominio real y por eso creo que podemos llamar al bucket con el nombre del dominio solo porque es más explícito. Vamos a crear un proveedor. Puedes usar cualquier región que prefieras. Yo voy a usar US-East-1. Solo un dato, para tu bucket, por ejemplo, puedes usar una región europea y EU Central-1, lo que sea. Eso está perfectamente bien, pero ACM, que vamos a usar para los certificados SSL más adelante, requiere la región US-East-1. No tiene nada que ver con cómo codificamos la infraestructura, solo está relacionado con cómo AWS opera. Ellos lo necesitan en sus requisitos. Si vas a crear otra región, simplemente crea la segunda más adelante para ACM. Genial. Estamos creando el bucket de S3, pasando solo el nombre del bucket, pasando el proveedor. Estamos diciendo que será un sitio web con index.html como documento raíz. También estamos especificando la lista de control de acceso como lectura pública, porque ¿a quién le importa la seguridad? Estoy bromeando, lo arreglaremos más adelante. Por ahora, déjalo como público. Tan pronto como hagas estos cambios, solo necesitas construirlos y ejecutar el comando YARN syns
4. Implementando una Aplicación React en un Bucket de S3
Para implementar nuestra aplicación React en el bucket de S3, podemos usar Terraform o el comando AWS S3. Después de la implementación, el sitio estará disponible en la URL del bucket. Sin embargo, para que esté listo para producción, necesitamos conectarlo a un dominio real.
5. Conectando al Dominio Real
Para conectarnos al dominio real, utilizamos Route 53, el servicio DNS de AWS. Las solicitudes de los usuarios pasan a través de la infraestructura de AWS y son interceptadas por Route 53, que las redirige al bucket de S3. Especificamos la zona de Route 53, la creamos y creamos un registro para los subdominios, configurando nuestro bucket como un alias. Después de ejecutar el comando Terraform Apply y esperar la validación, todo estará creado. El dominio se redirigirá a nuestro bucket de S3, pero aún no es seguro y no está listo para producción. Para mejorar el rendimiento, utilizaremos CloudFront y ACM. CloudFront redirige a los usuarios desde Route 53 a la ubicación de borde más cercana, y ACM emite un certificado SSL asociado con nuestro dominio.
6. Configurando el Comportamiento de la Caché y Corrigiendo ACL
No los entiendo completamente. Es solo la forma final de configuración de nuestro estado que estamos tratando de lograr. Vamos a cubrir los métodos get, head y options para el comportamiento de la caché. Pasaremos nuestro certificado SSL y haremos el cambio final en Route 53. Ahora, nuestro sitio se carga más rápido y es más seguro. Necesitamos corregir nuestra ACL de lectura pública utilizando una identidad de acceso de origen. Este es el diagrama de infraestructura final listo para producción.
7. Configurando CloudFront y Backends Remotos
Vamos a tener a Route 53 dirigiendo a ubicaciones de borde previamente. Ahora, vamos a tener CloudFront que va a recuperar objetos para caché. Pero lo que va a cambiar es que en esta ocasión, el bucket de S3 va a tener algunas políticas de bucket específicas asociadas. Y esta política de bucket específica va a verificar que solo las identidades de acceso de origen específicas puedan acceder a ella. Entonces, en este caso, nuestro CloudFront debe tener una identidad de acceso de origen asociada para acceder al bucket de S3. Y, por supuesto, después de este cambio, nuestro bucket no estará disponible públicamente. Para lograr esto, vamos a cambiar el ACL del bucket a privado, crear una identidad de acceso de origen, especificar el documento de política, crear la política del bucket y asociarla con el certificado ACM. Luego podemos eliminar todo del bucket y volver a implementarlo, utilizando el ACL privado predeterminado. El dominio de S3 ya no estará disponible, pero CloudFront y Route 53 funcionarán como se espera. Finalmente, hablemos de los backends remotos. Terraform tiene un concepto de backends, que se utilizan para almacenar el estado de salida. Hay varias opciones de backends, pero dado que estamos utilizando AWS, tiene sentido crear un backend de S3. Necesitamos especificar un bucket, una clave y una región. Una vez que hayamos hecho esto, podemos ejecutar init y elegir copiar el estado existente al backend remoto.
QnA
TypeScript y Infraestructura como Código
TypeScript es más poderoso que el lenguaje de configuración de hash core, proporcionando autocompletado, tipos y otras ventajas. Permite una mejor estructuración y compartición de código, lo que lo hace relevante tanto para desarrolladores frontend como backend. También se puede gestionar la infraestructura de herramientas de monitoreo como New Relic y Sentry con Terraform. Ten en cuenta que, aunque Terraform está maduro, CDK aún está en beta. Los ejemplos de código y recursos adicionales están disponibles en los repositorios proporcionados.
Discusión sobre Infraestructura y Escala Global
La mayoría de nuestras infraestructuras en Dazone se crean con Terraform, pero usamos Azure Corp Configuration Language en lugar de TypeScript. Somos una empresa global con millones de clientes, por lo que la automatización y el código bien documentado son cruciales para nosotros.
Entonces, ¿todo lo que nos mostraste son cosas que también usas en Dazone? Sí, claro, en realidad, la mayoría de nuestras infraestructuras se crean por supuesto con Terraform, pero usamos Azure Corp Configuration Language en lugar de TypeScript, estamos comenzando a adoptar TypeScript, pero como dije, todavía está en fase beta, por lo que debes tener cuidado con esto y debes tener en cuenta las preocupaciones relacionadas con la mantenibilidad si hay cambios significativos relacionados con ello, así que debería ser una llamada de atención.
Eres una empresa global y cualquier cambio es un gran cambio, supongo que es realmente difícil probar cosas a tu escala. Sí, absolutamente, quiero decir, estamos disponibles para millones de clientes en todo el mundo, por lo que para nosotros es cada vez más crucial automatizar todo lo que podamos y documentarlo bien con código, así que pongámoslo así.
Bien, como no tenemos más preguntas en este momento, creo que terminaremos la sesión de preguntas y respuestas o actualizaré si ha habido alguna pregunta en el ínterin. Si recibo algún data. Disculpen a todos los que estaban en línea y tuvieron problemas de audio, no fue desde mi computadora portátil, algo sucedió. Sí, se solucionó en los primeros minutos. Mi data es realmente mala aquí en Londres. Y necesito moderar las preguntas antes de que aparezcan allí y allá. Oh, no te preocupes. Y no tengo data. Pero, sí, Deniz, muchas gracias. Y pasaremos al siguiente ponente entonces. Sí, muchas gracias. Así que todos, un aplauso más para Deniz.