{"id":52367,"date":"2019-11-07T00:00:00","date_gmt":"2019-11-06T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/pereshel-s-terraform-na-cloudformation-i-pozhalel"},"modified":"2020-02-18T14:00:04","modified_gmt":"2020-02-18T11:00:04","slug":"pereshel-s-terraform-na-cloudformation-i-pozhalel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Pas\u00e9 de Terraform a CloudFormation y lo lament\u00e9.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Presentar la infraestructura como c\u00f3digo en un formato de texto reproducible es una buena pr\u00e1ctica sencilla para sistemas que no requieren complicaciones. Esta pr\u00e1ctica ha sido denominada - <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, y hasta ahora, para llevarla a cabo, especialmente en AWS, hay dos herramientas populares: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pas\u00e9 de Terraform a CloudFormation y lo lament\u00e9.\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Comparando la experiencia de trabajo con Terraform y CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Antes de unirme a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (tambi\u00e9n conocido como <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) trabaj\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">en una startup<\/a><\/noindex> y durante unos tres a\u00f1os utilic\u00e9 Terraform. En mi nuevo puesto tambi\u00e9n utilic\u00e9 Terraform a fondo, pero luego la empresa impuls\u00f3 la transici\u00f3n a todo lo relacionado con Amazon, incluyendo CloudFormation. Me esforc\u00e9 por desarrollar las mejores pr\u00e1cticas tanto para uno como para el otro, y us\u00e9 ambas herramientas en flujos de trabajo organizacionales muy complejos. M\u00e1s tarde, tras considerar cuidadosamente las implicaciones de la transici\u00f3n de Terraform a CloudFormation, conclu\u00ed que Terraform probablemente es la mejor opci\u00f3n para la organizaci\u00f3n.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform es Horrible<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Versi\u00f3n Beta del Software<\/h3>\n<p><\/p>\n<p>Terraform ni siquiera ha lanzado la versi\u00f3n 1.0, y esta es una raz\u00f3n v\u00e1lida para no usarlo. Desde que lo prob\u00e9 por primera vez, ha cambiado mucho, pero en ese entonces <code>terraform apply<\/code> a menudo fallaba despu\u00e9s de varias actualizaciones o simplemente tras un par de a\u00f1os de uso. Dir\u00eda que 'ahora todo es diferente', pero... as\u00ed parece que todos dicen, \u00bfno? Hay cambios que no son compatibles con versiones anteriores, aunque son adecuados, y siento que la sintaxis y las abstracciones de los recursos ahora son las correctas. La herramienta parece haber mejorado de verdad, pero... :-0<\/p>\n<p><\/p>\n<p>Por otro lado, AWS se ha esforzado mucho por mantener la compatibilidad con versiones anteriores. Todo, probablemente, porque sus servicios a menudo se prueban a fondo internamente antes de ser publicados bajo un nuevo nombre. Por lo tanto, 'se han esforzado' es una forma suave de decirlo. Mantener la compatibilidad con versiones anteriores de la API para un sistema tan variado y complejo como AWS es incre\u00edblemente dif\u00edcil. Cualquiera que haya tenido que mantener APIs p\u00fablicas utilizadas de manera tan extensa debe entender lo complicado que es hacerlo durante tantos a\u00f1os. Sin embargo, el comportamiento de CloudFormation, hasta donde recuerdo, no ha cambiado en absoluto a lo largo de los a\u00f1os.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Con\u00f3ceme, pie... este es un proyectil<\/h3>\n<p><\/p>\n<p>Hasta donde s\u00e9, eliminar un recurso <strong>externo<\/strong> No se puede importar un stack de CloudFormation desde su propio stack CF. La situaci\u00f3n es similar con Terraform. Permite importar recursos existentes a su stack. La funci\u00f3n, se podr\u00eda decir, es asombrosa, pero con gran poder viene una gran responsabilidad. Una vez que se a\u00f1ade un recurso al stack, no se puede eliminar o modificar mientras se trabaja con ese stack. Una vez, esto tuvo consecuencias. En el sitio de Twitch, alguien, sin mala intenci\u00f3n, import\u00f3 accidentalmente un grupo de seguridad de AWS a su propio stack de Terraform. Ejecut\u00f3 algunos comandos y\u2026 el grupo de seguridad (junto con el tr\u00e1fico entrante) desapareci\u00f3.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform El Grande<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Recuperaci\u00f3n de estados incompletos<\/h3>\n<p><\/p>\n<p>A veces CloudFormation no puede transitar completamente de un estado a otro. En este caso, intentar\u00e1 volver al anterior. Lamentablemente, esto no siempre es factible. Volver a lo que result\u00f3 puede ser muy estresante: nunca sabes si CloudFormation estar\u00e1 contento de que lo est\u00e9n manipulando \u2014aunque sea para repararlo. No sabe exactamente si podr\u00e1 volver al estado anterior y por defecto se queda esperando un milagro durante horas.<\/p>\n<p><\/p>\n<p>Por el contrario, Terraform tiende a recuperarse de transiciones fallidas de manera m\u00e1s elegante y ofrece una amplia gama de herramientas de depuraci\u00f3n.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Cambios m\u00e1s claros en los estados del documento<\/h3>\n<p><\/p>\n<blockquote><p>'Est\u00e1 bien, equilibrador de carga, est\u00e1s cambiando. \u00bfPero c\u00f3mo?'<\/p>\n<p>\u2014un ingeniero preocupado, listo para pulsar el bot\u00f3n 'aceptar'.<\/p><\/blockquote>\n<p>A veces necesito hacer algunas manipulaciones con el balanceador de carga en el stack de CloudFormation \u2014por ejemplo, a\u00f1adir un n\u00famero de puerto o cambiar el grupo de seguridad. CloudFormation muestra los cambios de manera poco clara. Yo, como en un nerviosismo extremo, reviso el archivo yaml diez veces para asegurarme de que no he borrado nada importante ni a\u00f1adido nada innecesario.<\/p>\n<p><\/p>\n<p>Terraform en este aspecto es mucho m\u00e1s transparente. A veces incluso es demasiado transparente (es decir: molesto). Afortunadamente, la \u00faltima versi\u00f3n incluye una mejor visualizaci\u00f3n de los cambios \u2014ahora es evidente lo que se est\u00e1 modificando.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibilidad<\/h3>\n<p><\/p>\n<blockquote><p>Escriba software desde el final.<\/p><\/blockquote>\n<p>En t\u00e9rminos claros, la caracter\u00edstica diferenciadora m\u00e1s importante de un software duradero es su capacidad para adaptarse a los cambios. Cualquier software que escribas, hazlo al rev\u00e9s. A menudo me he visto atrapado en la situaci\u00f3n de tomar un servicio 'sencillo' y luego tratar de encajarlo todo en una \u00fanica pila de CloudFormation o Terraform. Y, por supuesto, tras meses, me daba cuenta de que hab\u00eda entendido mal y el servicio en realidad no era simple. As\u00ed que necesitaba dividir de alguna manera la gran pila en partes m\u00e1s peque\u00f1as. Cuando trabajas con CloudFormation, esto solo es posible recreando primero la pila existente, algo que yo, con mis bases de datos, no hago. Terraform, en cambio, permit\u00eda diseccionar la pila y dividirla en partes m\u00e1s comprensibles.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">M\u00f3dulos en git<\/h3>\n<p><\/p>\n<p>Compartir c\u00f3digo de Terraform entre numerosos stacks es mucho m\u00e1s f\u00e1cil que con el c\u00f3digo de CloudFormation. Con Terraform, puedes colocar tu c\u00f3digo en un repositorio git y acceder a \u00e9l utilizando control de versiones sem\u00e1ntico. Cualquiera que tenga acceso a ese repositorio puede reutilizar el c\u00f3digo compartido. El equivalente en CloudFormation es S3, pero no tiene las mismas ventajas y no hay raz\u00f3n para abandonar git a favor de S3.<\/p>\n<p><\/p>\n<p>La organizaci\u00f3n creci\u00f3 y la capacidad de compartir stacks comunes alcanz\u00f3 un nivel cr\u00edtico. Con Terraform, todo esto es f\u00e1cil y natural, mientras que CloudFormation te har\u00e1 saltar a trav\u00e9s de aros antes de lograr algo parecido.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operaciones como c\u00f3digo<\/h3>\n<p><\/p>\n<blockquote><p>'Script\u00e9moslo y ya est\u00e1'.<\/p>\n<p>\u2014 ingeniero tres a\u00f1os antes de inventar el 'bicicleta' Terraform.<\/p><\/blockquote>\n<p>Cuando se trata de desarrollo de software, Go o un programa en Java no son solo c\u00f3digo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pas\u00e9 de Terraform a CloudFormation y lo lament\u00e9.\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>C\u00f3digo como c\u00f3digo<\/em><\/p>\n<p><\/p>\n<p>Tambi\u00e9n existe la infraestructura sobre la que se ejecuta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pas\u00e9 de Terraform a CloudFormation y lo lament\u00e9.\" src=\"\/wp-content\/uploads\/2019\/11\/301c0323baa18563f05503e701af069b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Infrastructure as Code<\/em><\/p>\n<p><\/p>\n<p>Pero, \u00bfde d\u00f3nde viene? \u00bfC\u00f3mo se monitorea? \u00bfD\u00f3nde reside tu c\u00f3digo? \u00bfLos desarrolladores necesitan permiso para acceder?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pas\u00e9 de Terraform a CloudFormation y lo lament\u00e9.\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operaciones como c\u00f3digo<\/em><\/p>\n<p><\/p>\n<blockquote><p>Ser desarrollador de software no es solo escribir c\u00f3digo.<\/p><\/blockquote>\n<p>No solo AWS: seguramente est\u00e1s utilizando servicios de otros proveedores. SignalFx, PagerDuty o Github. Quiz\u00e1s tengas un servidor Jenkins interno para CI\/CD o un panel de control interno de Grafana para monitoreo. Infra como c\u00f3digo se elige por diversas razones, y cada una es igualmente importante para todo lo relacionado con el software.<\/p>\n<p><\/p>\n<p>Cuando trabaj\u00e9 en Twitch, aceler\u00e1bamos los servicios dentro de sistemas h\u00edbridos y sistemas de AWS. Cre\u00e1bamos y manten\u00edamos m\u00faltiples microservicios, aumentando los costos operativos. Las discusiones se llevaban a cabo m\u00e1s o menos as\u00ed:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Yo<\/strong>: Vaya, hay demasiados movimientos para acelerar un solo microservicio. Tendr\u00e9 que usar esta cosa para crear una cuenta de AWS (est\u00e1bamos yendo hacia 2 cuentas en <strong>microservicio<\/strong>), luego este \u2014 para configurar alertas, y este \u2014 para el repositorio de c\u00f3digo, y este \u2014 para la lista de direcciones de correo electr\u00f3nico, y este...<\/li>\n<li><strong>L\u00edder<\/strong>: Lo escribiremos como un script y listo.<\/li>\n<li><strong>Yo<\/strong>: Est\u00e1 bien, pero el propio script cambiar\u00e1. Se necesitar\u00e1 una forma de verificar que todas estas cosas integradas de Amazon tienen un estado actual.<\/li>\n<li><strong>L\u00edder<\/strong>: Suena bien. Y para eso escribiremos un script.<\/li>\n<li><strong>Yo<\/strong>: \u00a1Excelente! Seguramente el script tambi\u00e9n necesitar\u00e1 par\u00e1metros. \u00bfLos aceptar\u00e1?<\/li>\n<li><strong>L\u00edder<\/strong>: S\u00ed, los aceptar\u00e1, \u00a1\u00bfqu\u00e9 otra opci\u00f3n hay?!<\/li>\n<li><strong>Yo<\/strong>: El proceso puede cambiar, se perder\u00e1 la retrocompatibilidad. Necesitaremos alg\u00fan tipo de control sem\u00e1ntico de versiones.<\/li>\n<li><strong>L\u00edder<\/strong>: \u00a1Buena idea!<\/li>\n<li><strong>Yo<\/strong>: Las herramientas se pueden cambiar manualmente, dentro de la interfaz de usuario. Necesitaremos una forma de verificar y corregir esto.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 a\u00f1os despu\u00e9s:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>L\u00edder<\/strong>: Y as\u00ed naci\u00f3 Terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>La moraleja de la historia es que incluso si est\u00e1s <strong>hasta los o\u00eddos en toda la parte de Amazon<\/strong>, a\u00fan est\u00e1s utilizando algo que no es de AWS, y estos servicios tienen un estado que utiliza un lenguaje para la configuraci\u00f3n, para sincronizar ese estado.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs m\u00f3dulos de git de Terraform<\/h3>\n<p><\/p>\n<p>lambda es la soluci\u00f3n de CloudFormation para la l\u00f3gica del usuario. Con lambda puedes <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">crear macros<\/a><\/noindex> o <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">recurso personalizado<\/a><\/noindex>. Este enfoque presenta complicaciones adicionales que no est\u00e1n presentes en el control de versiones sem\u00e1ntico de los m\u00f3dulos de git en Terraform. Para m\u00ed, el problema m\u00e1s urgente ha sido la gesti\u00f3n de permisos para todas estas lambda personalizadas (que son decenas de cuentas de AWS). Otro problema de importancia fue el tipo \"\u00bfqu\u00e9 fue primero, el huevo o la gallina?\": estaba relacionado con el c\u00f3digo de lambda. Esta funci\u00f3n en s\u00ed es infraestructura y c\u00f3digo, y tambi\u00e9n necesita monitoreo y actualizaciones. La \u00faltima complicaci\u00f3n fue la dificultad para actualizar sem\u00e1nticamente los cambios en el c\u00f3digo de lambda; adem\u00e1s, hab\u00eda que asegurarse de que las acciones de la pila no cambiaran entre ejecuciones sin un comando directo.<\/p>\n<p><\/p>\n<p>Recuerdo que una vez quise crear un despliegue canario para el entorno de Elastic Beanstalk con un equilibrador de carga cl\u00e1sico. Lo m\u00e1s f\u00e1cil ser\u00eda hacer un segundo despliegue de EB junto al entorno de producci\u00f3n, dando un paso m\u00e1s: combinando el grupo de escalado autom\u00e1tico del despliegue canario con el despliegue de producci\u00f3n en el equilibrador de carga. Y dado que Terraform usa <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk como salida<\/a><\/noindex>, esto requerir\u00e1 4 l\u00edneas adicionales de c\u00f3digo en Terraform. Cuando pregunt\u00e9 si no exist\u00eda una soluci\u00f3n comparable en CloudFormation, me se\u00f1alaron un repositorio completo en git con un pipeline de despliegue y m\u00e1s: y todo esto\u2014 por lo que podr\u00edamos hacer 4 miserables l\u00edneas de c\u00f3digo en Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Detecta mejor la deriva<\/h3>\n<p><\/p>\n<blockquote><p>Aseg\u00farate de que la realidad se alinea con las expectativas.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Detecci\u00f3n de deriva<\/a><\/noindex> \u2014 es una funci\u00f3n muy poderosa de operaciones como c\u00f3digo, porque ayuda a asegurar que la realidad se alinea con las expectativas. Est\u00e1 disponible tanto en CloudFormation como en Terraform. Pero a medida que aumenta el tama\u00f1o del stack, la b\u00fasqueda de deriva en CloudFormation genera m\u00e1s falsos positivos.<\/p>\n<p><\/p>\n<p>Con Terraform tienes ganchos de ciclo de vida mucho m\u00e1s avanzados para la detecci\u00f3n de deriva. Por ejemplo, introduces el comando <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> directamente en la definici\u00f3n de la tarea de ECS, si deseas ignorar cambios en la definici\u00f3n de una tarea espec\u00edfica, sin ignorar los cambios en todo el despliegue de ECS.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK y el futuro de CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation es dif\u00edcil de gestionar en grandes escalas interinfraestructura. Muchas de estas dificultades son reconocidas, y la herramienta necesita cosas como <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, una estructura para definir la infraestructura de nube en c\u00f3digo y llevarla a trav\u00e9s de AWS CloudFormation. Ser\u00e1 interesante ver qu\u00e9 le depara el futuro a aws-cdk, pero le resultar\u00e1 dif\u00edcil competir con otras ventajas de Terraform; para poner a CloudFormation al d\u00eda, se requerir\u00e1n cambios globales.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Para que Terraform no decepcione<\/h3>\n<p><\/p>\n<blockquote><p>Esto es \"infraestructura como C\u00d3DIGO\", no \"como texto\".<\/p><\/blockquote>\n<p>Mi primera impresi\u00f3n de Terraform fue bastante negativa. Creo que simplemente no entend\u00ed el enfoque. Casi todos los ingenieros, al principio, lo perciben involuntariamente como un formato de texto que debe transformarse en la infraestructura deseada. NO HAY QUE HACER ESO.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Las verdades fundamentales sobre un buen desarrollo de software tambi\u00e9n se aplican a Terraform.<\/h3>\n<p><\/p>\n<p>He visto c\u00f3mo muchas pr\u00e1cticas, que se adoptan para crear buen c\u00f3digo, se ignoran en Terraform. Has estudiado durante a\u00f1os para ser un buen programador. No renuncies a esa experiencia solo porque trabajas con Terraform. Las verdades fundamentales del buen desarrollo de software tambi\u00e9n se aplican a Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">\u00bfC\u00f3mo puedes no documentar el c\u00f3digo?<\/h3>\n<p><\/p>\n<p>He encontrado enormes pilas de Terraform completamente sin documentaci\u00f3n. \u00bfC\u00f3mo es posible escribir c\u00f3digo en p\u00e1ginas \u2014 completamente sin documentaci\u00f3n? Agrega documentaci\u00f3n que explique tu <strong>c\u00f3digo<\/strong> Terraform (la \u00e9nfasis aqu\u00ed est\u00e1 en la palabra \"c\u00f3digo\"), por qu\u00e9 esta secci\u00f3n es tan importante y qu\u00e9 haces.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">\u00bfC\u00f3mo puedes desplegar servicios que sol\u00edan ser una gran funci\u00f3n main()?<\/h3>\n<p><\/p>\n<p>Me he encontrado con pilas de Terraform muy complejas, presentadas como un \u00fanico m\u00f3dulo. \u00bfPor qu\u00e9 no desplegamos el software de esa manera? \u00bfPor qu\u00e9 descomponemos grandes funciones en partes m\u00e1s peque\u00f1as? Las mismas respuestas son v\u00e1lidas para Terraform. Si tu m\u00f3dulo es demasiado grande, debes dividirlo en m\u00f3dulos m\u00e1s peque\u00f1os.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">\u00bfAcaso tu empresa no utiliza bibliotecas?<\/h3>\n<p><\/p>\n<p>He visto a ingenieros lanzar un nuevo proyecto utilizando Terraform y simplemente copiar y pegar grandes trozos de otros proyectos en los suyos, y luego a\u00f1adirles modificaciones hasta que empezara a funcionar. \u00bfUstedes en su empresa trabajar\u00edan as\u00ed con c\u00f3digo \"en producci\u00f3n\"? No usamos bibliotecas sin raz\u00f3n. S\u00ed, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">no todo debe ser una biblioteca,<\/a><\/noindex> pero, \u00bfqu\u00e9 har\u00edamos sin bibliotecas compartidas en general?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">\u00bfNo usas PEP8 o gofmt?<\/h3>\n<p><\/p>\n<p>La mayor\u00eda de los lenguajes tienen un esquema de formato est\u00e1ndar y aceptado. En Python es PEP8. En Go \u2014 gofmt. Terraform tiene el suyo: <code>terraform fmt<\/code>. \u00a1\u00dasalo con gusto! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">\u00bfVas a usar React sin saber JavaScript?<\/h3>\n<p><\/p>\n<p>Los m\u00f3dulos de Terraform pueden simplificar alguna parte de la infraestructura complicada que est\u00e1s creando, pero eso no significa que no debas entenderla en absoluto. \u00bfQuieres usar Terraform correctamente sin comprender los recursos? Est\u00e1s condenado: el tiempo pasar\u00e1, y no dominar\u00e1s Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">\u00bfEst\u00e1s codificando con singletons, o inyectando dependencias?<\/h3>\n<p><\/p>\n<p>La inyecci\u00f3n de dependencias es considerada la mejor pr\u00e1ctica para el desarrollo de software, preferida por los singletons. \u00bfC\u00f3mo puede esto ser \u00fatil en Terraform? He encontrado m\u00f3dulos de Terraform que dependen de un estado remoto. En lugar de escribir m\u00f3dulos que extraen del estado remoto, escribe un m\u00f3dulo que acepte par\u00e1metros. Luego, pasa esos par\u00e1metros al m\u00f3dulo.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">\u00bfTus bibliotecas hacen diez cosas bien, o una \u2014 excelente?<\/h3>\n<p><\/p>\n<p>Las bibliotecas funcionan mejor cuando est\u00e1n enfocadas en una sola tarea, que realizan de manera excepcional. En lugar de escribir grandes m\u00f3dulos de Terraform que intentan hacer todo a la vez, div\u00eddelos en partes que hagan bien una cosa espec\u00edfica. Luego, comb\u00ednalas seg\u00fan sea necesario.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">\u00bfC\u00f3mo realizas cambios en las bibliotecas sin romper la compatibilidad?<\/h3>\n<p><\/p>\n<p>Un m\u00f3dulo de Terraform, al igual que cualquier otra biblioteca, necesita comunicar a los usuarios los cambios sin retrocompatibilidad. Cuando ocurren tales cambios en las bibliotecas, es frustrante, y lo mismo sucede cuando los cambios sin retrocompatibilidad se llevan a cabo en los m\u00f3dulos de Terraform. Se recomienda aplicar etiquetas de git y semver al utilizar m\u00f3dulos de Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">\u00bfTu servicio de producci\u00f3n est\u00e1 funcionando en tu port\u00e1til o en un centro de datos?<\/h3>\n<p><\/p>\n<p>Hashicorp tiene herramientas como <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> para ejecutar tu terraform. Estos servicios centralizados facilitan la gesti\u00f3n, auditor\u00eda y aprobaci\u00f3n de cambios en terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">\u00bfNo escribes pruebas?<\/h3>\n<p><\/p>\n<p>Los ingenieros reconocen que el c\u00f3digo debe ser probado, pero a menudo desatienden las verificaciones cuando trabajan con Terraform. Para la infraestructura esto puede ser problem\u00e1tico. Recomiendo \"probar\" o \"crear ejemplos\" de pilas usando m\u00f3dulos que se puedan desplegar correctamente para verificar durante CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform y microservicios<\/h3>\n<p><\/p>\n<blockquote><p>La vida y la muerte de las empresas de microservicios dependen de la velocidad, actualizaci\u00f3n y destrucci\u00f3n de nuevas pilas de microservicios operativos.<\/p><\/blockquote>\n<p>El problema negativo m\u00e1s com\u00fan relacionado con las arquitecturas de microservicios, del cual no se puede escapar, est\u00e1 relacionado con el trabajo y no con el c\u00f3digo. Si consideras Terraform solo como una herramienta para automatizar el lado infraestructural de la arquitectura de microservicios, te privas de las verdaderas ventajas de este sistema. Ahora ya <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">todo es c\u00f3digo<\/a><\/noindex>.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/474546\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c. \u0417\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u2014 Infrastructure as Code, \u0438 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 AWS, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Terraform \u0438 CloudFormation. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Terraform \u0438 CloudFormation \u0414\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52367","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-06T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Pas\u00e9 de Terraform a CloudFormation y me arrepent\u00ed | ProHoster","description":"Representar la infraestructura como c\u00f3digo en un formato de texto repetible es una buena pr\u00e1ctica simple para sistemas que no requiere complicaciones.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-06T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52367","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:23:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:44:44","updated":"2026-01-24 03:23:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}