Chessy - Parte 5
Otro post sobre Chessy, aplicación para reproducir partidas de ajedrez. Durante este tiempo han sucedido varias cosas tipo random: disfruté (y sufrí) los primeros pasos con SwiftUI, aprendí algo sobre animaciones, arreglé un par de bugs en el parser, etc. Pero quizás lo más interesante de todo fue aprender a usar aws-cdk, una manera de escribir la nube en código, y de eso se trata este post.
Nube como Código
No se necesita mucho tiempo para darte cuenta que configurar cosas en aws usando la web-ui (como lo hice anteriormente) es una mala idea. Por varias razones:
- Uno se olvida de las cosa que uno configuró (botones, checkboxes, textos) al toque. Como consecuencia, es difícil mantener, compartir, invitar a coolaboradores y replicar… (imaginate querer hacer algo parecido para otro proyecto..)
- se necesita una herramienta adicional para coordinar el trabajo de varias personas (quién cambió esto? cuándo? por qué?)
- cosas relativamente básicas resultan impracticables, como “volver todo a como estaba el mes pasado” (no hay historial, no hay registro de cambios).
La solución a cada punto sería simple: escribir “la nube” en un archivo de texto, en una manera que personas y aws entiendan, y mantenerlo en un VCS como p4
, git
, svn
, etc. Y listo!
Dicha solución existe hace tiempo; se llama CloudFormation y permite que uno escriba todo en un archivo JSON. Aunque funciona, el costo es un bastante elevado: hay que escribir JSON (nada friendly) en un formato bastante específico y que no es taaan entendible en realidad. Quizás sea por eso que aws tiene un montón de “cloudformation templates”, ya semi-preparados, para los casos más frecuentes.
Por suerte, las cosas mejoraron y hace relativamente poco AWS lanzó Cloud Development Kit (CDK), producto que permite escribir toda la infraestructura en un lenguaje de programación de verdad, como Python, Javascript, etc y olvidarse de JSON/YAML. Es un mini-paraíso para un programador, porque:
- es más disfrutable programar que escribir JSON… no? (díganme que no soy el único)
- se descubre gradualmente qué es posible y qué no viendo los Tipos (usándo Typescript o C#, por ej).
- es más “ergonómico”. Por ejemplo, se crea un bucket S3 con
const myS3 = new S3(...)
y despues se configura usando esa misma variable:myS3.grantPublicAccess()
- tal como uno lo haría en cualquier programa OO. - es fácil integrar diferentes componentes. Por ej: en lugar de crear un policy que se adjunta a un role que es asumido por una función que accede etc…, uno permite a una función lambda leer una tabla de la base de datos en un solo statement:
myDbTable.grantRead(myLambdaFn)
. Conciso y claro 1.
chessy-cloud
Como parte del aprendizaje, reimplementé la parte “cloud” de chessy (descripta en las partes 3 y 4) usando aws-cdk. Fue una experiencia agradable, y el resultado es aceptable - incluso aunque esté todo en un solo archivo.
Como ya estaba en el baile me puse a bailar (?), y aproveché para hacer un pequeño cambio al endpoint (API Gateway). Antes, el endpoint accedía a la base de datos directamente (usando una integración de aws, en realidad). Esta técnica es simple, pero ofrece poco control (o al menos no encontré cómo), y yo quería transformar la info antes de retornar. O sea, en lugar de devolver lo que está en la base de datos, así en crudo:
{ "Event": { "S": "The Great Event" } }
yo quería devolver:
{ "Event": "The Great Event" }
La razón de mi deseo es que las aplicaciones/consumidores no deberían depender del formato interno de la db, además de ser desagradable. Este proceso de conversión entre una cosa y otra se llama marshall/unmarshall, y DynamoDB ofrece funciones oficiales para hacerlo.
Así que agregué una (otra) lambda function para manejar las HTTP requests, reemplazando la anterior integración default. El código es simple y, como habrán imaginado, simplemente unmarshall el resultado.
Hacer este cambio me dió la posibilidad de escribir el código de la lambda function junto al código de la infraestructura. En lugar de proveer código y librerias que estan alojados en otro lado, simplemente indiqué cual es el archivo principal y dejé que aws-cdk haga su magia.
El código de chessy-cloud
está disponible en github.
Hasta pronto!◆
-
para que ésto sea posible, se deben usar las librerías L2 (Curated) que agrupan cosas para ofrecer soluciones a los problemas mas comunes. Ver la documentación oficial ↩