{"id":98123,"date":"2020-10-24T14:42:52","date_gmt":"2020-10-24T12:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens"},"modified":"2020-11-18T00:58:49","modified_gmt":"2020-11-17T22:58:49","slug":"patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aparentemente, los desarrolladores de Terraform ofrecen pr\u00e1cticas recomendadas bastante convenientes para trabajar con la infraestructura de AWS. Sin embargo, hay una salvedad. Con el tiempo, el n\u00famero de entornos aumenta, y en cada uno aparecen particularidades. Surge casi una copia de la pila de aplicaciones en la regi\u00f3n vecina. Y el c\u00f3digo de Terraform debe ser cuidadosamente copiado y editado seg\u00fan los nuevos requisitos o hacer una 'nieve'.<\/p>\n<p><\/p>\n<p>Mi charla trata sobre patrones en Terraform para combatir el caos y la rutina manual en proyectos grandes y prolongados.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f92845c017bf613f0899d88\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tengo 40 a\u00f1os, llevo 20 en TI. He trabajado durante 12 a\u00f1os en la empresa Ixtens. Nos dedicamos al desarrollo impulsado por el comercio electr\u00f3nico. Y llevo 5 a\u00f1os practicando t\u00e9cnicas de DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi historia ser\u00e1 sobre una experiencia en un proyecto de una empresa cuyo nombre no puedo revelar, ampar\u00e1ndome en un acuerdo de confidencialidad. <\/p>\n<p><\/p>\n<p>Los n\u00fameros en la diapositiva est\u00e1n indicados para entender la magnitud del proyecto. Y todo lo que voy a decir a continuaci\u00f3n est\u00e1 relacionado con Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Me un\u00ed a este proyecto hace 4 a\u00f1os. Y en plena fase se estaba refactorizando la infraestructura, porque el proyecto hab\u00eda crecido. Y los patrones que se utilizaban ya no eran adecuados. Y considerando todo el crecimiento planeado del proyecto, era necesario idear algo nuevo. <\/p>\n<p><\/p>\n<p>Gracias a Matvey, quien ayer cont\u00f3 lo que les sucedi\u00f3 en Dodo Pizza. Eso es lo que nos ocurri\u00f3 hace 4 a\u00f1os. <\/p>\n<p><\/p>\n<p>Los desarrolladores llegaron y comenzaron a crear c\u00f3digo para la infraestructura. <\/p>\n<p><\/p>\n<p>Los motivos m\u00e1s evidentes por los que esto era necesario inclu\u00edan la reducci\u00f3n del tiempo de lanzamiento al mercado. Era necesario asegurarse de que el equipo de DevOps no fuera un cuello de botella en el lanzamiento. Y, adem\u00e1s de todo, en el nivel m\u00e1s b\u00e1sico se utilizaban Terraform y Puppet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform es un proyecto de c\u00f3digo abierto de HashiCorp. Y para aquellos que no est\u00e1n familiarizados con eso, las siguientes diapositivas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La infraestructura como c\u00f3digo significa que podemos describir nuestra infraestructura y solicitar a ciertos robots que hagan que obtengamos los recursos que hemos descrito.<\/p>\n<p><\/p>\n<p>Por ejemplo, necesitamos <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/es\/vps\/abuzoustojchivye-vps\/\"   title=\"m\u00e1quina virtual\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">m\u00e1quina virtual<\/a>. Describiremos, a\u00f1adiremos algunos par\u00e1metros obligatorios. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Despu\u00e9s de eso, configuraremos el acceso a Amazon en la consola. Y pediremos a Terraform que planifique. Terraform planificar\u00e1 y dir\u00e1: 'Est\u00e1 bien, para su recurso podemos hacer las siguientes cosas'. Y, como m\u00ednimo, se a\u00f1adir\u00e1 un recurso. Y no se esperan cambios. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una vez que est\u00e9s satisfecho, puedes pedir a Terraform que aplique y Terraform te crear\u00e1 una instancia, y recibir\u00e1s una m\u00e1quina virtual en tu nube.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, nuestro proyecto avanza. Estamos a\u00f1adiendo algunas modificaciones. Estamos solicitando m\u00e1s instancias, estamos agregando 53 entradas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y repetimos. Solicitamos el plan. Vemos qu\u00e9 cambios se est\u00e1n planificando. Los aplicamos. Y de esta manera, nuestra infraestructura crece. <\/p>\n<p><\/p>\n<p>Terraform utiliza algo llamado archivos de estado. Es decir, todos los cambios que se env\u00edan a Amazon los guarda en un archivo, donde para cada recurso que describiste, hay recursos correspondientes que se crearon en Amazon. Por lo tanto, al cambiar la descripci\u00f3n de alg\u00fan recurso, Terraform sabe exactamente qu\u00e9 debe ser cambiado en Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estos archivos de estado originalmente eran simples archivos. Y los almacen\u00e1bamos en Git, lo cual era muy inc\u00f3modo. Constantemente alguien olvidaba hacer commit de los cambios, y surg\u00edan muchos conflictos. <\/p>\n<p><\/p>\n<p>Ahora hay la posibilidad de utilizar un backend, es decir, se le indica a Terraform en qu\u00e9 bucket y con qu\u00e9 clave debe guardar el archivo de estado. Y Terraform se encargar\u00e1 de obtener este archivo de estado, realizar toda la magia y devolver el resultado final.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nuestra infraestructura est\u00e1 creciendo. Aqu\u00ed est\u00e1 nuestro c\u00f3digo. Y ahora no queremos simplemente crear una m\u00e1quina virtual, queremos tener un entorno de pruebas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform permite crear algo llamado m\u00f3dulo, es decir, describir lo mismo en alguna carpeta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y, por ejemplo, en las pruebas invocar este m\u00f3dulo y obtener lo mismo como si estuvi\u00e9ramos ejecutando Terraform apply en el mismo m\u00f3dulo. Para las pruebas, este ser\u00e1 el c\u00f3digo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para producci\u00f3n, podemos enviar algunos cambios all\u00ed, porque en las pruebas no necesitamos instancias grandes, mientras que en producci\u00f3n las instancias grandes son realmente \u00fatiles.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y despu\u00e9s volver\u00e9 al proyecto. Hab\u00eda una tarea complicada, la infraestructura estaba planeada para ser muy grande. Y hab\u00eda que distribuir todo el c\u00f3digo de tal manera que fuera c\u00f3modo para todos: tanto para aquellos que mantienen este c\u00f3digo, como para aquellos que realizan cambios. Se planeaba que cualquier desarrollador pudiera ir y ajustar la infraestructura seg\u00fan lo necesario para su parte de la plataforma. <\/p>\n<p><\/p>\n<p>Este es el \u00e1rbol de directorios que recomienda HashiCorp si tienes un gran proyecto y tiene sentido dividir toda la infraestructura en peque\u00f1os trozos, y describir cada trozo en una carpeta separada. <\/p>\n<p><\/p>\n<p>Teniendo una amplia biblioteca de recursos, se puede invocar pr\u00e1cticamente lo mismo en pruebas y en producci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En nuestro caso, esto no era del todo adecuado, porque necesit\u00e1bamos obtener la pila de pruebas para desarrolladores o para pruebas de una manera m\u00e1s sencilla. No quer\u00edamos ir de carpeta en carpeta, aplicando en el orden correcto y preocup\u00e1ndonos de que la base de datos se levantara y luego se levantara una instancia que usara esa base de datos. As\u00ed que todo el testing se lanzaba desde una sola carpeta. All\u00ed se invocaban los mismos m\u00f3dulos, pero todo se realizaba en una sola ejecuci\u00f3n.<\/p>\n<p><\/p>\n<p>Terraform se encarga de todas las dependencias. Y siempre crea recursos en el orden adecuado, de modo que se pueda obtener una direcci\u00f3n IP, por ejemplo, de una instancia reci\u00e9n creada, y obtener esa direcci\u00f3n IP en una entrada de route53. <\/p>\n<p><\/p>\n<p>Adem\u00e1s, la plataforma es muy grande. Y lanzar la pila de pruebas, incluso si es por una hora, aun si es por 8 horas, resulta ser un proceso bastante costoso. <\/p>\n<p><\/p>\n<p>Y automatizamos este proceso. El trabajo de Jenkins permit\u00eda lanzar la pila. En \u00e9l, era necesario lanzar una solicitud de extracci\u00f3n con los cambios que el desarrollador quer\u00eda probar, especificar todas las opciones, componentes y tama\u00f1os necesarios. Si quiere realizar pruebas de rendimiento, puede utilizar m\u00e1s instancias. Si solo necesita verificar que se abre un formulario, puede iniciarlo en configuraciones m\u00ednimas. Tambi\u00e9n se puede indicar si se necesita un cl\u00faster o no, etc. <\/p>\n<p><\/p>\n<p>Y luego Jenkins trasladaba un script shell que modificaba un poco el c\u00f3digo en la carpeta de Terraform. Eliminaba archivos innecesarios y a\u00f1ad\u00eda los archivos necesarios. Despu\u00e9s, con una sola ejecuci\u00f3n de Terraform apply, se levantaba la pila. <\/p>\n<p><\/p>\n<p>Y luego ven\u00edan otros pasos, en los que no quiero profundizar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Debido a que para las pruebas necesit\u00e1bamos un poco m\u00e1s de opciones que en producci\u00f3n, ten\u00edamos que hacer copias de los m\u00f3dulos, para que en esas copias se pudieran a\u00f1adir las funciones que solo eran necesarias para el testing. <\/p>\n<p><\/p>\n<p>Y as\u00ed sucedi\u00f3 que, en las pruebas, parec\u00eda que se quer\u00eda probar los cambios que finalmente ir\u00edan a producci\u00f3n. Pero en realidad se probaba una cosa, mientras que en producci\u00f3n se aplicaba un poco diferente. Y hab\u00eda una peque\u00f1a discrepancia, ya que en producci\u00f3n todos los cambios eran aplicados por el equipo de operaciones. A veces suced\u00eda que los cambios que deb\u00edan pasar de las pruebas a producci\u00f3n se quedaban en otra versi\u00f3n. <\/p>\n<p><\/p>\n<p>Adem\u00e1s, hubo un problema en el que se a\u00f1ad\u00eda un nuevo servicio que era un poco diferente de uno que ya exist\u00eda. Y en lugar de modificar el m\u00f3dulo existente, hab\u00eda que hacer una copia y agregar los cambios necesarios. <\/p>\n<p><\/p>\n<p>En esencia, Terraform no es un verdadero lenguaje. Es una declaraci\u00f3n. Si necesitamos declarar algo, lo declaramos. Y todo esto funciona.<\/p>\n<p><\/p>\n<p>En alg\u00fan momento, mientras discut\u00edamos uno de mis pull requests, un colega mencion\u00f3 que no deb\u00edamos producir copos de nieve. Me interes\u00e9 en lo que quer\u00eda decir. Hay un hecho cient\u00edfico que dice que no existen dos copos de nieve iguales en el mundo, todos son un poco diferentes. Y tan pronto como escuch\u00e9 esto, sent\u00ed todo el peso del c\u00f3digo de Terraform. Porque cuando se requer\u00eda pasar de una versi\u00f3n a otra, Terraform exig\u00eda cambios de ruptura de cadena, es decir, el c\u00f3digo ya no era compatible con la siguiente versi\u00f3n. Y hab\u00eda que hacer un pull request que cubr\u00eda casi la mitad de los archivos en la infraestructura para llevar la infraestructura a la siguiente versi\u00f3n de Terraform.<\/p>\n<p><\/p>\n<p>Y despu\u00e9s de que apareci\u00f3 ese copo de nieve, todo el c\u00f3digo de Terraform que ten\u00edamos se convert\u00eda en una gran monta\u00f1a de nieve. <\/p>\n<p><\/p>\n<p>Para un desarrollador externo, que est\u00e1 fuera de la operaci\u00f3n, esto no tiene mucha importancia, porque hizo un pull request, su recurso se inici\u00f3. Y eso es todo, no es su preocupaci\u00f3n despu\u00e9s de eso. Pero para el equipo de DevOps, que se encarga de que todo est\u00e9 bien, se requieren hacer todos esos cambios. Y el costo de esos cambios aumentaba enormemente con cada copo de nieve adicional.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hay una historia sobre c\u00f3mo un estudiante en un seminario dibuja con tiza en la pizarra dos c\u00edrculos perfectos. Y el profesor se sorprende de c\u00f3mo pudo dibujarlos tan perfectamente sin comp\u00e1s. El estudiante responde: \"Es muy simple, estuve dos a\u00f1os en el ej\u00e9rcito girando una picadora de carne.\" <\/p>\n<p><\/p>\n<p>Y de esos cuatro a\u00f1os en los que he participado en este proyecto, he estado trabajando con Terraform durante unos dos a\u00f1os. Y, por supuesto, tengo algunos trucos, algunos consejos sobre c\u00f3mo simplificar el c\u00f3digo de Terraform, tratarlo como un lenguaje de programaci\u00f3n y reducir la carga sobre los desarrolladores que deben mantener ese c\u00f3digo actualizado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lo primero de lo que quiero hablar es de los Symlinks. Terraform tiene mucho c\u00f3digo repetitivo. Por ejemplo, la llamada al proveedor se repite pr\u00e1cticamente en cada punto donde creamos un trozo de infraestructura, es la misma. Y tiene sentido sacarlo a una carpeta separada. Y en todos los lugares donde se necesita un proveedor, hacer Symlinks a este archivo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por ejemplo, en producci\u00f3n utilizas assume role, que te permite obtener permisos para alguna cuenta de Amazon externa. Y al cambiar un archivo, todos los dem\u00e1s que est\u00e9n en el \u00e1rbol de recursos tendr\u00e1n los permisos requeridos para que Terraform sepa a qu\u00e9 segmento de Amazon dirigirse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfD\u00f3nde no funcionan los Symlinks? Como mencion\u00e9, Terraform tiene archivos de estado. Y son realmente geniales. Pero el asunto es que Terraform inicializa el backend en primer lugar. Y no puede usar en esos par\u00e1metros ninguna variable, siempre hay que escribirlas como texto. <\/p>\n<p><\/p>\n<p>Y como resultado, cuando alguien hace un nuevo recurso, copia parte del c\u00f3digo de otras carpetas. Y puede equivocarse con la clave o el bucket. Por ejemplo, crea un recurso en sandbox y luego lo hace en producci\u00f3n. Y as\u00ed puede ocurrir que el bucket en producci\u00f3n se utilice desde sandbox. Claro, esto se encontrar\u00e1 r\u00e1pidamente. Se puede corregir de alguna manera, pero aun as\u00ed es una p\u00e9rdida de tiempo y, hasta cierto punto, de recursos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 podemos hacer a continuaci\u00f3n? Antes de trabajar con Terraform, debe ser inicializado. En el momento de la inicializaci\u00f3n, Terraform descarga todos los plugins. En alg\u00fan momento se dividi\u00f3 de un monolito a una arquitectura m\u00e1s microservicios. Y siempre hay que hacer Terraform init, para que cargue todos los m\u00f3dulos, todos los plugins.<\/p>\n<p><\/p>\n<p>Y se puede usar un script de shell que, en primer lugar, pueda obtener todas las variables. Un script de shell no tiene restricciones. Y, en segundo lugar, las rutas. Si siempre utilizamos la ruta en el repositorio como clave para el archivo de estado, entonces, en consecuencia, se excluir\u00e1n errores aqu\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfDe d\u00f3nde obtener los datos? Un archivo JSON. Terraform permite escribir infraestructura no solo en hcl (HashiCorp Configuration Language), sino tambi\u00e9n en JSON.<\/p>\n<p><\/p>\n<p>JSON se puede leer f\u00e1cilmente desde un script de shell. Por lo tanto, se puede colocar un archivo de configuraci\u00f3n con el bucket en alguna parte. Y usar este bucket tanto en el c\u00f3digo de Terraform como en el script de shell para la inicializaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfPor qu\u00e9 es importante tener un bucket para Terraform? Porque existe algo llamado archivos de estado remoto. Es decir, cuando levanto un recurso, para decirle a Amazon: \u00abPor favor, levanta una instancia\u00bb, necesito especificar una gran cantidad de par\u00e1metros obligatorios. <\/p>\n<p><\/p>\n<p>Y estos identificadores se almacenan en otra carpeta. Y puedo decir: \u00abTerraform, por favor, ve al archivo de estado de ese recurso y tr\u00e1meme esos identificadores\u00bb. De esta forma, se genera una cierta unificaci\u00f3n entre diferentes regiones o entornos.<\/p>\n<p><\/p>\n<p>No siempre es posible utilizar un archivo de estado remoto. Por ejemplo, si has creado un VPC manualmente. Y el c\u00f3digo de Terraform que crea el VPC genera un VPC tan diferente que tendr\u00e1s que ajustar uno para que se ajuste al otro, por lo que puedes usar el siguiente truco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es decir, crear un m\u00f3dulo que b\u00e1sicamente crea un VPC y te entrega los identificadores, aunque en realidad solo hay un archivo con valores codificados que se puede usar para crear la misma instancia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No siempre es necesario guardar el archivo de estado en la nube. Por ejemplo, al probar m\u00f3dulos, se puede utilizar la inicializaci\u00f3n del backend, donde el archivo se guardar\u00e1 simplemente en el disco durante la prueba.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora un poco sobre las pruebas. \u00bfQu\u00e9 se puede probar en Terraform? Probablemente se puede probar muchas cosas, pero voy a hablar sobre estas 4.<\/p>\n<p><\/p>\n<p>HashiCorp tiene una visi\u00f3n sobre c\u00f3mo debe formatearse el c\u00f3digo de Terraform. Y Terraform fmt te permite formatear el c\u00f3digo que editas de acuerdo con esa visi\u00f3n. Por lo tanto, las pruebas deben verificar si el formateo cumple con lo que ha legado HashiCorp, para evitar tener que cambiar la ubicaci\u00f3n de los corchetes, etc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>El siguiente es Terraform validate. Hace un poco m\u00e1s que verificar la sintaxis, como, por ejemplo, si todos los corchetes est\u00e1n emparejados. \u00bfQu\u00e9 es importante aqu\u00ed? Nuestra infraestructura es muy ramificada. Tiene muchas carpetas diferentes. Y en cada una de ellas hay que ejecutar Terraform validate.<\/p>\n<p><\/p>\n<p>Por lo tanto, para acelerar las pruebas, ejecutamos varios procesos en paralelo, usando paralelismo. <\/p>\n<p><\/p>\n<p>El paralelismo es una cosa muy buena, \u00fasenlo.<\/p>\n<p><\/p>\n<p>Pero cada vez que se inicializa Terraform, va a HashiCorp y pregunta: \"\u00bfCu\u00e1les son las versiones m\u00e1s recientes de los plugins? \u00bfY el plugin que tengo en cach\u00e9, es el correcto o no?\". Y eso ralentiza el proceso en cada paso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si se le indica a Terraform d\u00f3nde est\u00e1n los plugins, entonces Terraform dir\u00e1: \"Est\u00e1 bien, probablemente esto es lo m\u00e1s reciente. No ir\u00e9 a ning\u00fan lado, comenzar\u00e9 a validar tu c\u00f3digo Terraform de inmediato.\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para llenar la carpeta con los plugins necesarios, tenemos un c\u00f3digo Terraform muy simple que solo necesita ser inicializado. Aqu\u00ed, por supuesto, es necesario especificar todos los proveedores que participan de alguna manera en tu c\u00f3digo, de lo contrario Terraform dir\u00e1: \"No conozco a este proveedor porque no est\u00e1 en cach\u00e9.\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lo siguiente es el plan de Terraform. Como mencion\u00e9, el desarrollo es c\u00edclico. Creamos c\u00f3digo con cambios. Y luego necesitamos saber qu\u00e9 cambios se planean en la infraestructura. <\/p>\n<p><\/p>\n<p>Y cuando la infraestructura es muy, muy grande, puede que cambies un m\u00f3dulo, arregles un entorno de prueba o un regi\u00f3n espec\u00edfica y rompas alg\u00fan componente vecino. Por lo tanto, el plan de Terraform debe hacerse para toda la infraestructura y mostrar qu\u00e9 cambios se planean.<\/p>\n<p><\/p>\n<p>Se puede hacer de manera inteligente. Por ejemplo, escribimos un script en Python que resuelve las dependencias. Y dependiendo de lo que se haya modificado: un m\u00f3dulo de Terraform o simplemente alg\u00fan componente espec\u00edfico, crea planes para todas las carpetas dependientes.<\/p>\n<p><\/p>\n<p>El plan de Terraform debe hacerse bajo demanda. Al menos, eso es lo que hacemos nosotros. <\/p>\n<p><\/p>\n<p>Las pruebas, por supuesto, son buenas para cada cambio, para cada commit, pero los planes son algo bastante costoso. Y en el pull request decimos: \"Por favor, dame los planes\". Se activa un robot. Y env\u00eda en los comentarios o como adjunto todos los planes que se prev\u00e9n a partir de tus cambios. <\/p>\n<p><\/p>\n<p>El plan es algo bastante costoso. Toma tiempo, porque Terraform va a Amazon y pregunta: \"\u00bfEste instancia a\u00fan existe? \u00bfEste autoscale tiene realmente estas configuraciones?\". Y para acelerar esto, se puede usar un par\u00e1metro como refresh=false. Esto significa que Terraform descargar\u00e1 el estado de S3. Y creer\u00e1 que el estado coincide exactamente con lo que hay en Amazon.<\/p>\n<p><\/p>\n<p>Este plan de Terraform se ejecuta mucho m\u00e1s r\u00e1pido, pero el estado debe coincidir con su infraestructura, es decir, en alg\u00fan lugar y en alg\u00fan momento, debe ejecutarse Terraform refresh. Terraform refresh hace precisamente eso: asegura que el estado coincida con lo que est\u00e1 en la infraestructura real. <\/p>\n<p><\/p>\n<p>Y hay que hablar de seguridad. Eso era lo que deb\u00edamos haber abordado desde el principio. Donde ejecuta Terraform y donde Terraform interact\u00faa con su infraestructura, existe una vulnerabilidad. Es decir, en esencia, est\u00e1 ejecutando c\u00f3digo. Y si una solicitud de extracci\u00f3n contiene alg\u00fan c\u00f3digo malicioso, podr\u00eda ejecutarse en una infraestructura que tiene demasiado acceso. Por lo tanto, tenga cuidado con d\u00f3nde ejecuta Terraform plan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lo siguiente de lo que quisiera hablar es la prueba de user-data.<\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 es user-data? En Amazon, cuando creamos una instancia, podemos enviar un mensaje desde la instancia: metadatos. Cuando se inicia la instancia, normalmente cloud init siempre est\u00e1 presente en estas instancias. Cloud init lee este mensaje y dice: \"Ok, hoy soy un balanceador de carga\". Y de acuerdo con estas instrucciones, realiza alguna acci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero, desafortunadamente, cuando hacemos Terraform plan y Terraform apply, user-data parece un batido de n\u00fameros. Es decir, simplemente le env\u00eda un hash. Y todo lo que puede ver en el plan es si habr\u00e1 alg\u00fan cambio o si el hash permanecer\u00e1 igual. <\/p>\n<p><\/p>\n<p>Y si no se presta atenci\u00f3n a esto, en Amazon, puede enviarse alg\u00fan archivo de texto da\u00f1ado a la infraestructura real. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como opci\u00f3n, al ejecutar, puede especificar no toda la infraestructura, sino solo el template. Y en el c\u00f3digo decir: \"Por favor, mu\u00e9strame este template en la pantalla\". Y al final puede obtener una impresi\u00f3n de c\u00f3mo se ver\u00e1n sus datos en Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Otra opci\u00f3n es utilizar un m\u00f3dulo para generar user-data. Aplica este m\u00f3dulo. Obtienes un archivo en disco. Lo comparas con el de referencia. Y de esta manera, si un novato decide corregir un poco el user-data, tus pruebas dir\u00e1n: \"Ok, aqu\u00ed y aqu\u00ed hay algunos cambios \u2013 eso es normal\".<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lo siguiente de lo que quisiera hablar es Automatizar Terraform apply.<\/p>\n<p><\/p>\n<p>Por supuesto, es bastante aterrador hacer un Terraform apply en modo autom\u00e1tico, porque, \u00bfqui\u00e9n sabe qu\u00e9 cambios han llegado y cu\u00e1n destructivos pueden ser para la infraestructura en vivo? <\/p>\n<p><\/p>\n<p>Para un entorno de prueba, esto est\u00e1 totalmente bien. Es decir, la tarea que crea el entorno de prueba es lo que todos los desarrolladores necesitan. Y expresiones como 'me funcion\u00f3 todo' no son un meme gracioso, sino una prueba de que la persona se lo tom\u00f3 en serio, levant\u00f3 la pila, ejecut\u00f3 algunas pruebas en esta pila y se asegur\u00f3 de que todo estaba bien y dijo: 'Ok, el c\u00f3digo que estoy lanzando ha sido probado'.<\/p>\n<p><\/p>\n<p>En producci\u00f3n, sandbox y otros entornos que son m\u00e1s importantes para el negocio, se pueden aplicar parcialmente algunos recursos de manera suficientemente segura, porque no resulta en que alguien muera. Esto incluye: grupos de escalado autom\u00e1tico, grupos de seguridad, roles, route53 y la lista puede ser bastante extensa. Pero mantente atento a lo que ocurre, lee los informes sobre aplicaciones autom\u00e1ticas. <\/p>\n<p><\/p>\n<p>Donde aplicar es peligroso o intimidante, por ejemplo, si se trata de algunos recursos persistentes, de bases de datos, obt\u00e9n informes sobre cambios no aplicados en alguna parte de la infraestructura. Y el ingeniero, bajo supervisi\u00f3n, ejecuta trabajos para aplicarlos o lo hace desde su consola. <\/p>\n<p><\/p>\n<p>En Amazon hay algo llamado protecci\u00f3n contra terminaci\u00f3n. Y puede protegerte en algunos casos de cambios no deseados. Es decir, Terraform va a Amazon y dice: 'Necesito eliminar esta instancia para hacer otra'. Y Amazon dice: 'Lo siento, no hoy. Tenemos protecci\u00f3n contra terminaci\u00f3n activa'.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y la guinda del pastel es la optimizaci\u00f3n del c\u00f3digo. Cuando trabajamos con c\u00f3digo de Terraform, debemos pasar una gran cantidad de par\u00e1metros al m\u00f3dulo. Son esos par\u00e1metros necesarios para crear alg\u00fan recurso. Y el c\u00f3digo se convierte en largas listas de par\u00e1metros que deben ser transmitidas de m\u00f3dulo a m\u00f3dulo, especialmente si los m\u00f3dulos est\u00e1n anidados. <\/p>\n<p><\/p>\n<p>Y esto es muy dif\u00edcil de leer. Es complicado hacer revisiones. Y a menudo sucede que algunos par\u00e1metros pasan la revisi\u00f3n y no son exactamente los que se necesitan. Esto cuesta tiempo y dinero para corregir m\u00e1s tarde.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por eso, te propongo usar algo como un par\u00e1metro complejo que incluya un \u00e1rbol de valores. Es decir, necesitas alguna carpeta donde se indiquen todos los valores que te gustar\u00eda tener en alg\u00fan entorno.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Al invocar este m\u00f3dulo, se puede obtener un \u00e1rbol que se genera en un \u00fanico m\u00f3dulo general, es decir, en un m\u00f3dulo com\u00fan que funciona de la misma manera para toda la infraestructura.<\/p>\n<p><\/p>\n<p>En este m\u00f3dulo se pueden realizar c\u00e1lculos utilizando una caracter\u00edstica nueva de Terraform, llamada locals. Luego, se puede emitir un output que contenga alg\u00fan par\u00e1metro complejo que puede incluir hashes, arreglos, etc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqu\u00ed es donde terminan mis mejores hallazgos. Y quisiera contar una an\u00e9cdota sobre Col\u00f3n. Cuando buscaba dinero para su expedici\u00f3n para encontrar la India (como pensaba), nadie le cre\u00eda y pensaban que era imposible. Entonces dijo: 'Haced que el huevo no se caiga'. Todos los banqueros, personas muy ricas y probablemente inteligentes, intentaron de alguna manera poner el huevo y siempre se ca\u00eda. Entonces Col\u00f3n tom\u00f3 el huevo, lo presion\u00f3 un poco. La c\u00e1scara se dobl\u00f3 y el huevo se mantuvo en su lugar. Ellos dijeron: 'Oh, es demasiado simple!'. Y Col\u00f3n respondi\u00f3: 'S\u00ed, es demasiado simple. Y cuando descubra la India, todos usar\u00e1n esta ruta comercial'. <\/p>\n<p><\/p>\n<p>Y lo que acabo de contarles son, tal vez, cosas bastante simples y triviales. Y cuando te das cuenta de ellas y comienzas a usarlas, se vuelve algo normal. As\u00ed que \u00fasenlas. Y si para ustedes son cosas bastante normales, al menos saben c\u00f3mo colocar el huevo para que no se caiga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Resumiendo: <\/p>\n<p><\/p>\n<ul>\n<li>Traten de evitar copos de nieve. Cuantos menos copos de nieve haya, menos recursos necesitar\u00e1n para hacer algunos cambios en toda su gran infraestructura. <\/li>\n<li>Cambios constantes. Es decir, cuando hay cambios en el c\u00f3digo, es necesario que su infraestructura se ajuste a esos cambios lo m\u00e1s r\u00e1pido posible. No debe haber una situaci\u00f3n en la que alguien venga despu\u00e9s de dos o tres meses para revisar Elasticsearch, haga un terraform plan, y encuentre un mont\u00f3n de cambios que no esperaba. Y se pierde mucho tiempo para devolver todo a la normalidad. <\/li>\n<li>Pruebas y automatizaci\u00f3n. Cuanto m\u00e1s cubierto est\u00e9 su c\u00f3digo con pruebas y funcionalidades, m\u00e1s confianza tendr\u00e1n de que est\u00e1n haciendo todo correctamente. Y la entrega autom\u00e1tica aumentar\u00e1 su confianza de manera significativa. <\/li>\n<li>El c\u00f3digo para entornos de prueba y producci\u00f3n debe ser pr\u00e1cticamente igual. Pr\u00e1cticamente, porque la producci\u00f3n es un poco diferente y siempre habr\u00e1 algunos matices que se desv\u00edan del entorno de prueba. Sin embargo, se puede asegurar m\u00e1s o menos. <\/li>\n<li>Y si usted tiene mucho c\u00f3digo de Terraform y mantener este c\u00f3digo actualizado requiere mucho tiempo, nunca es tarde para refactorizarlo y llevarlo a una buena forma. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Infraestructura inmutable. Entrega de AMI seg\u00fan un horario. <\/li>\n<li>Estructura para route53, cuando tiene muchas entradas y desea que est\u00e9n en un orden coherente. <\/li>\n<li>Lucha contra los l\u00edmites de tasa de API. Es cuando Amazon dice: \"Todo, ya no puedo aceptar m\u00e1s solicitudes, por favor, espere\". Y medio personal espera hasta que pueda iniciar su infraestructura. <\/li>\n<li>Instancias Spot. Amazon no es un evento barato y las instancias Spot permiten ahorrar bastante. Se podr\u00eda dar toda una charla sobre esto. <\/li>\n<li>Seguridad y roles IAM. <\/li>\n<li>B\u00fasqueda de recursos perdidos, cuando tiene instancias en Amazon de origen desconocido, que est\u00e1n consumiendo dinero. Incluso si las instancias cuestan 100-150 d\u00f3lares al mes, eso son m\u00e1s de 1,000 al a\u00f1o. Encontrar tales recursos es un negocio rentable. <\/li>\n<li>Y tambi\u00e9n instancias reservadas. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikov (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eso es todo por mi parte. Terraform es genial, \u00fasenlo. \u00a1Gracias!<\/p>\n<p><\/p>\n<p>Preguntas<\/p>\n<p><\/p>\n<p><em>\u00a1Gracias por la presentaci\u00f3n! Su archivo de estado est\u00e1 en S3, \u00bfc\u00f3mo resuelven el problema de que varias personas puedan acceder a ese archivo de estado e intentar desplegarse?<\/em><\/p>\n<p><\/p>\n<p>Primero, no tenemos prisa. En segundo lugar, hay flags, donde informamos que estamos trabajando en alguna parte del c\u00f3digo. O sea, a pesar de que la infraestructura es muy grande, no significa que constantemente alguien est\u00e9 aplicando algo. Y cuando estaba la fase activa, era un problema, ten\u00edamos archivos de estado guardados en Git. Eso era importante, de lo contrario, alguien crear\u00eda un archivo de estado y ten\u00edamos que reunirlos manualmente para que todo siguiera adelante. Ahora no hay tal problema. En general, Terraform resolvi\u00f3 esta tarea. Y si algo cambia constantemente, se pueden usar bloqueos que previenen lo que usted dijo.<\/p>\n<p><\/p>\n<p><em>\u00bfEst\u00e1 utilizando la versi\u00f3n comunitaria o la empresa?<\/em><\/p>\n<p><\/p>\n<p>Nada de empresa, o sea, todo lo que se puede ir y descargar gratis. <\/p>\n<p><\/p>\n<p><em>Me llamo Stanislav. Quer\u00eda hacer una peque\u00f1a adici\u00f3n. Hablaste sobre una funci\u00f3n de Amazon que permite hacer que una instancia sea irrompible. Esto tambi\u00e9n existe en Terraform, en el bloque Life Second se puede especificar una prohibici\u00f3n de modificaci\u00f3n o una prohibici\u00f3n de destrucci\u00f3n.<\/em> <\/p>\n<p><\/p>\n<p>El tiempo fue limitado. Buena observaci\u00f3n. <\/p>\n<p><\/p>\n<p><em>Tambi\u00e9n quer\u00eda preguntar dos cosas. En primer lugar, hablaste sobre las pruebas. \u00bfHas utilizado alguna herramienta para pruebas? Escuch\u00e9 sobre el complemento Test Kitchen. Quiz\u00e1s haya algo m\u00e1s. Y me gustar\u00eda preguntar sobre Local Values. \u00bfEn qu\u00e9 se diferencian en principio de las Input Variables? \u00bfY por qu\u00e9 no puedo parametrizar algo solo a trav\u00e9s de Local Values? He intentado entender este tema, pero no he logrado esclarecerlo por completo.<\/em><\/p>\n<p><\/p>\n<p>Podemos hablar m\u00e1s en detalle de esto fuera de la sala. Las herramientas de prueba son completamente artesanales en nuestro caso. No hay nada realmente sofisticado para probar. Sin embargo, hay opciones donde las pruebas autom\u00e1ticas levantan infraestructura en alg\u00fan lugar, verifican que est\u00e9 bien y luego la destruyen con un informe de que tu infraestructura sigue en buen estado. No tenemos eso, porque los stacks de prueba se inician todos los d\u00edas. Y eso es suficiente. Si algo empieza a fallar, comenzar\u00e1 a fallar sin necesidad de que lo verifiquemos en otro lugar. <\/p>\n<p><\/p>\n<p>En cuanto a Local Values, sigamos hablando de esto fuera de la sala. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Muy informativa. Hablaste de que tienes mucho c\u00f3digo repetitivo para describir la infraestructura. \u00bfNo has considerado la opci\u00f3n de generar ese c\u00f3digo?<\/em><\/p>\n<p><\/p>\n<p>\u00a1Excelente pregunta, gracias! La cuesti\u00f3n es que, cuando usamos infraestructura como c\u00f3digo, asumimos que estamos mirando el c\u00f3digo y entendemos qu\u00e9 infraestructura est\u00e1 detr\u00e1s de ese c\u00f3digo. Si el c\u00f3digo se genera, necesitamos imaginar qu\u00e9 c\u00f3digo se generar\u00e1 para entender qu\u00e9 infraestructura habr\u00e1. O generamos el c\u00f3digo, lo comiteamos y, en esencia, es lo mismo. Por eso seguimos el camino que escribimos y obtuvimos eso. Adem\u00e1s, los generadores aparecieron un poco m\u00e1s tarde, cuando comenzamos a hacerlo. Y ya era tarde para cambiar.<\/p>\n<p><\/p>\n<p><em>\u00bfHas o\u00eddo algo sobre jsonnet?<\/em><\/p>\n<p><\/p>\n<p>No. <\/p>\n<p><\/p>\n<p><em>Mira, es una herramienta muy buena. Veo un caso concreto donde se puede aplicar y generar una estructura de datos.<\/em> <\/p>\n<p><\/p>\n<p>Los generadores son buenos, como en el chiste sobre la m\u00e1quina de afeitar. Es decir, la primera vez las caras son diferentes, pero luego todos tienen la misma cara. Los generadores son realmente atractivos. Pero, lamentablemente, nosotros tenemos caras un poco diferentes. Ese es el problema. <\/p>\n<p><\/p>\n<p><em>Solo m\u00edralo. \u00a1Gracias!<\/em><\/p>\n<p><\/p>\n<p><em>Me llamo Maxim, soy de Sberbank. Ustedes mencionaron que intentaron llevar Terraform a un an\u00e1logo de un lenguaje de programaci\u00f3n. \u00bfNo ser\u00eda m\u00e1s f\u00e1cil usar Ansible?<\/em><\/p>\n<p><\/p>\n<p>Son cosas muy diferentes. Se pueden crear recursos tanto con Ansible como con Puppet en Amazon. Pero Terraform est\u00e1 espec\u00edficamente dise\u00f1ado para eso. <\/p>\n<p><\/p>\n<p><em>\u00bfSolo tienen Amazon?<\/em><\/p>\n<p><\/p>\n<p>No se trata de que solo tengamos Amazon. Casi solo tenemos Amazon. Pero la caracter\u00edstica clave es que Terraform recuerda. En Ansible, si dices: 'Levanta 5 instancias', las levantar\u00e1, y luego dices: 'Ahora necesito 3'. Terraform dir\u00e1: 'Est\u00e1 bien, eliminar\u00e9 2', mientras que Ansible dir\u00e1: 'Est\u00e1 bien, aqu\u00ed tienes 3'. En total, 8.<\/p>\n<p><\/p>\n<p><em>\u00a1Hola! Gracias por su presentaci\u00f3n. Fue muy interesante escuchar sobre Terraform. Solo quiero hacer un peque\u00f1o comentario sobre el hecho de que Terraform no tiene una versi\u00f3n estable, as\u00ed que traten Terraform con gran precauci\u00f3n.<\/em><\/p>\n<p><\/p>\n<p>La cuchara es buena a la hora del almuerzo. Es decir, si necesitas una soluci\u00f3n, a veces dejas de lado lo que es inestable, etc., pero funciona y nos ha ayudado. <\/p>\n<p><\/p>\n<p><em>Tengo una pregunta. Ustedes utilizan Remote backend, utilizan S3. \u00bfPor qu\u00e9 no utilizan el backend oficial?<\/em><\/p>\n<p><\/p>\n<p>\u00bfOficial?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>\u00bfCu\u00e1ndo apareci\u00f3?<\/p>\n<p><\/p>\n<p><em>Hace unos 4 meses.<\/em> <\/p>\n<p><\/p>\n<p>Si hubiera aparecido hace 4 a\u00f1os, probablemente habr\u00eda respondido su pregunta.<\/p>\n<p><\/p>\n<p><em>All\u00ed ya hay una funci\u00f3n incorporada y locks, y se puede almacenar el archivo de estado. Pru\u00e9benlo. Pero yo tampoco lo he probado.<\/em><\/p>\n<p><\/p>\n<p>Estamos viajando en un gran tren que se mueve a gran velocidad. No puedes simplemente tirar algunos vagones. <\/p>\n<p><\/p>\n<p><em>Hablaste de copos de nieve, pero \u00bfpor qu\u00e9 no usaste branches? \u00bfPor qu\u00e9 no fue posible hacerlo as\u00ed?<\/em><\/p>\n<p><\/p>\n<p>Tenemos un enfoque en el que toda la infraestructura est\u00e1 en un solo repositorio. Terraform, Puppet, todos los scripts que tengan alguna relaci\u00f3n, est\u00e1n todos en un solo repositorio. De esta manera, podemos garantizar que los cambios incrementales sean probados uno por uno. Si hubiera un mont\u00f3n de branches, ser\u00eda pr\u00e1cticamente imposible mantener tal proyecto. Pasan seis meses, y se desv\u00edan tanto que es simplemente un castigo. Es algo de lo que querr\u00edas escapar antes de la refactorizaci\u00f3n. <\/p>\n<p><\/p>\n<p><em>Es decir, \u00bfno funciona?<\/em><\/p>\n<p><\/p>\n<p>Esto no funciona en absoluto.<\/p>\n<p><\/p>\n<p>En branch recort\u00e9 la diapositiva de la carpeta. Es decir, si haces una para cada pila de prueba, por ejemplo, el equipo A tiene su propia carpeta, el equipo B tiene su propia carpeta, entonces eso tampoco funciona. Creamos un c\u00f3digo unificado para el entorno de prueba, que fue lo suficientemente flexible como para adaptarse a todos. Es decir, manten\u00edamos un solo c\u00f3digo. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Me llamo Yura! \u00a1Gracias por la presentaci\u00f3n! Tengo una pregunta sobre los m\u00f3dulos. Ustedes mencionan que utilizan m\u00f3dulos. \u00bfC\u00f3mo manejan el problema si en un m\u00f3dulo se realizan cambios que son incompatibles con los cambios de otra persona? \u00bfVersionan los m\u00f3dulos de alguna manera o intentan hacer que todo funcione para cumplir con dos requisitos?<\/em><\/p>\n<p><\/p>\n<p>Ese es un problema de una gran bola de nieve. Es lo que sufrimos cuando un cambio aparentemente inofensivo puede romper alguna parte de la infraestructura. Y eso solo se nota despu\u00e9s de un tiempo prolongado.<\/p>\n<p><\/p>\n<p><em>Es decir, \u00bftodav\u00eda no hay una soluci\u00f3n?<\/em><\/p>\n<p><\/p>\n<p>Hacen m\u00f3dulos universales. Eviten las variantes inusuales. Y todo funcionar\u00e1. La segunda mitad de la presentaci\u00f3n trata sobre c\u00f3mo evitar eso.<\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Quisiera aclarar. Qued\u00f3 una gran cantidad de informaci\u00f3n en el aire, por la que vine. \u00bfC\u00f3mo est\u00e1n integrados Puppet y la asignaci\u00f3n de roles?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Es decir, \u00bfsimplemente lanzan un archivo y lo ejecutan de alguna manera?<\/em><\/p>\n<p><\/p>\n<p>User-data es una nota, es decir, cuando hacemos un clon de la imagen, se inicia un Demonio y, tratando de averiguar qui\u00e9n es, lee la nota que indica que es un balanceador de carga.<\/p>\n<p><\/p>\n<p><em>Es decir, \u00bfes alg\u00fan proceso separado que se asigna?<\/em><\/p>\n<p><\/p>\n<p>No lo inventamos nosotros. Lo estamos utilizando. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! Tengo precisamente una pregunta sobre User-data. Ustedes mencionaron que hay problemas, que alguien puede transmitir algo err\u00f3neamente. \u00bfHay alguna manera de almacenar user-data en el mismo Git, para que siempre est\u00e9 claro a qu\u00e9 se refiere User-data?<\/em><\/p>\n<p><\/p>\n<p>Generamos User-data a partir de la plantilla. Es decir, hay algunas variables que se env\u00edan. Y Terraform genera el resultado final. Por eso no se puede mirar la plantilla y decir qu\u00e9 va a salir, porque todos los problemas est\u00e1n relacionados con que el desarrollador piensa que est\u00e1 pasando una cadena en esta variable, mientras que en realidad est\u00e1 llegando un arreglo. Y de repente, eso falla, y resulta que hab\u00eda algo m\u00e1s en la pr\u00f3xima l\u00ednea, y todo se rompe. Si es un recurso nuevo y la persona lo est\u00e1 levantando, ver\u00e1 que algo no funciona, lo que se resuelve r\u00e1pidamente. Pero si se actualiz\u00f3 un grupo de autoscaling, en alg\u00fan momento las instancias en el grupo de autoscaling empezar\u00e1n a cambiar. Y \u00a1zas!, algo deja de funcionar. Eso es frustrante.<\/p>\n<p><\/p>\n<p><em>\u00bfEntonces, la \u00fanica soluci\u00f3n es probar?<\/em><\/p>\n<p><\/p>\n<p>S\u00ed, ves el problema, y agregas pasos de prueba. Es decir, tambi\u00e9n se puede probar con los outputs. Puede que no sea tan conveniente, pero tambi\u00e9n se pueden poner algunas marcas: verifica que User-data est\u00e9 bien asegurada. <\/p>\n<p><\/p>\n<p><em>Me llamo Timur. Es genial que haya presentaciones sobre c\u00f3mo organizar correctamente Terraform.<\/em><\/p>\n<p><\/p>\n<p>Ni siquiera he empezado.<\/p>\n<p><\/p>\n<p><em>Creo que en la pr\u00f3xima conferencia, quiz\u00e1s habr\u00e1. Tengo una pregunta sencilla. \u00bfPor qu\u00e9 codificas un valor en un m\u00f3dulo separado en lugar de usar tfvars? Es decir, \u00bfqu\u00e9 hace mejor un m\u00f3dulo de valores en comparaci\u00f3n con tfvars?<\/em><\/p>\n<p><\/p>\n<p>Es decir, \u00bfdebo escribir aqu\u00ed (diapositiva: Production\/environment\/settings.tf): domain = variable, domain vpcnetwork, variable vpcnetwork y stvars \u2013 \u00bfsacar lo mismo?<\/p>\n<p><\/p>\n<p><em>Lo hacemos de esa manera. Hacemos referencia al m\u00f3dulo setting source, por ejemplo.<\/em><\/p>\n<p><\/p>\n<p>En esencia, eso es como un tfvars. Tfvars es muy conveniente en el entorno de testing. Tengo tfvars para instancias grandes y para peque\u00f1as. Y simplemente pongo un archivo en la carpeta. Y obtengo lo que quiero. Cuando estamos desarrollando la infraestructura, queremos que se pueda ver y entender todo de inmediato. Pero, de esta manera, tienes que mirar aqu\u00ed y luego mirar en tfvars.<\/p>\n<p><\/p>\n<p><em>\u00bfEntonces, para que todo est\u00e9 en un solo lugar?<\/em><\/p>\n<p><\/p>\n<p>S\u00ed, tfvars es cuando tienes un solo c\u00f3digo. Y se utiliza en varios lugares diferentes con diferentes matices. Entonces lanzar\u00edas tfvars y obtendr\u00edas tus matices. Y nosotros \u2013 eso es infraestructura como c\u00f3digo en su forma m\u00e1s pura. Miras y entiendes. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00bfTe has encontrado con situaciones en las que el proveedor de la nube interviene en lo que hiciste con Terraform? Supongamos que estamos editando metadatos. Ah\u00ed est\u00e1n las claves ssh. Y Google constantemente est\u00e1 introduciendo sus metadatos, sus claves. Y Terraform siempre dice que tiene cambios. Despu\u00e9s de cada ejecuci\u00f3n, incluso si no hay cambios, siempre dice que va a actualizar ese campo.<\/em><\/p>\n<p><\/p>\n<p>Con las claves, pero s\u00ed, parte de la infraestructura est\u00e1 afectada por esa situaci\u00f3n, es decir, Terraform no puede cambiar nada. Nosotros tampoco podemos cambiar nada manualmente. Mientras tanto, vivimos con eso.<\/p>\n<p><\/p>\n<p><em>Es decir, te has encontrado con eso, pero no has encontrado soluci\u00f3n, \u00bfhace lo que quiere y sigue as\u00ed?<\/em><\/p>\n<p><\/p>\n<p>Desafortunadamente, s\u00ed. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! Me llamo Stanislav Starkov. Mail.ru Group. \u00bfC\u00f3mo resuelves el problema de generar la etiqueta en \u2026, c\u00f3mo la pasas por dentro? Entiendo que a trav\u00e9s de User \u2014 data, para especificar el nombre del host, \u00bfdiriges Puppet? Y la segunda parte de la pregunta. \u00bfC\u00f3mo resuelves esto en SG, es decir, cuando generas SG, un centenar de instancias similares, c\u00f3mo las nombras correctamente?<\/em><\/p>\n<p><\/p>\n<p>Las instancias que son muy importantes para nosotros, las nombramos de manera adecuada. Las que no son necesarias tienen un sufijo que indica que son parte del grupo autoscale. Y, en teor\u00eda, eso se puede eliminar y obtener una nueva. <\/p>\n<p><\/p>\n<p>En cuanto al problema con la etiqueta, no existe tal problema, sino que hay una tarea. Y las etiquetas se utilizan mucho, porque la infraestructura es grande y costosa. Necesitamos ver a d\u00f3nde se va el dinero, por lo que las etiquetas permiten desglosar qu\u00e9 y hacia d\u00f3nde se ha ido. Y, en consecuencia, buscar lo que gasta mucho dinero aqu\u00ed. <\/p>\n<p><\/p>\n<p>\u00bfCu\u00e1l era la otra pregunta?<\/p>\n<p><\/p>\n<p><em>Cuando SG crea un centenar de instancias, \u00bfhay que diferenciarlas de alguna manera?<\/em><\/p>\n<p><\/p>\n<p>No, no es necesario. En cada instancia hay un agente que informa que tengo un problema. Si el agente informa, entonces el agente lo sabe y, al menos, su direcci\u00f3n IP existe. Ya se puede ir. Adem\u00e1s, usamos Consul para Discovery, donde no hay Kubernetes. Y Consul tambi\u00e9n muestra la direcci\u00f3n IP de la instancia.<\/p>\n<p><\/p>\n<p><em>Es decir, te basas en la IP, no en el nombre del host?<\/em><\/p>\n<p><\/p>\n<p>No se puede basar en el nombre del host, es decir, hay demasiados. Hay identificadores de instancia \u2013 AE, etc. Se puede encontrar en alguna parte, se puede buscar. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! He entendido que Terraform es una buena herramienta, dise\u00f1ada para la nube.<\/em> <\/p>\n<p><\/p>\n<p>No solo. <\/p>\n<p><\/p>\n<p><em>Esta es precisamente la pregunta que me interesa. Si decides hacer una migraci\u00f3n masiva a Bare Metal con todas tus instancias, \u00bfno habr\u00e1 problemas? \u00bfO deber\u00e1s utilizar otros productos, como Ansible, que se mencion\u00f3 aqu\u00ed?<\/em><\/p>\n<p><\/p>\n<p>Ansible trata de algo diferente. Es decir, Ansible funciona una vez que la instancia ha sido lanzada. Mientras que Terraform trabaja antes de que la instancia se inicie. La migraci\u00f3n a Bare Metal no es posible. <\/p>\n<p><\/p>\n<p><em>Por ahora no, pero llegar\u00e1 un momento en que el negocio dir\u00e1: \u00abVamos a hacerlo\u00bb.<\/em><\/p>\n<p><\/p>\n<p>La migraci\u00f3n a otra nube es viable, pero aqu\u00ed hay un detalle diferente. Necesitas escribir el c\u00f3digo de Terraform de manera que la transici\u00f3n a otra nube sea lo m\u00e1s suave posible. <\/p>\n<p><\/p>\n<p>Al principio, se plante\u00f3 la tarea de que toda nuestra infraestructura fuera agn\u00f3stica, es decir, cualquier nube deber\u00eda ser viable, pero en alg\u00fan momento el negocio se rindi\u00f3 y dijo: \u00abEst\u00e1 bien, en los pr\u00f3ximos N a\u00f1os no nos moveremos de aqu\u00ed, podemos usar los servicios de Amazon\u00bb.<\/p>\n<p><\/p>\n<p>Terraform permite crear trabajos en Front-End, configurar PagerDuty, data doc, etc. Tiene muchas funcionalidades. Pr\u00e1cticamente puede controlar todo.<\/p>\n<p><\/p>\n<p><em>\u00a1Gracias por la presentaci\u00f3n! Yo tambi\u00e9n he estado usando Terraform durante 4 a\u00f1os. En la etapa de transici\u00f3n a Terraform, a la infraestructura, a la descripci\u00f3n declarativa, enfrentamos situaciones donde alguien hac\u00eda algo manualmente y t\u00fa intentabas hacer un plan. Y obtuviste alg\u00fan tipo de error. \u00bfC\u00f3mo manejan esos problemas? \u00bfC\u00f3mo encuentran recursos perdidos que estaban especificados?<\/em><\/p>\n<p><\/p>\n<p>Principalmente a mano y a ojo; si vemos algo extra\u00f1o en el informe, analizamos qu\u00e9 est\u00e1 sucediendo, o simplemente lo eliminamos. En general, los pull requests son algo com\u00fan. <\/p>\n<p><\/p>\n<p><em>Si hay un error, \u00bfrealizan un rollback? \u00bfHan intentado hacerlo?<\/em><\/p>\n<p><\/p>\n<p>No, esa es una decisi\u00f3n del momento cuando la persona ve el problema.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524712\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\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\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\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\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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=\"2020-10-24T12:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:49+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\udd47Patrones en Terraform para combatir el caos y la rutina manual. Maxim Kostrikin (Ixtens) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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":"2020-10-24T12:42:52+00:00","article:modified_time":"2020-11-17T22:58:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98123","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:04:35","updated":"2022-09-29 03:09:38","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\/98123","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=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}