{"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\/it\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Rappresentare l'infrastruttura in codice in un formato testuale ripetibile \u00e8 una pratica migliore semplice che non richiede un mouse. Questa pratica \u00e8 stata battezzata come \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, e al momento, per realizzarla, soprattutto in AWS, ci sono due strumenti popolari: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Confronto l'esperienza di lavoro con Terraform e CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Prima di arrivare a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (ovvero <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) ho lavorato <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">in una startup<\/a><\/noindex> e per circa tre anni ho usato Terraform. Nel mio nuovo lavoro ho continuato a usare Terraform, ma poi l'azienda ha spinto per passare a tutto quanto a-lla Amazon, incluso CloudFormation. Ho lavorato duramente per sviluppare buone pratiche sia per l'uno che per l'altro, e ho utilizzato entrambi gli strumenti in processi lavorativi molto complessi su scala aziendale. In seguito, riflettendo sulle conseguenze del passaggio da Terraform a CloudFormation, mi sono reso conto che Terraform \u00e8 probabilmente la scelta migliore per un'organizzazione.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform Terribile<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Versione Beta del software<\/h3>\n<p><\/p>\n<p>Terraform non ha nemmeno ancora raggiunto la versione 1.0, e questo \u00e8 un motivo valido per non utilizzarlo. Da quando l'ho provato per la prima volta, \u00e8 cambiato molto, ma all'epoca <code>terraform apply<\/code> spesso si rompono dopo alcuni aggiornamenti o semplicemente dopo un paio di anni di utilizzo. Direi che 'ora tutto \u00e8 cambiato', ma\u2026 cos\u00ec dicono tutti, vero? Ci sono modifiche non compatibili con le versioni precedenti, anche se sono appropriate, e ho addirittura la sensazione che la sintassi e le astrazioni degli archivi siano ora adeguate. Lo strumento sembra effettivamente essere migliorato, ma\u2026 :-0<\/p>\n<p><\/p>\n<p>D'altra parte, AWS ha fatto un buon lavoro nel mantenere la compatibilit\u00e0 con le versioni precedenti. Probabilmente perch\u00e9 i loro servizi vengono spesso testati a fondo all'interno dell'organizzazione e solo successivamente, rinominati, pubblicati. Quindi, 'hanno fatto un buon lavoro' \u00e8 ancora un eufemismo. Mantenere la compatibilit\u00e0 con le versioni precedenti delle API per un sistema complesso e multi-variabile come AWS \u00e8 incredibilmente difficile. Chiunque abbia dovuto mantenere API pubbliche cos\u00ec diffuse dovrebbe capire quanto sia difficile farlo per tanti anni. E di CloudFormation, a memoria, non ho mai visto cambiamenti nel corso degli anni.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Fai conoscenza, gamba\u2026 \u00e8 un proiettile<\/h3>\n<p><\/p>\n<p>Per quanto ne so, eliminare una risorsa <strong>esterna<\/strong> Non \u00e8 possibile importare uno stack CloudFormation in un altro stack CF. La situazione \u00e8 simile con Terraform. Esso consente di importare risorse esistenti nel proprio stack. Una funzione, si pu\u00f2 dire, straordinaria, ma con grande potere arriva anche una grande responsabilit\u00e0. Non si pu\u00f2 semplicemente aggiungere una risorsa allo stack, e mentre si lavora con il proprio stack, non \u00e8 possibile eliminare o modificare quella risorsa. Una volta ci\u00f2 ha avuto delle conseguenze. Qualcuno su Twitch, senza intenzioni maligne, ha accidentalmente importato un gruppo di sicurezza AWS di qualcun altro nel proprio stack Terraform. Ha eseguito un paio di comandi e\u2026 il gruppo di sicurezza (insieme al traffico in ingresso) \u00e8 scomparso.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Il Grande<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Ripristino da stati incompleti<\/h3>\n<p><\/p>\n<p>A volte CloudFormation non riesce a passare completamente da uno stato all'altro. In questo caso tenta di tornare indietro. Peccato che a volte non sia realizzabile. Debuggare ci\u00f2 che ne risulta pu\u00f2 essere un po' spaventoso: non si sa mai se CloudFormation sar\u00e0 contento di essere manomesso, anche se per ripararlo. E se riuscir\u00e0 a tornare allo stato precedente, non lo sa bene e di default rimane ore in attesa di un miracolo.<\/p>\n<p><\/p>\n<p>Terraform, al contrario, tende a recuperare in modo pi\u00f9 elegante dopo passaggi non riusciti e offre strumenti di debug avanzati.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Modifiche pi\u00f9 chiare negli stati del documento<\/h3>\n<p><\/p>\n<blockquote><p>'Va bene, bilanciatore di carico, ti stai evolvendo. Ma come?'<\/p>\n<p>\u2014 ingegnere preoccupato, pronto a premere il pulsante 'accetta'.<\/p><\/blockquote>\n<p>A volte devo fare alcune manovre con il bilanciatore di carico nello stack CloudFormation, come aggiungere un numero di porta o modificare il gruppo di sicurezza. CloudFormation visualizza le modifiche in modo poco chiaro. Io, sull'orlo di un attacco di nervi, controllo il file yaml almeno dieci volte per assicurarmi di non aver cancellato nulla di necessario e di non aver aggiunto nulla di superfluo.<\/p>\n<p><\/p>\n<p>Terraform \u00e8 molto pi\u00f9 trasparente in questo senso. A volte \u00e8 addirittura troppo trasparente (leggi: irritante). Fortunatamente, nell'ultima versione \u00e8 stata inclusa una visualizzazione migliorata delle modifiche \u2014 ora \u00e8 chiaro cosa sta cambiando.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flessibilit\u00e0<\/h3>\n<p><\/p>\n<blockquote><p>Scrivi software al contrario.<\/p><\/blockquote>\n<p>Detto chiaramente, la caratteristica distintiva pi\u00f9 importante di un software a lungo termine \u00e8 la capacit\u00e0 di adattarsi ai cambiamenti. Qualsiasi software deve essere scritto al contrario. Mi sono spesso sbagliato prendendo un servizio 'semplice', per poi cercare di adattarlo all'interno di un unico stack CloudFormation o Terraform. E ovviamente, dopo mesi, emergeva che avevo frainteso tutto, e il servizio non era affatto semplice! E ora ho bisogno di suddividere in qualche modo un grande stack in parti pi\u00f9 piccole. Quando si lavora con CloudFormation, questo \u00e8 possibile solo ricreando preliminarmente lo stack esistente, e questo io, con i miei DB, non lo faccio. Terraform invece permetteva di sezionare lo stack e di scomporlo in parti pi\u00f9 comprensibili.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Moduli in git<\/h3>\n<p><\/p>\n<p>Condividere codice Terraform tra numerosi stack \u00e8 molto pi\u00f9 facile che con codice CloudFormation. Con Terraform puoi mettere il codice in un repository git e accedervi utilizzando il controllo versione semantico. Chiunque abbia accesso a questo repository pu\u00f2 riutilizzare il codice condiviso. L'equivalente in CloudFormation \u00e8 S3, ma non ha gli stessi vantaggi e non c'\u00e8 alcuna ragione per cui dovremmo rinunciare a git a favore di S3.<\/p>\n<p><\/p>\n<p>L'organizzazione cresce e la capacit\u00e0 di condividere stack comuni ha raggiunto un livello critico. Con Terraform tutto ci\u00f2 avviene in modo facile e naturale, mentre CloudFormation ti costringer\u00e0 a saltare attraverso anelli prima che tu possa ottenere qualcosa di simile.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operazioni come codice<\/h3>\n<p><\/p>\n<blockquote><p>'Scriptiamo e va bene'.<\/p>\n<p>- ingegnere tre anni prima di inventare il 'ciclo' Terraform.<\/p><\/blockquote>\n<p>Quando si parla di sviluppo software, Go o un programma in Java non sono solo codice.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Codice come codice<\/em><\/p>\n<p><\/p>\n<p>Esiste anche l'infrastruttura su cui esso funziona.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito\" 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>Ma da dove proviene? Come monitorarla? Dove risiede il tuo codice? I programmatori hanno bisogno di permessi per accedervi?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operazioni come codice<\/em><\/p>\n<p><\/p>\n<blockquote><p>Essere un sviluppatore di software non significa semplicemente scrivere codice.<\/p><\/blockquote>\n<p>Non \u00e8 solo AWS: sicuramente utilizzi anche i servizi di altri fornitori. SignalFx, PagerDuty o Github. Forse hai un server Jenkins interno per CI\/CD o un pannello di controllo Grafana interno per il monitoraggio. L'infra come codice viene scelto per diversi motivi, e ognuno \u00e8 ugualmente importante per tutto ci\u00f2 che riguarda il software.<\/p>\n<p><\/p>\n<p>Quando lavoravo in Twitch, acceleravamo i servizi all'interno di sistemi embedded misti e dei sistemi AWS di Amazon. Creavamo e mantenevamo numerosi microservizi, aumentando i costi operativi. Le discussioni si tenevano pi\u00f9 o meno in questi termini:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Io<\/strong>: Accidenti, troppe manovre per avviare un solo microservizio. Dovr\u00f2 usare questa cosa per creare un account AWS (stavamo puntando a 2 account su <strong>microservizio<\/strong>), poi questo \u2014 per la configurazione delle notifiche, quest'altro \u2014 per il repository di codice, e questo \u2014 per l'elenco degli indirizzi e-mail, e quest'altro\u2026<\/li>\n<li><strong>Lead<\/strong>: Scriptiamolo e basta.<\/li>\n<li><strong>Io<\/strong>: Va bene, ma lo script stesso cambier\u00e0. Ci vorr\u00e0 un modo per verificare che tutte queste cose integrate da Amazon siano aggiornate.<\/li>\n<li><strong>Lead<\/strong>: Sembra una buona idea. E per questo scriviamo uno script.<\/li>\n<li><strong>Io<\/strong>: Ottimo! Ma allo script serviranno sicuramente dei parametri. Li accetter\u00e0?<\/li>\n<li><strong>Lead<\/strong>: Certo che li accetter\u00e0, non pu\u00f2 fare altrimenti!<\/li>\n<li><strong>Io<\/strong>: Il processo pu\u00f2 cambiare, potrebbe perdere la retrocompatibilit\u00e0. Servir\u00e0 un qualche tipo di controllo semantico delle versioni.<\/li>\n<li><strong>Lead<\/strong>: Ottima idea!<\/li>\n<li><strong>Io<\/strong>: Gli strumenti possono essere modificati manualmente, all'interno dell'interfaccia utente. Ci servir\u00e0 un modo per controllare e correggere questo.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 anni dopo:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: E cos\u00ec \u00e8 nato Terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>La morale della favola \u00e8: anche se sei <strong>in pieno nell\u2019universo di Amazon<\/strong>, utilizzi comunque qualcosa che non proviene da AWS, e questi servizi hanno uno stato che usa un linguaggio per la configurazione, per sincronizzare tale stato.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs moduli git di terraform<\/h3>\n<p><\/p>\n<p>la lambda \u00e8 la soluzione di CloudFormation per la logica personalizzata. Con la lambda puoi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">creare macro<\/a><\/noindex> o <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">risorsa personalizzata<\/a><\/noindex>. Questo approccio presenta complessit\u00e0 aggiuntive che non esistono nel controllo semantico delle versioni dei moduli git in Terraform. Per me, il problema pi\u00f9 urgente \u00e8 stata la gestione dei permessi per tutte queste lambda personalizzate (che sono decine di account AWS). Un\u2019altra questione di importanza \u00e8 stata il dilemma del tipo '\u00e8 nato prima l\u2019uovo o la gallina?': era legata al codice lambda. Questa funzione \u00e8 sia infrastruttura che codice, e necessita di monitoraggio e aggiornamenti. L'ultimo chiodo nella bara \u00e8 stata la difficolt\u00e0 nell'aggiornamento semantico delle modifiche al codice lambda; era necessario anche garantire che le azioni dello stack non cambiassero tra i lanci senza un comando diretto.<\/p>\n<p><\/p>\n<p>Ricordo che un giorno ho voluto creare un deploy canarino per l'ambiente Elastic Beanstalk con un classico bilanciatore di carico. Sarebbe stato pi\u00f9 semplice realizzare un secondo deployment per EB accanto all'ambiente di produzione, compiendo un ulteriore passo: unire automaticamente il gruppo scalabile del canary deploy con il bilanciatore di carico del deployment in produzione. E poich\u00e9 Terraform utilizza <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk come output<\/a><\/noindex>, questo richieder\u00e0 4 righe di codice aggiuntive in Terraform. Quando ho chiesto se c'era una soluzione comparabile in CloudFormation, mi hanno indicato un intero repository su git con un pipeline di deployment e altro: e tutto questo \u2014 per ci\u00f2 che avrebbero potuto fare 4 povere righe di codice in Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Rileva meglio il drift<\/h3>\n<p><\/p>\n<blockquote><p>Assicurati che la realt\u00e0 corrisponda alle aspettative.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Rilevamento del drift<\/a><\/noindex> \u00e8 una funzione molto potente delle operations as code, poich\u00e9 aiuta a garantire che la realt\u00e0 corrisponda alle aspettative. \u00c8 disponibile sia con CloudFormation che con Terraform. Ma man mano che la pila di lavoro cresce, la ricerca del drift in CloudFormation produceva sempre pi\u00f9 falsi positivi.<\/p>\n<p><\/p>\n<p>Con Terraform hai hook del ciclo di vita molto pi\u00f9 avanzati per la rilevazione del drift. Ad esempio, puoi digitare il comando <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> direttamente nella definizione del task ECS, se desideri ignorare le modifiche nella definizione di un particolare task, senza ignorare nel contempo le modifiche all'intero deployment ECS.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK e il futuro di CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation \u00e8 difficile da gestire su larga scala inter-infrastrutturale. Molte di queste difficolt\u00e0 sono state riconosciute, e lo strumento necessita di cose come <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, una struttura per definire l'infrastruttura cloud nel codice e implementarli tramite AWS CloudFormation. Sar\u00e0 interessante vedere cosa riserva il futuro per aws-cdk, ma avr\u00e0 difficolt\u00e0 a competere con altri vantaggi di Terraform; per allineare CloudFormation ci vorranno cambiamenti globali.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Per evitare che Terraform deluda<\/h3>\n<p><\/p>\n<blockquote><p>Questo \u00e8 'infrastruttura come CODICE', non 'come testo'.<\/p><\/blockquote>\n<p>La mia prima impressione di Terraform \u00e8 stata piuttosto negativa. Penso che semplicemente non avessi compreso l'approccio. Quasi tutti gli ingegneri iniziano a percepirlo involontariamente come un formato di testo da trasformare nell'infrastruttura desiderata. NON \u00c8 COS\u00cc.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Le verit\u00e0 fondamentali di un buon sviluppo software si applicano anche a Terraform<\/h3>\n<p><\/p>\n<p>Ho notato che molte pratiche, adottate per scrivere codice di qualit\u00e0, vengono ignorate in Terraform. Hai studiato per anni per diventare un buon programmatore. Non rinunciare a questa esperienza solo perch\u00e9 stai lavorando con Terraform. I principi fondamentali di una buona sviluppo software si applicano anche a Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Come si pu\u00f2 scrivere codice senza documentarlo?<\/h3>\n<p><\/p>\n<p>Ho visto enormi stack Terraform completamente privi di documentazione. Come si pu\u00f2 scrivere codice per pagine intere senza alcuna documentazione? Aggiungi documentazione che spiega il tuo <strong>codice<\/strong> Terraform (l'accento qui \u00e8 sulla parola 'codice'), perch\u00e9 questa sezione \u00e8 cos\u00ec importante e cosa state facendo.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Come puoi implementare servizi che una volta erano un'unica grande funzione main()?<\/h3>\n<p><\/p>\n<p>Ho incontrato stack Terraform molto complessi presentati come un unico modulo. Perch\u00e9 non implementiamo il software in questo modo? Perch\u00e9 scomponiamo funzioni grandi in pezzi pi\u00f9 piccoli? Le stesse risposte sono valide anche per Terraform. Se il tuo modulo \u00e8 troppo grande, devi dividerlo in moduli pi\u00f9 piccoli.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">La tua azienda non utilizza librerie?<\/h3>\n<p><\/p>\n<p>Ho visto ingegneri lanciarsi in un nuovo progetto utilizzando Terraform, che semplicemente copiavano e incollavano enormi porzioni da altri progetti nei propri, e poi le modificavano finch\u00e9 non funzionavano. Voi nella vostra azienda lavorereste in questo modo con il 'codice di produzione'? Non utilizziamo le librerie a caso. S\u00ec, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">non tutto deve essere una libreria,<\/a><\/noindex> ma dove saremmo senza librerie comuni in generale?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Non segui PEP8 o gofmt?<\/h3>\n<p><\/p>\n<p>Nella maggior parte dei linguaggi c'\u00e8 uno standard di formattazione accettato. In Python \u00e8 PEP8. In Go \u00e8 gofmt. Terraform ha il suo: <code>terraform fmt<\/code>. Usalo liberamente! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Utilizzeresti React senza conoscere JavaScript?<\/h3>\n<p><\/p>\n<p>I moduli Terraform possono semplificare alcune parti della complessa infrastruttura che stai creando, ma ci\u00f2 non significa che puoi ignorarne completamente il funzionamento. Vuoi usare Terraform correttamente senza comprendere le risorse? Sei destinato a fallire: il tempo passer\u00e0 e non riuscirai mai a padroneggiare Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Scrivi codice con singleton, o iniettando dipendenze?<\/h3>\n<p><\/p>\n<p>L'iniezione delle dipendenze \u00e8 una pratica riconosciuta come migliore per lo sviluppo del software, preferita dai singleton. Come pu\u00f2 essere utile in Terraform? Ho incontrato moduli Terraform che dipendono da uno stato remoto. Invece di scrivere moduli che estraggono dallo stato remoto, scrivi un modulo che accetta parametri. Poi passa questi parametri al modulo.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Le tue librerie fanno dieci cose bene o una \u2014 eccellente?<\/h3>\n<p><\/p>\n<p>Le librerie funzionano meglio quando si concentrano su un singolo compito che eseguono in modo eccellente. Invece di scrivere grandi moduli Terraform che cercano di fare tutto e subito, costruisci parti che fanno bene qualcosa di specifico. E poi combinane cos\u00ec come serve.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Come apporti modifiche alle librerie senza retrocompatibilit\u00e0?<\/h3>\n<p><\/p>\n<p>Un modulo Terraform generale, come una qualsiasi libreria, deve trovare un modo per comunicare agli utenti le modifiche senza retrocompatibilit\u00e0. Quando ci sono modifiche nelle librerie, \u00e8 fastidioso, e lo \u00e8 altrettanto quando si apportano modifiche senza retrocompatibilit\u00e0 nei moduli Terraform. Si consiglia di utilizzare git tags e semver quando si usano i moduli Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Il servizio di produzione \u00e8 in esecuzione sul tuo laptop o nel data center?<\/h3>\n<p><\/p>\n<p>Hashicorp ha strumenti come <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> per eseguire il tuo terraform. Questi servizi centralizzati semplificano la gestione, l'audit e l'approvazione delle modifiche terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Non scrivi test?<\/h3>\n<p><\/p>\n<p>Gli ingegneri riconoscono che il codice deve essere testato, ma spesso trascurano i controlli mentre lavorano con Terraform. Per l'infrastruttura, questo comporta momenti insidiosi. Consiglio di 'testare' o 'creare esempi' di stack utilizzando moduli che possono essere correttamente distribuiti per la verifica durante CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform e microservizi<\/h3>\n<p><\/p>\n<blockquote><p>La vita e la morte delle aziende di microservizi dipende dalla velocit\u00e0, dall'aggiornamento e dalla distruzione di nuovi stack lavorativi di microservizi.<\/p><\/blockquote>\n<p>Il punto negativo pi\u00f9 comune associato alle architetture a microservizi, dal quale non ci si pu\u00f2 liberare, \u00e8 legato al lavoro e non al codice. Se consideri Terraform solo come un modo per automatizzare l'aspetto infrastrutturale dell'architettura a microservizi, ti privi dei veri vantaggi di questo sistema. Oggi gi\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">tutto \u2014 come codice<\/a><\/noindex>.<\/p>\n<p>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Sono passato da Terraform a CloudFormation \u2014 e me ne sono pentito | ProHoster","description":"Rappresentare l'infrastruttura come codice in un formato testuale ripetibile \u00e8 una pratica migliore semplice per i sistemi, con cui non \u00e8 necessario spostarsi con il mouse.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}