{"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\/ro\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Am trecut de la Terraform la CloudFormation \u2014 \u0219i regret","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Reprezentarea infrastructurii ca \u0219i cod \u00eentr-un format text revisibil este o practic\u0103 simpl\u0103, dar esen\u021bial\u0103 pentru sistemele care nu necesit\u0103 interven\u021bie manual\u0103. Aceast\u0103 practic\u0103 poart\u0103 denumirea de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, iar pentru implementarea acesteia, \u00een special \u00een AWS, exist\u0103 dou\u0103 instrumente populare: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Am trecut de la Terraform la CloudFormation \u2014 \u0219i regret\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Compar experien\u021ba mea de lucru cu Terraform \u0219i CloudFormation<\/em><\/p>\n<p><\/p>\n<p>\u00cenainte de a veni la <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (cunoscut \u0219i ca <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) am lucrat <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">\u00eentr-un startup<\/a><\/noindex> \u0219i timp de trei ani am folosit Terraform. La noul loc de munc\u0103 am utilizat din plin Terraform, apoi compania a insistat pentru o tranzi\u021bie c\u0103tre tot ce \u021bine de Amazon, inclusiv CloudFormation. Am dezvoltat cu s\u00e2rguin\u021b\u0103 cele mai bune practici at\u00e2t pentru unul, c\u00e2t \u0219i pentru cel\u0103lalt, \u0219i am utilizat ambele instrumente \u00een procese de lucru extrem de complexe la nivel organiza\u021bional. Ulterior, analiz\u00e2nd cu aten\u021bie consecin\u021bele trecerii de la Terraform la CloudFormation, am realizat c\u0103 Terraform este probabil cea mai bun\u0103 alegere pentru o organiza\u021bie.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform este teribil<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Versiunea beta a software-ului<\/h3>\n<p><\/p>\n<p>Terraform nici m\u0103car nu are o versiune 1.0, ceea ce este un motiv \u00eentemeiat pentru a nu-l folosi. De c\u00e2nd l-am \u00eencercat pentru prima dat\u0103, s-a schimbat foarte mult, dar atunci era \u00eenc\u0103 <code>terraform apply<\/code> se strica adesea dup\u0103 c\u00e2teva actualiz\u0103ri sau pur \u0219i simplu dup\u0103 c\u00e2\u021biva ani de utilizare. A\u0219 spune c\u0103 \u201eacum totul este diferit\u201d, dar... a\u0219a spun to\u021bi, nu? Exist\u0103 modific\u0103ri care nu sunt compatibile cu versiunile anterioare, de\u0219i sunt justificate, iar chiar am sentimentul c\u0103 sintaxa \u0219i abstrac\u021biile pentru resurse sunt acum exact ceea ce trebuie. Instrumentul pare s\u0103 fi devenit \u00eentr-adev\u0103r mai bun, dar... :-0<\/p>\n<p><\/p>\n<p>Pe de alt\u0103 parte, AWS a f\u0103cut eforturi considerabile pentru a men\u021bine compatibilitatea cu versiunile anterioare. Probabil asta se datoreaz\u0103 faptului c\u0103 serviciile lor sunt adesea testate temeinic \u00een cadrul organiza\u021biei \u00eenainte de a fi publicate cu un nou nume. Deci, \u201eau f\u0103cut o treab\u0103 bun\u0103\u201d este o subestimare. Men\u021binerea compatibilit\u0103\u021bii cu versiunile anterioare ale API-ului pentru un sistem at\u00e2t de variat \u0219i complex cum este AWS este incredibil de dificil. Oricine a trebuit s\u0103 men\u021bin\u0103 API-uri publice utilizate at\u00e2t de pe scar\u0103 larg\u0103 ar trebui s\u0103 \u00een\u021beleag\u0103 c\u00e2t de greu este s\u0103 faci acest lucru de-a lungul anilor. Comportamentul CloudFormation, de altfel, nu s-a schimbat deloc \u00een memoria mea de-a lungul anilor.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">\u00cent\u00e2lnirea dintre picior \u0219i... acea glon\u021b<\/h3>\n<p><\/p>\n<p>Din c\u00e2te \u0219tiu, s\u0103 \u0219tergi o resurs\u0103 <strong>extern\u0103<\/strong> Stiva CloudFormation nu poate importa resurse dintr-un alt stack CF. Aproape la fel se prezint\u0103 \u0219i situa\u021bia cu Terraform. Acesta permite importarea resurselor existente \u00een stack-ul s\u0103u. Func\u021bia este, s\u0103 spunem, uimitoare, dar cu o mare putere vine \u0219i o mare responsabilitate. Odat\u0103 ce resursa este ad\u0103ugat\u0103 \u00een stack, nu po\u021bi s\u0103 o \u0219tergi sau s\u0103 o modifici \u00een timp ce lucrezi cu stack-ul t\u0103u. O dat\u0103, acest lucru a avut consecin\u021be. Pe site-ul Twitch, cineva, f\u0103r\u0103 vreo inten\u021bie rea, a importat accidental un grup de securitate AWS \u00een propriul s\u0103u stack Terraform. A introdus c\u00e2teva comenzi \u0219i\u2026 grupul de securitate (inclusiv traficul de intrare) a disp\u0103rut.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Mare<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Restaurarea din st\u0103ri incomplete<\/h3>\n<p><\/p>\n<p>Uneori, CloudFormation nu poate trece complet dintr-o stare \u00een alta. Totu\u0219i, va \u00eencerca s\u0103 revin\u0103 la cea anterioar\u0103. Din p\u0103cate, asta nu este \u00eentotdeauna posibil. Este \u00eenfrico\u0219\u0103tor s\u0103 depanezi apoi ceea ce a rezultat \u2014 niciodat\u0103 nu \u0219tii dac\u0103 CloudFormation va fi mul\u021bumit c\u0103 este manipulat \u2014 chiar \u0219i pentru a repara. Dac\u0103 va reu\u0219i sau nu s\u0103 revin\u0103 la starea anterioar\u0103, nu \u0219tie exact \u0219i, \u00een mod implicit, a\u0219teapt\u0103 minuni zeci de minute.<\/p>\n<p><\/p>\n<p>Terraform, pe de alt\u0103 parte, este mai elegant \u00een recuperarea din tranzi\u021bii nereu\u0219ite \u0219i ofer\u0103 un instrumentar de depanare extins.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Schimb\u0103ri mai clare \u00een st\u0103rile documentului<\/h3>\n<p><\/p>\n<blockquote><p>\u201eBine, echilibrator de sarcin\u0103, tu te schimbi. Dar cum?\u201d<\/p>\n<p>\u2014 inginer \u00eengrijorat, preg\u0103tit s\u0103 apese butonul \u201eaccept\u201d.<\/p><\/blockquote>\n<p>C\u00e2teodat\u0103 trebuie s\u0103 fac c\u00e2teva manevre cu echilibratorul de sarcin\u0103 \u00een stack-ul CloudFormation \u2014 de exemplu, s\u0103 adaug un num\u0103r de port sau s\u0103 schimb grupul de securitate. CloudFormation reflect\u0103 schimb\u0103rile slab. Eu, pe de alt\u0103 parte, verific de fiecare dat\u0103 fi\u0219ierul yaml de zece ori pentru a m\u0103 asigura c\u0103 nu am \u0219ters nimic esen\u021bial \u0219i c\u0103 nu am ad\u0103ugat ceva necorespunz\u0103tor.<\/p>\n<p><\/p>\n<p>Terraform este mult mai transparent \u00een acest sens. Uneori este chiar prea transparent (cite\u0219te: enervant). Din fericire, ultima versiune a inclus o \u00eembun\u0103t\u0103\u021bire a vizualiz\u0103rii schimb\u0103rilor \u2014 acum este clar ce se modific\u0103.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibilitate<\/h3>\n<p><\/p>\n<blockquote><p>Scrie\u021bi software-ul de la sf\u00e2r\u0219it la \u00eenceput.<\/p><\/blockquote>\n<p>A vorbi deschis, cea mai important\u0103 caracteristic\u0103 a software-ului de lung\u0103 durat\u0103 este capacitatea de a se adapta la schimb\u0103ri. Orice software scrie\u021bi de la spate spre fa\u021b\u0103. De cele mai multe ori, eu am avut probleme c\u0103 luam un serviciu \u201esimplu\u201d \u0219i apoi \u00eencercam s\u0103-l \u00eencorporez \u00eentr-un singur stack CloudFormation sau Terraform. \u0218i bine\u00een\u021beles, dup\u0103 c\u00e2teva luni, descopeream c\u0103 nu am \u00een\u021beles corect \u0219i serviciul era, de fapt, nu at\u00e2t de simplu! A\u0219a c\u0103 aveam nevoie, \u00eentr-un fel, s\u0103 descompun un stack mare \u00een componente mai mici. Atunci c\u00e2nd lucrezi cu CloudFormation, este posibil s\u0103 faci asta doar reconstruind stack-ul existent, lucru pe care eu, \u00eempreun\u0103 cu bazele mele de date, nu-l fac. Terraform, pe de alt\u0103 parte, permitea s\u0103 disec stack-ul \u0219i s\u0103-l \u00eemp\u0103r\u021bim \u00een p\u0103r\u021bi mai mici \u0219i mai u\u0219or de \u00een\u021beles.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Module \u00een git<\/h3>\n<p><\/p>\n<p>Partajarea codului Terraform \u00eentre numeroase stack-uri este mult mai simpl\u0103 dec\u00e2t \u00een cazul CloudFormation. Cu Terraform, po\u021bi pune codul \u00eentr-un repository git \u0219i s\u0103 te referi la el folosind controlul versiunilor semantic. Oricine are acces la acest repository poate reutiliza codul comun. Echivalentul \u00een CloudFormation este S3, dar acesta nu are acelea\u0219i avantaje, \u0219i nu exist\u0103 nicio ra\u021biune pentru care ar trebui s\u0103 renun\u021b\u0103m la git \u00een favoarea S3.<\/p>\n<p><\/p>\n<p>Organiza\u021bia cre\u0219tea, iar capacitatea de a partaja stack-uri comune a ajuns la un nivel critic. Cu Terraform, totul devine u\u0219or \u0219i natural, \u00een timp ce CloudFormation te va face s\u0103 treci prin cercuri \u00eenainte de a ob\u021bine ceva similar.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Opera\u021biuni ca \u0219i cod<\/h3>\n<p><\/p>\n<blockquote><p>\u201eS\u0103-l script\u0103m \u0219i gata\u201d.<\/p>\n<p>\u2014 inginer, cu 3 ani \u00eenainte de a inventa bicicleta Terraform.<\/p><\/blockquote>\n<p>C\u00e2nd vine vorba de dezvoltarea software-ului, Go sau un program Java nu sunt doar cod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Am trecut de la Terraform la CloudFormation \u2014 \u0219i regret\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Cod ca \u0219i cod<\/em><\/p>\n<p><\/p>\n<p>Exist\u0103 \u0219i infrastructura pe care func\u021bioneaz\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Am trecut de la Terraform la CloudFormation \u2014 \u0219i regret\" 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>Dar de unde provine aceasta? Cum o monitoriz\u0103m? Unde se afl\u0103 codul t\u0103u? Au nevoie dezvoltatorii de permisiune pentru acces?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Am trecut de la Terraform la CloudFormation \u2014 \u0219i regret\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Opera\u021biuni ca \u0219i cod<\/em><\/p>\n<p><\/p>\n<blockquote><p>A fi dezvoltator de software nu \u00eenseamn\u0103 doar a scrie cod.<\/p><\/blockquote>\n<p>Nu doar AWS: cu siguran\u021b\u0103 folose\u0219ti servicii de la al\u021bi furnizori. SignalFx, PagerDuty sau Github. Poate ai un server intern Jenkins pentru CI\/CD sau un panou intern Grafana pentru monitorizare. Infra as Code este adoptat din diverse motive, iar fiecare este la fel de important pentru tot ce \u021bine de software.<\/p>\n<p><\/p>\n<p>C\u00e2nd lucram la Twitch, acceleram serviciile din sisteme \u00eencorporate mixte \u0219i din sisteme AWS Amazon. Produceam \u0219i men\u021bineam numeroase microservicii, cresc\u00e2nd costurile opera\u021bionale. Discu\u021biile purtau, cam, acest ton:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Eu<\/strong>: Ei bine, prea multe mi\u0219c\u0103ri pentru a accelera un singur microserviciu. Trebuie s\u0103 folosesc aceast\u0103 prostie pentru a crea un cont AWS (ne uitam la 2 conturi pe <strong>microserviciu<\/strong>), apoi aceasta \u2014 pentru configurarea alertelor, \u00eenc\u0103 aceasta \u2014 pentru depozitul de cod, \u0219i aceasta \u2014 pentru lista de adrese de email, ei bine \u0219i aceasta...<\/li>\n<li><strong>Lead<\/strong>: Hai s\u0103-l script\u0103m \u0219i e gata.<\/li>\n<li><strong>Eu<\/strong>: Bine, dar scriptul \u00een sine se va schimba. Va fi nevoie de o metod\u0103 prin care s\u0103 verifice dac\u0103 toate aceste gadgeturi \u00eencorporate de la Amazon au un status actualizat.<\/li>\n<li><strong>Lead<\/strong>: Sun\u0103 bine. \u0218i pentru asta vom scrie un script.<\/li>\n<li><strong>Eu<\/strong>: Excelent! \u0218i scriptul va trebui s\u0103 primeasc\u0103 cu siguran\u021b\u0103 parametrii. Va putea s\u0103-i accepte?<\/li>\n<li><strong>Lead<\/strong>: Sigur c\u0103 da, altceva nu are ce s\u0103 fac\u0103!<\/li>\n<li><strong>Eu<\/strong>: Procesul se poate schimba, se va pierde compatibilitatea \u00eenapoi. Va fi nevoie de un fel de control semantic al versiunilor.<\/li>\n<li><strong>Lead<\/strong>: O idee grozav\u0103!<\/li>\n<li><strong>Eu<\/strong>: Instrumentele pot fi modificate manual, \u00een interiorul interfe\u021bei utilizatorului. Va trebui s\u0103 avem o modalitate de a verifica \u0219i corecta asta.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 ani mai t\u00e2rziu:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: \u0218i a ie\u0219it terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>Moralul acestei pove\u0219ti este c\u0103, chiar dac\u0103 e\u0219ti <strong>\u00eentr-o mare p\u0103trundere \u00een tot ce ofer\u0103 Amazon<\/strong>, tot folose\u0219ti ceva care nu provine de la AWS, iar aceste servicii au un stadiu utilizat de un limbaj pentru configurare, pentru a sincroniza acest stadiu.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs module git terraform<\/h3>\n<p><\/p>\n<p>Lambda este solu\u021bia CloudFormation pentru problema logicii utilizatorului. Cu ajutorul lambda po\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">crea macro-uri<\/a><\/noindex> sau <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">resurs\u0103 personalizat\u0103<\/a><\/noindex>. Aceast\u0103 abordare aduce dificult\u0103\u021bi suplimentare, care nu exist\u0103 \u00een controlul semantic al versiunilor modulelor git \u00een Terraform. Cea mai presant\u0103 problem\u0103 pentru mine a fost gestionarea permisiunilor pentru toate aceste func\u021bii lambda personalizate (iar acestea sunt zeci de conturi AWS). O alt\u0103 problem\u0103 semnificativ\u0103 a fost tipul de \u201ece a fost mai \u00eent\u00e2i \u2013 oul sau g\u0103ina?\u201d: aceasta a fost legat\u0103 de codul lambda. Aceast\u0103 func\u021bie este at\u00e2t infrastructur\u0103, c\u00e2t \u0219i cod, \u0219i necesit\u0103 monitorizare \u0219i actualiz\u0103ri. Ultima b\u0103taie de cap a fost dificultatea \u00een actualizarea semantica a modific\u0103rilor codului lambda; a trebuit s\u0103 facem astfel \u00eenc\u00e2t ac\u021biunile stivei s\u0103 nu se schimbe \u00eentre execu\u021bii f\u0103r\u0103 o comand\u0103 direct\u0103.<\/p>\n<p><\/p>\n<p>\u00cemi amintesc c\u0103, odat\u0103, mi-am dorit s\u0103 creez un deployment canar pentru mediu Elastic Beanstalk cu un balansor de sarcin\u0103 clasic. Cel mai simplu ar fi fost s\u0103 fac un al doilea deployment pentru EB al\u0103turi de mediu de produc\u021bie, f\u0103c\u00e2nd un pas suplimentar: unind grupul auto-scalabil al deployment-ului canar cu LB-ul din mediu de produc\u021bie. \u0218i av\u00e2nd \u00een vedere c\u0103 Terraform folose\u0219te <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk ca ie\u0219ire<\/a><\/noindex>, aceasta ar necesita 4 linii suplimentare de cod \u00een Terraform. C\u00e2nd am \u00eentrebat dac\u0103 exist\u0103 o solu\u021bie similar\u0103 \u00een CloudFormation, mi s-a indicat un \u00eentreg depozit pe git cu un pipeline de deployment \u0219i altele: \u0219i toate acestea \u2014 pentru ceea ce am putea face cu nenorocitele alea 4 linii de cod Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Este mai bine la detectarea driftilor<\/h3>\n<p><\/p>\n<blockquote><p>Asigura\u021bi-v\u0103 c\u0103 realitatea se potrive\u0219te cu a\u0219tept\u0103rile.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Detectarea driftului<\/a><\/noindex> \u2014 este o func\u021bie foarte puternic\u0103 a operations as code, deoarece ajut\u0103 s\u0103 ne asigur\u0103m c\u0103 realitatea se potrive\u0219te cu a\u0219tept\u0103rile. Este disponibil\u0103 at\u00e2t cu CloudFormation, c\u00e2t \u0219i cu Terraform. Dar pe m\u0103sur\u0103 ce cre\u0219te stiva de lucru, c\u0103utarea driftului \u00een CloudFormation oferea tot mai multe false alerte.<\/p>\n<p><\/p>\n<p>Cu Terraform ave\u021bi mult mai multe hook-uri avansate de ciclu de via\u021b\u0103 pentru detectarea driftului. De exemplu, introduce\u021bi comanda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> direct \u00een defini\u021bia sarcinii ECS, dac\u0103 dori\u021bi s\u0103 ignora\u021bi schimb\u0103rile \u00een defini\u021bia unei sarcini specifice, f\u0103r\u0103 a ignora totu\u0219i schimb\u0103rile \u00een \u00eentregul deployment ECS.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK \u0219i viitorul CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation este greu de gestionat la scar\u0103 larg\u0103, inter-infrastructural. Multe dintre aceste dificult\u0103\u021bi sunt recunoscute, iar instrumentul are nevoie de lucruri precum <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, o structur\u0103 pentru definirea infrastructurii cloud \u00een cod \u0219i desf\u0103\u0219urarea acesteia prin AWS CloudFormation. Va fi interesant s\u0103 vedem ce a\u0219teapt\u0103 aws-cdk \u00een viitor, dar va fi greu s\u0103 concureze cu alte avantaje ale Terraform; pentru a atrage CloudFormation, vor fi necesare modific\u0103ri globale.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Pentru ca Terraform s\u0103 nu dezam\u0103geasc\u0103<\/h3>\n<p><\/p>\n<blockquote><p>Este vorba despre \u201einfrastructura ca COD\u201d, nu \u201eca TEXT\u201d.<\/p><\/blockquote>\n<p>Prima impresie despre Terraform mi s-a p\u0103rut destul de proast\u0103. Cred c\u0103 pur \u0219i simplu nu am \u00een\u021beles abordarea. Aproape to\u021bi inginerii, la \u00eenceput, o percep \u00een mod involuntar ca un format text care trebuie transformat \u00een infrastructura dorit\u0103. NU TREBUIE A\u0218A.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Adev\u0103rurile evidente ale unei bune dezvolt\u0103ri software se aplic\u0103 \u0219i pentru Terraform<\/h3>\n<p><\/p>\n<p>Am observat c\u0103 multe dintre practicile acceptate pentru crearea unui cod bun sunt ignorate \u00een Terraform. Ai \u00eenv\u0103\u021bat ani de zile pentru a deveni un programator bun. Nu renun\u021ba la acea experien\u021b\u0103 doar pentru c\u0103 lucrezi cu Terraform. Adev\u0103rurile de baz\u0103 ale dezvolt\u0103rii software se aplic\u0103 \u0219i \u00een cazul Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Cum s\u0103 scrii cod \u0219i s\u0103 nu-l documentezi?<\/h3>\n<p><\/p>\n<p>Am \u00eent\u00e2lnit mari stack-uri Terraform complet f\u0103r\u0103 documenta\u021bie. Cum este posibil s\u0103 scrii cod pe pagini \u2014 complet f\u0103r\u0103 documenta\u021bie? Adaug\u0103 documenta\u021bie care s\u0103 explice motivul \u00een care acest segment este important \u0219i ceea ce faci. <strong>cod<\/strong> Terraform (accentul aici pe cuv\u00e2ntul \u201ecod\u201d), de ce aceast\u0103 sec\u021biune este at\u00e2t de important\u0103 \u0219i ce face\u021bi.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Cum po\u021bi desf\u0103\u0219ura servicii care anterior erau o singur\u0103 func\u021bie mare main()?<\/h3>\n<p><\/p>\n<p>Am \u00eent\u00e2lnit stack-uri Terraform foarte complexe, prezentate ca un singur modul. De ce nu desf\u0103\u0219ur\u0103m software-ul \u00een acest mod? De ce \u00eemp\u0103r\u021bim func\u021biile mari \u00een cele mai mici? Acelea\u0219i r\u0103spunsuri sunt valabile \u0219i pentru Terraform. Dac\u0103 modulul t\u0103u este prea mare \u2014 trebuie s\u0103-l descompui \u00een module mai mici.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Compania ta nu folose\u0219te biblioteci?<\/h3>\n<p><\/p>\n<p>Am v\u0103zut ingineri care, lans\u00e2nd un nou proiect cu ajutorul Terraform, au copiat pur \u0219i simplu buc\u0103\u021bi mari din alte proiecte \u00een cele proprii \u0219i apoi le-au modificat p\u00e2n\u0103 a \u00eenceput s\u0103 func\u021bioneze. A\u0219a a\u021bi lucra \u00een compania voastr\u0103 cu codul \u201ede produc\u021bie\u201d? Nu folosim biblioteci f\u0103r\u0103 un motiv \u00eentemeiat. Da, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">nu totul trebuie s\u0103 fie o bibliotec\u0103,<\/a><\/noindex> dar unde am fi f\u0103r\u0103 biblioteci comune \u00een principiu?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Nu folose\u0219ti PEP8 sau gofmt?<\/h3>\n<p><\/p>\n<p>\u00cen majoritatea limbajelor exist\u0103 un schema standard de formatare acceptat\u0103. \u00cen Python este PEP8. \u00cen Go \u2014 gofmt. Terraform are propriul s\u0103u: <code>terraform fmt<\/code>. Folose\u0219te-l cu pl\u0103cere! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Vei folosi React f\u0103r\u0103 a cunoa\u0219te JavaScript?<\/h3>\n<p><\/p>\n<p>Modulele Terraform pot s\u0103 simplifice o parte din infrastructura complicat\u0103 pe care o creezi, dar asta nu \u00eenseamn\u0103 c\u0103 nu trebuie s\u0103 \u00een\u021belegi deloc resursele. Vrei s\u0103 folose\u0219ti corect Terraform f\u0103r\u0103 a \u00een\u021belege resursele? E\u0219ti destinat e\u0219ecului: timpul va trece \u0219i tu tot nu vei \u00eenv\u0103\u021ba Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Codifici singletoni sau inject\u00e2nd dependen\u021be?<\/h3>\n<p><\/p>\n<p>Injec\u021bia de dependen\u021be este o practic\u0103 recunoscut\u0103 ca fiind cea mai bun\u0103 pentru dezvoltarea software-ului, preferat\u0103 de singletonuri. Cum este util\u0103 aceasta \u00een Terraform? Am \u00eent\u00e2lnit module Terraform care depind de starea extern\u0103. \u00cen loc s\u0103 scrie\u021bi module care extrag din starea extern\u0103, crea\u021bi un modul care accept\u0103 parametri. Apoi, transmite\u021bi ace\u0219ti parametri \u00een modul.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Bibliotecile dvs. fac zece lucruri bine sau unul \u2014 excelent?<\/h3>\n<p><\/p>\n<p>Cel mai bine func\u021bioneaz\u0103 bibliotecile care se concentreaz\u0103 pe o singur\u0103 sarcin\u0103, pe care o \u00eendeplinesc excelent. \u00cen loc s\u0103 scrie\u021bi module mari Terraform care \u00eencearc\u0103 s\u0103 fac\u0103 totul deodat\u0103, compune\u021bi-le din p\u0103r\u021bi care fac bine un singur lucru. Apoi, combina\u021bi-le a\u0219a cum trebuie.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Cum realiza\u021bi modific\u0103ri \u00een biblioteci f\u0103r\u0103 compatibilitate invers\u0103?<\/h3>\n<p><\/p>\n<p>Un modul Terraform comun, la fel ca o bibliotec\u0103 obi\u0219nuit\u0103, trebuie s\u0103 comunice utilizatorilor despre modific\u0103rile f\u0103r\u0103 compatibilitate invers\u0103. C\u00e2nd astfel de modific\u0103ri au loc \u00een biblioteci, este frustrant, \u0219i exact la fel este frustrant c\u00e2nd modific\u0103rile f\u0103r\u0103 compatibilitate invers\u0103 sunt aplicate \u00een module Terraform. Se recomand\u0103 utilizarea git tags \u0219i semver atunci c\u00e2nd utiliza\u021bi module Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Serviciul de produc\u021bie este pornit pe laptopul dvs. sau \u00een data center?<\/h3>\n<p><\/p>\n<p>Hashicorp are instrumente precum <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> pentru a rula terraformul dvs. Aceste servicii centralizate faciliteaz\u0103 gestionarea, auditul \u0219i aprobarea modific\u0103rilor terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">\u00cenc\u0103 nu scrie\u021bi teste?<\/h3>\n<p><\/p>\n<p>Inginerii recunosc c\u0103 codul trebuie testat, dar de multe ori neglijeaz\u0103 verific\u0103rile c\u00e2nd lucreaz\u0103 cu Terraform. Pentru infrastructur\u0103, aceasta poate fi o capcan\u0103 viclean\u0103. Recomand s\u0103 \u201etesta\u021bi\u201d sau s\u0103 \u201ecrea\u021bi exemple\u201d de stive utiliz\u00e2nd module care pot fi corect desf\u0103\u0219urate pentru verificare \u00een timpul CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform \u0219i microserviciile<\/h3>\n<p><\/p>\n<blockquote><p>Via\u021ba \u0219i moartea companiilor de microservicii depind de vitez\u0103, actualizare \u0219i distrugerea noilor stive de lucru microservicii.<\/p><\/blockquote>\n<p>Cel mai r\u0103sp\u00e2ndit aspect negativ asociat arhitecturilor microservicii, de care nu se pot sc\u0103pa, este legat de munc\u0103 \u0219i nu de cod. Dac\u0103 considera\u021bi Terraform doar ca un mod de a automatiza doar partea infrastructural\u0103 a arhitecturii microservicii, v\u0103 privi\u021bi de adev\u0103ratele beneficii ale acestui sistem. Acum este deja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">totul \u2014 ca \u0219i cod<\/a><\/noindex>.<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/474546\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c. \u0417\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u2014 Infrastructure as Code, \u0438 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 AWS, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Terraform \u0438 CloudFormation. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Terraform \u0438 CloudFormation \u0414\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52367","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.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\/ro\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Am trecut de la Terraform la CloudFormation \u2014 \u0219i mi-a p\u0103rut r\u0103u | ProHoster","description":"A reprezenta infrastructura sub form\u0103 de cod \u00eentr-un format de text repetabil este o practic\u0103 de baz\u0103 simpl\u0103 pentru sisteme, f\u0103r\u0103 a necesita efort suplimentar.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}