{"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>Presentare l'infrastruttura come codice in un formato di testo ripetibile \u00e8 una delle migliori pratiche per i sistemi che non richiedono un'interazione visiva. Questa pratica \u00e8 conosciuta come <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, e per implementarla, specialmente 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 tra 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 utilizzato Terraform. Nel mio nuovo posto ho continuato a utilizzare Terraform, ma poi l'azienda ha spinto per una transizione verso tutto ci\u00f2 che era simile ad Amazon, incluso CloudFormation. Ho lavorato duramente per sviluppare le migliori pratiche per entrambi, utilizzando entrambi gli strumenti in processi lavorativi molto complessi su scala organizzativa. In seguito, riflettendo attentamente sulle implicazioni del passaggio da Terraform a CloudFormation, mi sono reso conto che Terraform \u00e8 probabilmente la scelta migliore per l'organizzazione.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform \u00e8 terribile<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Beta software<\/h3>\n<p><\/p>\n<p>Terraform non ha ancora rilasciato la versione 1.0, e questo \u00e8 un motivo valido per non usarlo. Da quando l'ho provato per la prima volta, \u00e8 molto cambiato, ma allora ancora <code>terraform apply<\/code> spesso si rompe dopo alcuni aggiornamenti o semplicemente dopo un paio d'anni di utilizzo. Direi che \"adesso \u00e8 tutto diverso\", ma... cos\u00ec dicono tutti, giusto? Ci sono cambiamenti incompatibili con le versioni precedenti, anche se sono appropriati, e si ha quasi la sensazione che la sintassi e le astrazioni del repository siano ora ci\u00f2 che serviva. Lo strumento sembra essere davvero migliorato, ma...<\/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 testati accuratamente all'interno dell'organizzazione e solo successivamente pubblicati con un nuovo nome. Quindi, \"sta facendo bene\" \u00e8 ancora un modo per dire poco. Mantenere la compatibilit\u00e0 con le versioni precedenti dell'API per un sistema complesso e variegato come AWS \u00e8 incredibilmente difficile. Chiunque abbia dovuto mantenere API pubbliche utilizzate cos\u00ec ampiamente dovrebbe capire quanto sia difficile farlo per tanti anni. E il comportamento di CloudFormation, a mia memoria, non \u00e8 mai cambiato nel tempo.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Ehi, piede\u2026 questa \u00e8 una pallottola<\/h3>\n<p><\/p>\n<p>Per quanto ne so, rimuovere risorsa <strong>esterna<\/strong> \u00c8 impossibile importare uno stack CloudFormation nel proprio stack CF. La situazione \u00e8 simile con Terraform. Consente di importare risorse esistenti nel proprio stack. Questa funzione \u00e8, si pu\u00f2 dire, straordinaria, ma con grande potere arrivano anche grandi responsabilit\u00e0. Non si pu\u00f2 modificare o eliminare una risorsa una volta che \u00e8 stata inserita nello stack mentre si lavora sullo stesso. Una volta, \u00e8 successo qualcosa di simile. Qualcuno su Twitch, senza cattive intenzioni, ha accidentalmente importato un gruppo di sicurezza AWS nel proprio stack Terraform. Ha eseguito alcuni comandi e... il gruppo di sicurezza (insieme al traffico in entrata) \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 a un altro. Cercher\u00e0 di tornare allo stato precedente. Peccato che non sia sempre possibile. \u00c8 piuttosto preoccupante dover debugare quello che ne risulta: non si sa mai se CloudFormation sar\u00e0 contento di essere \u201chackerato\u201d \u2014 anche se per ripararlo. E non riesce nemmeno a determinare se sar\u00e0 possibile tornare allo stato precedente e, per default, rimane in attesa di un miracolo per ore.<\/p>\n<p><\/p>\n<p>Terraform, al contrario, tende a riprendersi dopo transizioni fallite in modo pi\u00f9 elegante e offre un set di strumenti di debug avanzato.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Cambiamenti pi\u00f9 chiari nello stato del documento<\/h3>\n<p><\/p>\n<blockquote><p>\"Va bene, bilanciatore di carico, tu ti cambi. Ma come?\"<\/p>\n<p>- un ingegnere preoccupato, pronto a premere il pulsante \"accettare\".<\/p><\/blockquote>\n<p>A volte ho bisogno di fare alcune manovre con il bilanciatore di carico nello stack CloudFormation \u2014 ad esempio, aggiungere un numero di porta o modificare il gruppo di sicurezza. Le modifiche in CloudFormation sono poco visibili. Io, come un nervoso, 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>In questo senso, Terraform \u00e8 molto pi\u00f9 trasparente. A volte \u00e8 persino troppo trasparente (leggi: fastidioso). Fortunatamente, l'ultima versione ha introdotto un miglioramento nella visualizzazione delle modifiche \u2014 ora \u00e8 chiaro cosa viene cambiato.<\/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 in modo diretto, la caratteristica distintiva pi\u00f9 importante di un software duraturo \u00e8 la capacit\u00e0 di adattarsi ai cambiamenti. Qualsiasi software, scrivetelo al contrario. Io di solito mi sono imbattuto nel problema di prendere un servizio \"semplice\" e poi provare a inglobarlo in un unico stack CloudFormation o Terraform. E naturalmente, dopo mesi, si scopriva che avevo capito tutto male e il servizio non era affatto semplice! E quindi avevo bisogno di qualche modo per suddividere un grande stack in piccole componenti. Quando lavori con CloudFormation, questo \u00e8 possibile solo ricostruendo prima lo stack esistente, cosa che io non faccio con i miei database. Terraform, invece, permetteva di disassemblare lo stack e segmentarlo 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 il codice Terraform tra molteplici stack \u00e8 molto pi\u00f9 semplice rispetto al codice CloudFormation. Con Terraform \u00e8 possibile mettere il codice in un repository git e accedervi utilizzando il controllo versione semantico. Chiunque abbia accesso a quel repository pu\u00f2 riutilizzare il codice condiviso. L'equivalente in CloudFormation \u00e8 S3, ma non ha gli stessi vantaggi e non c'\u00e8 alcun motivo per cui dovremmo rinunciare al git in favore di S3.<\/p>\n<p><\/p>\n<p>L'organizzazione \u00e8 cresciuta e la capacit\u00e0 di condividere stack comuni ha raggiunto un livello critico. Con Terraform tutto questo risulta facile e naturale, mentre CloudFormation richiede di saltare attraverso anelli prima che si possa avere qualcosa di simile.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operazioni come codice<\/h3>\n<p><\/p>\n<blockquote><p>\"Scripting e via cos\u00ec\".<\/p>\n<p>\u2014 un ingegnere tre anni prima di inventare il 'ciclo' Terraform.<\/p><\/blockquote>\n<p>Quando si tratta di sviluppo software, Go o un programma in Java non sono semplicemente 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>C'\u00e8 anche l'infrastruttura su cui 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 viene? Come si monitora? Dove risiede il tuo codice? Serve l'autorizzazione degli sviluppatori per l'accesso?<\/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 uno sviluppatore software non significa solo scrivere codice.<\/p><\/blockquote>\n<p>Non \u00e8 solo AWS: sicuramente stai usando 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 as Code viene scelto per vari motivi, e ciascuno di essi \u00e8 altrettanto importante per tutto ci\u00f2 che riguarda il software.<\/p>\n<p><\/p>\n<p>Quando lavoravo a Twitch, facevamo accelerare i servizi all'interno di sistemi ibridi e dei sistemi AWS di Amazon. Creavamo e gestivamo numerosi microservizi, aumentando i costi operativi. Le discussioni avvenivano pi\u00f9 o meno in questo modo:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Io<\/strong>: Cavolo, troppe operazioni per far partire un solo microservizio. Dovr\u00f2 usare questa cosa per creare un account AWS (stiamo puntando a 2 account su <strong>microservizio<\/strong>), poi questo \u2014 per configurare le notifiche, quest'altro \u2014 per il repository di codice, e questo \u2014 per l'elenco degli indirizzi email, e poi quest'ultimo...<\/li>\n<li><strong>Lead<\/strong>: Scriptiamo 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 piccole cose di Amazon abbiano uno stato attuale.<\/li>\n<li><strong>Lead<\/strong>: Non suona male. E per questo scriviamo uno script.<\/li>\n<li><strong>Io<\/strong>: Ottimo! E sicuramente lo script avr\u00e0 bisogno di parametri. Li accetter\u00e0?<\/li>\n<li><strong>Lead<\/strong>: Certo che s\u00ec, non ci sono problemi!<\/li>\n<li><strong>Io<\/strong>: Il processo potrebbe cambiare, si perder\u00e0 la retrocompatibilit\u00e0. Ci vorr\u00e0 qualche forma di controllo semantico delle versioni.<\/li>\n<li><strong>Lead<\/strong>: Ottima idea!<\/li>\n<li><strong>Io<\/strong>: Gli strumenti possono essere cambiati manualmente, all'interno dell'interfaccia utente. Avremo bisogno di 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 abbiamo finito per usare terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>La morale della favola \u00e8 che, anche se sei <strong>inondato da tutto ci\u00f2 che \u00e8 Amazon<\/strong>stai comunque utilizzando qualcosa che non proviene da AWS, e questi servizi hanno uno stato che utilizza il linguaggio per la configurazione, per sincronizzare quello stato.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs moduli git terraform<\/h3>\n<p><\/p>\n<p>lambda \u00e8 la soluzione CloudFormation per la logica degli utenti. Con 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 ulteriori complessit\u00e0 che non ci sono nel controllo semantico delle versioni dei moduli git in Terraform. Per me il problema pi\u00f9 urgente \u00e8 diventato la gestione delle autorizzazioni per tutte queste lambda personalizzate (e sono decine di account AWS). Un altro problema principale \u00e8 stata la questione del \"cosa \u00e8 venuto prima \u2014 l'uovo o la gallina?\": era legata al codice lambda. Questa funzione stessa \u00e8 sia infrastruttura che codice, e ha bisogno di monitoraggio e aggiornamenti. L'ultimo chiodo nella bara \u00e8 stata la difficolt\u00e0 nel mantenere aggiornati semanticamente i cambiamenti del codice lambda; bisognava anche assicurarsi che le azioni dello stack non cambiassero tra le esecuzioni 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 bilanciatore di carico classico. La soluzione pi\u00f9 semplice sarebbe stata fare un secondo deployment per EB accanto all'ambiente di produzione, facendo un ulteriore passo: unire il gruppo di deploy canarino scalabile automaticamente con il LB del deployment nell'ambiente di produzione. E dato che Terraform utilizza <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG bean talk come output<\/a><\/noindex>, questo richiederebbe 4 righe di codice extra in Terraform. Quando ho chiesto se esisteva una soluzione comparabile in CloudFormation, mi hanno indicato un intero repository su git con un pipeline di deploy e altro: tutto ci\u00f2 per quanto avremmo potuto fare con 4 sfortunate righe di codice 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> \u2014 \u00e8 una funzione molto potente delle operations as code, perch\u00e9 aiuta a garantire che la realt\u00e0 corrisponda alle aspettative. \u00c8 disponibile sia con CloudFormation che con Terraform. Ma man mano che lo stack cresce, la ricerca del drift in CloudFormation restituiva 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, introduci il comando <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> nel caso in cui si voglia ignorare le modifiche nella definizione di un'attivit\u00e0 specifica, senza ignorare le modifiche a tutto il deployment di 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 e tra infrastrutture diverse. Molti di questi problemi sono riconosciuti, e lo strumento necessita di elementi 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 gestirla tramite AWS CloudFormation. Sar\u00e0 interessante vedere cosa riserva il futuro per aws-cdk, ma avr\u00e0 difficolt\u00e0 a competere con i vantaggi di Terraform; saranno necessarie trasformazioni globali per rendere CloudFormation competitivo.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Affinch\u00e9 Terraform non 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. Credo semplicemente di non aver capito l'approccio. Quasi tutti gli ingegneri inizialmente lo percepiscono involontariamente come un formato testuale che deve essere trasformato 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 della buona 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 quest'esperienza solo perch\u00e9 stai lavorando con Terraform. Le verit\u00e0 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 documentazione?<\/h3>\n<p><\/p>\n<p>Ho visto enormi stack di Terraform completamente privi di documentazione. Come si pu\u00f2 scrivere codice per pagine intere senza alcuna documentazione? Aggiungi documentazione che spieghi il tuo <strong>codice<\/strong> Terraform (l'enfasi qui \u00e8 sulla parola \"codice\"), perch\u00e9 questa sezione \u00e8 cos\u00ec importante, e cosa stai facendo.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Come si possono implementare servizi che una volta erano tutte in un'unica funzione main()?<\/h3>\n<p><\/p>\n<p>Ho trovato stack di Terraform molto complessi presentati come un unico modulo. Perch\u00e9 non implementiamo software in questo modo? Perch\u00e9 suddividiamo grandi funzioni in parti pi\u00f9 piccole? Le stesse risposte valgono anche per Terraform. Se un modulo \u00e8 troppo grande, \u00e8 necessario suddividerlo 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 sviluppare nuovi progetti con Terraform copiando e incollando enormi pezzi da altri progetti nei propri, e poi armeggiando finch\u00e9 non funzionava. Voi nella vostra azienda lavorereste realmente in questo modo con il codice \"di produzione\"? Non usiamo le librerie per niente. 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 linea di principio?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Non usate PEP8 o gofmt?<\/h3>\n<p><\/p>\n<p>Nella maggior parte dei linguaggi esiste uno schema di formattazione standard accettato. In Python \u00e8 PEP8. In Go \u2014 gofmt. Terraform ha il suo: <code>terraform fmt<\/code>. Usatelo pure! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Iniziereste a usare React senza conoscere JavaScript?<\/h3>\n<p><\/p>\n<p>I moduli Terraform possono semplificare alcune parti dell'infrastruttura complessa che state creando, ma ci\u00f2 non significa che non dovete capirci nulla. Volete usare Terraform correttamente senza comprendere le risorse? Siete destinati a fallire: il tempo passer\u00e0 e non vi abituerete mai a Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Scrivete singleton o state iniettando dipendenze?<\/h3>\n<p><\/p>\n<p>L'iniezione delle dipendenze \u00e8 una best practice riconosciuta nello sviluppo software, particolarmente apprezzata nei singleton. Come pu\u00f2 tornare utile in Terraform? Ho incontrato moduli Terraform che dipendono dallo stato remoto. Invece di scrivere moduli che estraggono dallo stato remoto, crea 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 \u2013 eccellente?<\/h3>\n<p><\/p>\n<p>Le librerie funzionano meglio quando si concentrano su un compito che eseguono alla perfezione. Invece di scrivere grandi moduli Terraform che cercano di fare tutto in una volta, compila parti che svolgono bene una singola funzione. E poi combinile come necessario.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Come apporti modifiche alle librerie senza compromettere la retrocompatibilit\u00e0?<\/h3>\n<p><\/p>\n<p>Il modulo principale di Terraform, cos\u00ec come una libreria comune, deve comunicare agli utenti le modifiche senza retrocompatibilit\u00e0. Quando si verificano tali cambiamenti nelle librerie, \u00e8 fastidioso, e lo stesso vale quando vengono apportate modifiche senza retrocompatibilit\u00e0 nei moduli di Terraform. Si raccomanda di utilizzare git tags e semver quando si usano i moduli di Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Il servizio di produzione \u00e8 attivo 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 a terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Non stai scrivendo 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 \u00e8 pericoloso. 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 dipendono dalla velocit\u00e0, dagli aggiornamenti e dalla creazione di nuovi stack di lavoro microservizi.<\/p><\/blockquote>\n<p>Il principale aspetto negativo associato alle architetture a microservizi, dal quale non si pu\u00f2 sfuggire, riguarda il lavoro e non il codice. Se si considera Terraform solo come uno strumento per automatizzare l'aspetto infrastrutturale delle architetture a microservizi, ci si priva dei veri vantaggi di questo sistema. Ora \u00e8 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.0.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.0.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 buona pratica semplice per i sistemi, che non richiede l'uso del 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}]}}