{"id":2023,"date":"2022-05-04T14:02:16","date_gmt":"2022-05-04T13:02:16","guid":{"rendered":"https:\/\/keepler.io\/2022\/05\/04\/introduccion-a-iac-y-a-las-herramientas-nativas-de-aws-como-cloudformation-y-cdk\/"},"modified":"2023-09-12T10:57:24","modified_gmt":"2023-09-12T10:57:24","slug":"introduccion-a-iac-y-a-las-herramientas-nativas-de-aws-como-cloudformation-y-cdk","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2022\/05\/04\/introduccion-a-iac-y-a-las-herramientas-nativas-de-aws-como-cloudformation-y-cdk\/","title":{"rendered":"Introducci\u00f3n a IaC y a las herramientas nativas de AWS como CloudFormation y CDK"},"content":{"rendered":"<h3><span style=\"font-weight: 400;\">1. Introducci\u00f3n a Infrastructure as Code (IaC)<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">IaC es un modo de trabajo que nos permite definir mediante <\/span><b>c\u00f3digo<\/b><span style=\"font-weight: 400;\">, los <\/span><b>recursos<\/b><span style=\"font-weight: 400;\"> que componen nuestra infraestructura y la relaci\u00f3n que existe entre ellos.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Gestionar la infraestructura como si fueran piezas de c\u00f3digo fuente es uno de los principios fundamentales de la filosof\u00eda DevOps ya que permite aprovechar las <\/span><b>buenas pr\u00e1cticas<\/b><span style=\"font-weight: 400;\"> asociadas al <\/span><b>dise\u00f1o de software<\/b><span style=\"font-weight: 400;\"> y refinadas durante a\u00f1os de desarrollo, para aplicarlas a la provisi\u00f3n y gesti\u00f3n de la infraestructura. De este modo, podemos expresar nuestra <\/span><b>infraestructura<\/b><span style=\"font-weight: 400;\"> mediante <\/span><b>ficheros de c\u00f3digo<\/b><span style=\"font-weight: 400;\"> que ser\u00e1n reutilizables, se podr\u00e1n compartir y versionar, garantizando que los entornos creados sean m\u00e1s robustos, fiables, f\u00e1ciles de mantener y de gestionar y, sobre todo, que sean repetibles.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">2. Modelo Declarativo vs Modelo Imperativo<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">La diferencia principal entre el modelo declarativo y el modelo imperativo es poder diferenciar entre el \u2018Qu\u00e9\u2019 y el \u2018C\u00f3mo\u2019.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">En el paradigma <\/span><b>declarativo<\/b><span style=\"font-weight: 400;\">, se pone el foco en el objetivo final, dando menos importancia al flujo del programa y la l\u00f3gica subyacente. Un ejemplo ser\u00eda \u201cQuiero tres instancias\u201d.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">En el paradigma <\/span><b>imperativo<\/b><span style=\"font-weight: 400;\">, se construyen estructuras de control y se da importancia a la l\u00f3gica. Por ejemplo, \u201cConstruye una instancia y repite hasta que haya tres\u201d.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">Al no tener una l\u00f3gica subyacente en el c\u00f3digo, los script declarativos (que en el caso de la Infraestructura como c\u00f3digo son m\u00e1s bien archivos de texto con un formato espec\u00edfico en YAML o JSON) tienden a ser <\/span><b>m\u00e1s largos<\/b><span style=\"font-weight: 400;\"> pero tambi\u00e9n <\/span><b>m\u00e1s f\u00e1ciles de leer<\/b><span style=\"font-weight: 400;\"> y por tanto de <\/span><b>mantener<\/b><span style=\"font-weight: 400;\"> y <\/span><b>construir<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por el contrario, los scripts imperativos <\/span><b>no son necesariamente dif\u00edciles de escribir<\/b><span style=\"font-weight: 400;\">, pero tener una l\u00f3gica incrustada hace que mantenerlos caiga en la misma categor\u00eda que mantener software, es necesario prestar atenci\u00f3n a las interacciones entre componentes del programa y, en general, resulta algo m\u00e1s <\/span><b>tedioso realizar su mantenimiento<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">3. CloudFormation<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Es un <\/span><b>servicio nativo<\/b><span style=\"font-weight: 400;\"> que automatiza el despliegue de recursos en AWS, usa <\/span><b>plantillas<\/b><span style=\"font-weight: 400;\"> para declarar los <\/span><b>recursos<\/b><span style=\"font-weight: 400;\"> y es la herramienta de IaC propia de AWS. Es la v\u00eda recomendada del proveedor, aunque no es la \u00fanica que se puede usar, para aprovisionar infraestructura en distintos entornos o cuentas y gestionar los recursos. CloudFormation juega un papel importante ayud\u00e1ndonos a distribuir las soluciones sin importar el entorno, cuenta o la regi\u00f3n.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Aprender CloudFormation no es complicado, solo hay que entender algunos <\/span><b>conceptos<\/b><span style=\"font-weight: 400;\"> b\u00e1sicos del servicio (<\/span><b>Templates<\/b><span style=\"font-weight: 400;\">, <\/span><b>Stacks<\/b><span style=\"font-weight: 400;\">, <\/span><b>Change Sets<\/b><span style=\"font-weight: 400;\">) y adaptarnos a la sintaxis de los ficheros de configuraci\u00f3n. Dominando esto, se pueden desplegar en muy poco tiempo soluciones complejas, as\u00ed como replicarlas y distribuirlas. Es un servicio gratuito y solo se incurren en gastos con los servicios y recursos desplegados, por lo que es una herramienta que gestiona nuestra infraestructura sin cargo alguno por el servicio como tal.<\/span><\/p>\n<p><b>Roll backs autom\u00e1ticos<\/b><span style=\"font-weight: 400;\">, si por alguna raz\u00f3n no es posible desplegar la infraestructura se presenta alguna inconsistencia en el proceso de despliegue, CloudFormation intenta deshacer los cambios que hayan podido producirse durante la ejecuci\u00f3n y dejar la infraestructura como estaba antes del despliegue, incluyendo la verificaci\u00f3n de dependencia entre recursos antes del borrado o actualizaci\u00f3n.<\/span><\/p>\n<p><b>Detecci\u00f3n de desviaciones<\/b><span style=\"font-weight: 400;\"> (Drift) entre lo que queremos desplegar y lo que actualmente tenemos desplegado, muy \u00fatil para detectar casos de click ops en un entorno, cosa que es bastante dif\u00edcil de seguir si la infraestructura es grande.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">4. CDK<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">CDK usa un <\/span><b>lenguaje de programaci\u00f3n<\/b><span style=\"font-weight: 400;\"> para abstraernos de los t\u00edpicos ficheros de configuraci\u00f3n, escribimos menos c\u00f3digo y hacemos lo mismo o m\u00e1s usando el lenguaje de preferencia para nuestra IaC ya sea TypeScript, Python o JavaScript. Al escribir menos c\u00f3digo el <\/span><b>mantenimiento se reduce<\/b><span style=\"font-weight: 400;\">, es m\u00e1s f\u00e1cil compartirlo y sobre todo entenderlo r\u00e1pidamente. Ejemplo de esto puede ser la creaci\u00f3n de recursos de networking para una cuenta o el mantenimiento de un API en Api Gateway con muchos endpoints.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El factor com\u00fan de todos los lenguajes de programaci\u00f3n soportados por CDK es que se llevan excelentemente con la programaci\u00f3n orientada a objetos, esto permite hacer abstracciones y hereda beneficios de este paradigma, no solo la portabilidad y la reutilizaci\u00f3n de nuestro c\u00f3digo si no poder crear piezas de arquitectura que abstraiga de mucha complejidad al usuario de la misma, todo esto sin comprometer la flexibilidad y configuraci\u00f3n que se requiera, tambi\u00e9n pudiendo extender f\u00e1cilmente a funcionalidades espec\u00edficas bajo demanda sin mucho esfuerzo.<\/span><\/p>\n<blockquote><p><span style=\"font-weight: 400;\"><em>Confieso que cuando conoc\u00ed CloudFormation me gust\u00f3 y me adapt\u00e9 r\u00e1pido, me ayud\u00f3 y disfrute de su uso pero cuando conoc\u00ed CDK luego de pasar la primera barrera de entrada me qued\u00e9 con CDK sin dudarlo, puedo hacer lo mismo que CloudFormation m\u00e1s r\u00e1pido y mejor, usar loops y condicionales como tambi\u00e9n llamar a la API de AWS cuando se sintetiza el stack para crear recursos din\u00e1micos, pero lo que m\u00e1s me gust\u00f3 es que no tengo que estar pivotando en la documentaci\u00f3n para crear un recurso ya que todo est\u00e1 incluido en la librer\u00eda. Cualquier editor \/ IDE moderno puede mirar dentro de la librer\u00eda para ver todo lo que necesito para usarla, aparte el autocompletado es un plus muy grande y si lo juntamos con el tipado que nos ayuda saber el tipo de argumento esperado hace que apenas tengas que salir del entorno del editor para buscar informaci\u00f3n<\/em>. <strong>[Enrique Alonso]<\/strong><\/span><\/p><\/blockquote>\n<p><span style=\"font-weight: 400;\">Empaquetar la soluci\u00f3n o producto de infraestructura y hacer un delivery que pueda usar cualquiera con muy poca configuraci\u00f3n se logra mediante los <\/span><b>Constructs<\/b><span style=\"font-weight: 400;\"> de CDK. Se utilizan para crear recursos como un Bucket de S3 o una infraestructura entera como una API con persistencia y una distribuci\u00f3n de Cloudfront. Podemos crear nuestros propios Constructs seg\u00fan requerimientos y as\u00ed aplicar el concepto de <\/span><b>DRY<\/b><span style=\"font-weight: 400;\"> ya que si una soluci\u00f3n se repite mucho podemos empaquetarla y distribuirla en los distintos equipos de trabajo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CDK incluye una <\/span><b>librer\u00eda para testeo<\/b><span style=\"font-weight: 400;\"> con el que se pueden hacer varias aserciones del c\u00f3digo, sin embargo est\u00e1 preparado para que pueda ser testeado y seg\u00fan qu\u00e9 lenguaje se utilice, se combine con la suite de tests de turno. Con <\/span><i><span style=\"font-weight: 400;\">pytest<\/span><\/i><span style=\"font-weight: 400;\"> puedes extender las funcionalidades de la librer\u00eda interna de tests de CDK y tener casos m\u00e1s complejos de pruebas, en realidad la recomendaci\u00f3n de AWS es que los tests se mantengan simples y evaluar comportamientos sencillos del c\u00f3digo, pero a medida que los Stacks crecen y metemos complejidad lo ideal es que los tests nos indiquen si rompimos algo con nuestros cambios y poder remediarlo antes de probar en un entorno real.<\/span><\/p>\n<h3>5. Inconvenientes<\/h3>\n<ul>\n<li><span style=\"font-weight: 400;\">Tanto CDK como CloudFormation son las herramientas propias de AWS para crear IaC para su plataforma, por lo que tendremos una integraci\u00f3n \u00f3ptima y un gran soporte, pero no es trasladable fuera de AWS.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Librer\u00eda en constante desarrollo: Actualmente los cambios de versi\u00f3n de la librer\u00eda son constantes y seg\u00fan como se mire puede ser un problema. Esto es algo normal, ambos servicios est\u00e1n en desarrollo y son riesgos que hay que sopesar. Si vemos el vaso medio lleno podemos alegar que est\u00e1n a\u00f1adiendo nuevas funcionalidades o corrigiendo los problemas de las versiones anteriores, tanto AWS como la comunidad est\u00e1n trabajando para que sea el est\u00e1ndar para la IaC en AWS.\u00a0<\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1. Introducci\u00f3n a Infrastructure as Code (IaC) IaC es un modo de trabajo que nos permite definir mediante c\u00f3digo, los recursos que componen nuestra infraestructura y la relaci\u00f3n que existe entre ellos.\u00a0 Gestionar la infraestructura como si fueran piezas de c\u00f3digo fuente es uno de los principios fundamentales de la filosof\u00eda DevOps ya que permite [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":34775,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[224],"tags":[236,243,283],"class_list":["post-2023","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","tag-aws","tag-devops-es","tag-tecnologia"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-wD","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2022\/05\/introduction-to-iac-aws-native-tools-cloudformation-cdk.jpg?fit=1280%2C452&ssl=1","_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=2023"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2023\/revisions"}],"predecessor-version":[{"id":2342,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2023\/revisions\/2342"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/34775"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=2023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=2023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=2023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}