{"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\/pl\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Przeszed\u0142em z Terraform na CloudFormation \u2014 i tego \u017ca\u0142uj\u0119","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Reprezentowanie infrastruktury w postaci kodu w powtarzalnym formacie tekstowym to prosta i najlepsza praktyka dla system\u00f3w, kt\u00f3ra nie wymaga wysi\u0142ku. Praktyk\u0119 t\u0119 nazwa\u0142o si\u0119 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastruktura jako kod<\/a><\/noindex>, a jak dot\u0105d w jej realizacji, szczeg\u00f3lnie w AWS, s\u0105 dwa popularne narz\u0119dzia: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przeszed\u0142em z Terraform na CloudFormation \u2014 i tego \u017ca\u0142uj\u0119\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Por\u00f3wnuj\u0119 do\u015bwiadczenie z Terraform i CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Przed przyj\u015bciem do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (inaczej <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) pracowa\u0142em <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">w jednym startupie<\/a><\/noindex> i przez oko\u0142o trzy lata korzysta\u0142em z Terraform. W nowym miejscu r\u00f3wnie\u017c intensywnie u\u017cywa\u0142em Terraform, a potem firma nacisn\u0119\u0142a na przej\u015bcie na wszystko w stylu Amazon, w tym CloudFormation. Ci\u0119\u017cko pracowa\u0142em nad najlepszymi praktykami zar\u00f3wno dla jednego, jak i dla drugiego, i u\u017cywa\u0142em obu narz\u0119dzi w bardzo z\u0142o\u017conych procesach roboczych na poziomie organizacyjnym. P\u00f3\u017aniej, po starannym przemy\u015bleniu skutk\u00f3w przej\u015bcia z Terraform na CloudFormation, upewni\u0142em si\u0119, \u017ce Terraform jest prawdopodobnie najlepszym wyborem dla organizacji.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform Przera\u017caj\u0105cy<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Wersja beta oprogramowania<\/h3>\n<p><\/p>\n<p>Terraform nawet nie doczeka\u0142 si\u0119 jeszcze wersji 1.0, co stanowi mocny argument przeciwko jego u\u017cywaniu. Od momentu, gdy sam go po raz pierwszy wypr\u00f3bowa\u0142em, znacznie si\u0119 zmieni\u0142, ale wtedy jeszcze <code>terraform apply<\/code> cz\u0119sto psu\u0142 si\u0119 po kilku aktualizacjach lub po prostu po kilku latach u\u017cytkowania. Powiedzia\u0142bym, \u017ce \u201eteraz to wszystko jest inaczej\u201d, ale\u2026 tak chyba wszyscy m\u00f3wi\u0105, prawda? S\u0105 zmiany, kt\u00f3re s\u0105 niekompatybilne z wcze\u015bniejszymi wersjami, ale s\u0105 uzasadnione, a nawet jest takie odczucie, \u017ce sk\u0142adnia i abstrakcje magazyn\u00f3w zasob\u00f3w s\u0105 teraz dopasowane. Narz\u0119dzie wydaje si\u0119 naprawd\u0119 lepsze, ale\u2026 :-0<\/p>\n<p><\/p>\n<p>Z drugiej strony, AWS dobrze poradzi\u0142o sobie, wspieraj\u0105c kompatybilno\u015b\u0107 z wcze\u015bniejszymi wersjami. Pewnie dlatego, \u017ce ich us\u0142ugi s\u0105 cz\u0119sto solidnie testowane wewn\u0119trznie w organizacji i dopiero p\u00f3\u017aniej, po przekszta\u0142ceniu, publikowane. Tak wi\u0119c \u201edobrze si\u0119 postarali\u201d to jeszcze zbyt s\u0142abe okre\u015blenie. Utrzymywanie kompatybilno\u015bci z wcze\u015bniejszymi wersjami API w tak zr\u00f3\u017cnicowanym i z\u0142o\u017conym systemie jak AWS jest niezwykle trudne. Ka\u017cdy, kto mia\u0142 do czynienia z utrzymywaniem publicznych API, u\u017cywanych tak szeroko, musi rozumie\u0107, jak trudno to robi\u0107 przez tyle lat. A zachowanie CloudFormation w mojej pami\u0119ci nigdy nie zmieni\u0142o si\u0119 na przestrzeni lat.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Poznaj nog\u0119\u2026 to kula<\/h3>\n<p><\/p>\n<p>Z tego, co wiem, usuni\u0119cie zasobu <strong>osobnego<\/strong> Nie mo\u017cna importowa\u0107 stanu CloudFormation z w\u0142asnego stosu CF. Podobnie sprawa wygl\u0105da z Terraform. Umo\u017cliwia on importowanie istniej\u0105cych zasob\u00f3w do swojego stosu. Ta funkcja jest, mo\u017cna powiedzie\u0107, niesamowita, ale z wielk\u0105 moc\u0105 przychodzi wielka odpowiedzialno\u015b\u0107. Wystarczy, \u017ce dodasz zas\u00f3b do stosu, a dop\u00f3ki pracujesz ze swoim stosem, nie mo\u017cna usun\u0105\u0107 ani zmieni\u0107 tego zasobu. Raz spotka\u0142em si\u0119 z takim przypadkiem. Pewnego razu na stronie Twitch kto\u015b, nie my\u015bl\u0105c o \u017caden spos\u00f3b \u017ale, przypadkiem zaimportowa\u0142 czyj\u0105\u015b grup\u0119 zabezpiecze\u0144 AWS do swojego w\u0142asnego stosu Terraform. Wprowadzi\u0142 kilka polece\u0144 i\u2026 grupa zabezpiecze\u0144 (razem z przychodz\u0105cym ruchem) znikn\u0119\u0142a.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Wielki<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Przywracanie z niepe\u0142nych stan\u00f3w<\/h3>\n<p><\/p>\n<p>Czasami CloudFormation nie jest w stanie ca\u0142kowicie przej\u015b\u0107 z jednego stanu do drugiego. W takim przypadku spr\u00f3buje wr\u00f3ci\u0107 do poprzedniego. Szkoda, \u017ce nie zawsze jest to wykonalne. Naprawienie tego, co si\u0119 wydarzy\u0142o, bywa do\u015b\u0107 przera\u017caj\u0105ce \u2014 nigdy nie wiesz, czy CloudFormation b\u0119dzie zadowolony, \u017ce si\u0119 go \u0142amie \u2014 nawet je\u015bli w celach naprawczych. A to, czy uda si\u0119 wr\u00f3ci\u0107 do poprzedniego stanu, to co\u015b, czego nie potrafi okre\u015bli\u0107, a domy\u015blnie mo\u017ce wisie\u0107 w oczekiwaniu na cud przez godziny.<\/p>\n<p><\/p>\n<p>Terraform natomiast ma tendencj\u0119 do zwracania si\u0119 po nieudanych przej\u015bciach w spos\u00f3b znacznie bardziej elegancki i oferuje rozszerzone narz\u0119dzia diagnostyczne.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Bardziej przejrzyste zmiany w dokumentach stanu<\/h3>\n<p><\/p>\n<blockquote><p>\u201eDobrze, load balancer, zmieniasz si\u0119. Ale jak?\u201d<\/p>\n<p>\u2014zmartwiony in\u017cynier, gotowy nacisn\u0105\u0107 przycisk \u201ezaakceptuj\u201d.<\/p><\/blockquote>\n<p>Czasami musz\u0119 wykona\u0107 pewne manipulacje z r\u00f3wnowa\u017cnikiem obci\u0105\u017cenia w stosie CloudFormation \u2014 na przyk\u0142ad doda\u0107 numer portu lub zmieni\u0107 grup\u0119 zabezpiecze\u0144. CloudFormation s\u0142abo odzwierciedla zmiany. Ja jednak, jak na ig\u0142ach, dziesi\u0119\u0107 razy sprawdzam plik yaml, aby upewni\u0107 si\u0119, \u017ce niczego potrzebnego nie usun\u0105\u0142em, a zb\u0119dnego \u2014 nie doda\u0142em.<\/p>\n<p><\/p>\n<p>Terraform w tym zakresie jest znacznie bardziej przejrzysty. Czasami jest nawet zbyt przejrzysty (czytaj: uci\u0105\u017cliwy). Na szcz\u0119\u015bcie w ostatniej wersji dodano ulepszony widok zmian \u2014 teraz dok\u0142adnie wida\u0107, co si\u0119 zmienia.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Elastyczno\u015b\u0107<\/h3>\n<p><\/p>\n<blockquote><p>Piszesz oprogramowanie od ty\u0142u.<\/p><\/blockquote>\n<p>M\u00f3wi\u0105c wprost, najwa\u017cniejsz\u0105 cech\u0105 trwa\u0142ego oprogramowania jest zdolno\u015b\u0107 do adaptacji do zmian. Pisanie jakiegokolwiek oprogramowania w oderwaniu od ko\u0144ca. Zazwyczaj mia\u0142em problem z tym, \u017ce bra\u0142em \u201eprosty\u201d serwis, a potem zaczyna\u0142em wciska\u0107 wszystko w jednolit\u0105 struktur\u0119 CloudFormation lub Terraform. I oczywi\u015bcie, po miesi\u0105cach odkrywa\u0142em, \u017ce wszystko zrozumia\u0142em \u017ale, a serwis wcale nie jest prosty! I wtedy musz\u0119 jako\u015b podzieli\u0107 du\u017c\u0105 struktur\u0119 na mniejsze sk\u0142adniki. Gdy pracujesz z CloudFormation, jest to mo\u017cliwe tylko po wcze\u015bniejszym odtworzeniu istniej\u0105cej struktury, a tego ja, ze swoimi bazami danych, nie robi\u0119. Z kolei Terraform pozwala\u0142 na przemy\u015blenie struktury i rozbicie jej na bardziej zrozumia\u0142e mniejsze cz\u0119\u015bci.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Modu\u0142y w git<\/h3>\n<p><\/p>\n<p>Dzielenie si\u0119 kodem Terraform pomi\u0119dzy licznymi stosami jest znacznie \u0142atwiejsze ni\u017c dzielenie si\u0119 kodem CloudFormation. Z Terraform mo\u017cesz umie\u015bci\u0107 kod w repozytorium git i odwo\u0142ywa\u0107 si\u0119 do niego z u\u017cyciem semantycznej kontroli wersji. Ka\u017cdy, kto ma dost\u0119p do tego repozytorium, mo\u017ce na nowo wykorzysta\u0107 wsp\u00f3lny kod. Odpowiednikiem w CloudFormation jest S3, ale nie ma on tych samych zalet, a nie ma \u017cadnego powodu, dla kt\u00f3rego mieliby\u015bmy zrezygnowa\u0107 z gita na rzecz S3.<\/p>\n<p><\/p>\n<p>Organizacja ros\u0142a, a zdolno\u015b\u0107 do dzielenia si\u0119 wsp\u00f3lnymi stosami osi\u0105gn\u0119\u0142a krytyczny poziom. Z Terraform wszystko to jest \u0142atwe i naturalne, podczas gdy CloudFormation zmusi ci\u0119 do przeskakiwania przez przeszkody, zanim b\u0119dziesz m\u00f3g\u0142 uzyska\u0107 co\u015b podobnego.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operacje jako kod<\/h3>\n<p><\/p>\n<blockquote><p>\u201eZeskriptuje i b\u0119dzie po sprawie.\u201d<\/p>\n<p>\u2014in\u017cynier 3 lata przed wynalezieniem roweru Terraform.<\/p><\/blockquote>\n<p>Kiedy mowa o tworzeniu oprogramowania, to Go lub program w Java to nie tylko kod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przeszed\u0142em z Terraform na CloudFormation \u2014 i tego \u017ca\u0142uj\u0119\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kod jako kod<\/em><\/p>\n<p><\/p>\n<p>Jest jeszcze infrastruktura, na kt\u00f3rej to dzia\u0142a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przeszed\u0142em z Terraform na CloudFormation \u2014 i tego \u017ca\u0142uj\u0119\" src=\"\/wp-content\/uploads\/2019\/11\/301c0323baa18563f05503e701af069b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Infrastruktura jako kod<\/em><\/p>\n<p><\/p>\n<p>Ale sk\u0105d ona tam? Jak j\u0105 monitorowa\u0107? Gdzie mieszka tw\u00f3j kod? Czy programi\u015bci potrzebuj\u0105 pozwolenia na dost\u0119p?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przeszed\u0142em z Terraform na CloudFormation \u2014 i tego \u017ca\u0142uj\u0119\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operacje jako kod<\/em><\/p>\n<p><\/p>\n<blockquote><p>Bycie programist\u0105 to nie tylko pisanie kodu.<\/p><\/blockquote>\n<p>Nie samym AWS cz\u0142owiek \u017cyje: na pewno korzystasz z us\u0142ug innych dostawc\u00f3w. SignalFx, PagerDuty czy Github. Mo\u017ce masz wewn\u0119trzny serwer Jenkins do CI\/CD lub wewn\u0119trzn\u0105 konsol\u0119 Grafana do monitorowania. Infrastruktura jako kod jest wybierana z r\u00f3\u017cnych powod\u00f3w, a ka\u017cdy z nich jest r\u00f3wnie wa\u017cny dla wszystkiego, co zwi\u0105zane z oprogramowaniem.<\/p>\n<p><\/p>\n<p>Kiedy pracowa\u0142em w Twitchu, przyspieszali\u015bmy us\u0142ugi wewn\u0105trz mieszanych system\u00f3w wbudowanych i system\u00f3w AWS Amazona. Stworzyli\u015bmy i utrzymywali\u015bmy wiele mikroserwis\u00f3w, zwi\u0119kszaj\u0105c koszty operacyjne. Dyskusje odbywa\u0142y si\u0119 mniej wi\u0119cej w ten spos\u00f3b:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Ja<\/strong>: Cholera, za du\u017co ruch\u00f3w, \u017ceby rozwin\u0105\u0107 jeden mikroserwis. Musz\u0119 u\u017cy\u0107 tego narz\u0119dzia, \u017ceby stworzy\u0107 konto AWS (d\u0105\u017cyli\u015bmy do 2 kont na <strong>mikroserwis<\/strong>), potem to \u2014 do ustawienia powiadomie\u0144, jeszcze to \u2014 do repozytori\u00f3w kodu, a to \u2014 do listy adres\u00f3w e-mail, no i to jeszcze\u2026<\/li>\n<li><strong>Lead<\/strong>: Zeskriptujemy i b\u0119dzie z tym spok\u00f3j.<\/li>\n<li><strong>Ja<\/strong>: Dobrze, ale sam skrypt si\u0119 zmieni. B\u0119dzie potrzebny spos\u00f3b, aby sprawdzi\u0107, czy wszystkie te wbudowane elementy Amazona maj\u0105 aktualny stan.<\/li>\n<li><strong>Lead<\/strong>: Brzmi dobrze. I dla tego napiszemy skrypt.<\/li>\n<li><strong>Ja<\/strong>: \u015awietnie! A skrypt z pewno\u015bci\u0105 b\u0119dzie musia\u0142 przyj\u0105\u0107 parametry. Przyjmie je?<\/li>\n<li><strong>Lead<\/strong>: Oczywi\u015bcie, \u017ce przyjmie! Gdzie ma uciec!<\/li>\n<li><strong>Ja<\/strong>: Proces mo\u017ce si\u0119 zmieni\u0107, utracimy wsteczn\u0105 kompatybilno\u015b\u0107. Potrzebny b\u0119dzie jaki\u015b semantyczny kontroler wersji.<\/li>\n<li><strong>Lead<\/strong>: \u015awietny pomys\u0142!<\/li>\n<li><strong>Ja<\/strong>: Narz\u0119dzia mo\u017cna zmienia\u0107 r\u0119cznie, w interfejsie u\u017cytkownika. Potrzebujemy sposobu, aby to sprawdza\u0107 i poprawia\u0107.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 lata p\u00f3\u017aniej:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: I powsta\u0142 nam terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mora\u0142 tej bajki jest taki: nawet je\u015bli jeste\u015b <strong>po uszy w ca\u0142ym amazonowym<\/strong>nadal korzystasz z czego\u015b, co nie pochodzi z AWS, a te us\u0142ugi maj\u0105 stany, kt\u00f3re wykorzystuj\u0105 j\u0119zyk do konfiguracji, aby ten stan zsynchornizowa\u0107.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs modu\u0142y git terraform<\/h3>\n<p><\/p>\n<p>Lambda to rozwi\u0105zanie CloudFormation dla pytania o logik\u0119 u\u017cytkownika. Z pomoc\u0105 lambda mo\u017cna <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">tworzy\u0107 makra<\/a><\/noindex> lub <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">zas\u00f3b niestandardowy<\/a><\/noindex>. Takie podej\u015bcie rodzi dodatkowe trudno\u015bci, kt\u00f3re nie wyst\u0119puj\u0105 w semantycznej kontroli wersji modu\u0142\u00f3w git w Terraformie. Najwi\u0119kszym problemem dla mnie sta\u0142o si\u0119 zarz\u0105dzanie uprawnieniami dla wszystkich tych u\u017cytkownik\u00f3w lambda (a to dziesi\u0105tki kont AWS). Drugim najwa\u017cniejszym problemem by\u0142o pytanie typu \u201eco by\u0142o pierwsze \u2014 kura czy jajko?\u201d: dotyczy\u0142o to kodu lambda. Sama ta funkcja to infrastruktura i kod, i ona sama potrzebuje monitorowania i aktualizacji. Ostatnim gwo\u017adziem do trumny by\u0142a trudno\u015b\u0107 w semantycznym aktualizowaniu zmian w kodzie lambda; trzeba by\u0142o r\u00f3wnie\u017c sprawi\u0107, aby dzia\u0142ania stosu nie zmienia\u0142y si\u0119 mi\u0119dzy uruchomieniami bez bezpo\u015bredniego polecenia.<\/p>\n<p><\/p>\n<p>Pami\u0119tam, jak pewnego dnia postanowi\u0142em stworzy\u0107 kanarkowe wdro\u017cenie dla \u015brodowiska Elastic Beanstalk z klasycznym load balancerem. Najpro\u015bciej by\u0142oby zrobi\u0107 drugie wdro\u017cenie dla EB obok \u015brodowiska produkcyjnego, robi\u0105c jeszcze jeden krok: po\u0142\u0105czy\u0107 grup\u0119 automatycznie skalowaln\u0105 kanarkowego wdro\u017cenia z LB wdro\u017cenia w \u015brodowisko produkcyjne. A skoro Terraform u\u017cywa <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk jako wyj\u015bcie<\/a><\/noindex>, to wymaga 4 dodatkowych linii kodu w Terraform. Kiedy zapyta\u0142em, czy istnieje por\u00f3wnywalne rozwi\u0105zanie w CloudFormation, wskazano mi ca\u0142y repozytorium na git z pipeline'm wdro\u017ceniowym i innymi: wszystko to dla zaledwie 4 linii kodu w Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Lepiej wykrywa dryf<\/h3>\n<p><\/p>\n<blockquote><p>Upewnij si\u0119, \u017ce rzeczywisto\u015b\u0107 odpowiada oczekiwaniom.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Wykrywanie dryfu<\/a><\/noindex> \u2014 to bardzo pot\u0119\u017cna funkcja operations as code, poniewa\u017c pomaga upewni\u0107 si\u0119, \u017ce rzeczywisto\u015b\u0107 odpowiada oczekiwaniom. Jest dost\u0119pna zar\u00f3wno w CloudFormation, jak i w Terraform. Jednak w miar\u0119 wzrostu rozmiaru stosu, wyszukiwanie dryfu w CloudFormation generowa\u0142o coraz wi\u0119cej fa\u0142szywych wykry\u0107.<\/p>\n<p><\/p>\n<p>Z Terraform masz znacznie bardziej zaawansowane hooki cyklu \u017cycia do wykrywania dryfu. Na przyk\u0142ad, wpisujesz polecenie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> bezpo\u015brednio w definicji zadania ECS, je\u015bli chcesz zignorowa\u0107 zmiany w definicji jakiego\u015b konkretnego zadania, nie ignoruj\u0105c przy tym zmian w ca\u0142ym wdro\u017ceniu ECS.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK i przysz\u0142o\u015b\u0107 CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation jest trudny do zarz\u0105dzania w du\u017cych, mi\u0119dzyinfrastrukturalnych skalach. Wiele z tych trudno\u015bci zosta\u0142o uznanych, a narz\u0119dzie potrzebuje takich rzeczy jak <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, struktura do definiowania infrastruktury chmurowej w kodzie i przeprowadzania jej przez AWS CloudFormation. Ciekawie b\u0119dzie zobaczy\u0107, co czeka aws-cdk w przysz\u0142o\u015bci, ale trudno mu b\u0119dzie konkurowa\u0107 z innymi zaletami Terraform; aby dogoni\u0107 CloudFormation, potrzebne b\u0119d\u0105 globalne zmiany.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Aby Terraform nie zawi\u00f3d\u0142<\/h3>\n<p><\/p>\n<blockquote><p>To przecie\u017c \u201einfrastruktura jako KOD\u201d, a nie \u201ejako tekst\u201d.<\/p><\/blockquote>\n<p>Moje pierwsze wra\u017cenie na temat Terraform by\u0142o do\u015b\u0107 negatywne. My\u015bl\u0119, \u017ce po prostu nie zrozumia\u0142em podej\u015bcia. Prawie wszyscy in\u017cynierowie na pocz\u0105tku b\u0142\u0119dnie postrzegaj\u0105 go jako format tekstowy, kt\u00f3ry nale\u017cy przekszta\u0142ci\u0107 w po\u017c\u0105dan\u0105 infrastruktur\u0119. NIE TRZEBA TAK.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Prawdy uniwersalne dotycz\u0105ce dobrej praktyki w tworzeniu oprogramowania odnosz\u0105 si\u0119 r\u00f3wnie\u017c do Terraform<\/h3>\n<p><\/p>\n<p>Widzia\u0142em, jak wiele praktyk stosowanych do tworzenia dobrego kodu jest ignorowanych w Terraform. Uczy\u0142e\u015b si\u0119 przez lata, aby sta\u0107 si\u0119 dobrym programist\u0105. Nie rezygnuj z tego do\u015bwiadczenia tylko dlatego, \u017ce pracujesz z Terraform. Prawdy dotycz\u0105ce dobrej in\u017cynierii oprogramowania odnosz\u0105 si\u0119 r\u00f3wnie\u017c do Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Jak mo\u017cna pisa\u0107 kod i nie dokumentowa\u0107 go?<\/h3>\n<p><\/p>\n<p>Spotyka\u0142em ogromne stosy Terraform ca\u0142kowicie bez dokumentacji. Jak mo\u017cna pisa\u0107 kod przez strony \u2014 zupe\u0142nie bez dokumentacji? Dodawaj dokumentacj\u0119, w kt\u00f3rej wyja\u015bniasz sw\u00f3j <strong>kod<\/strong> Terraform (akcent tutaj na s\u0142owo \u201ekod\u201d), dlaczego ta sekcja jest tak wa\u017cna i co robicie.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Jak mo\u017cna wdra\u017ca\u0107 us\u0142ugi, kt\u00f3re kiedy\u015b by\u0142y jedn\u0105 du\u017c\u0105 funkcj\u0105 main()?<\/h3>\n<p><\/p>\n<p>Spotyka\u0142em bardzo z\u0142o\u017cone stosy Terraform, przedstawione jako jeden modu\u0142. Dlaczego nie wdra\u017camy oprogramowania w ten spos\u00f3b? Dlaczego dzielimy du\u017ce funkcje na mniejsze? Te same odpowiedzi maj\u0105 zastosowanie r\u00f3wnie\u017c w przypadku Terraform. Je\u015bli masz zbyt du\u017cy modu\u0142 \u2014 nale\u017cy go podzieli\u0107 na mniejsze.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Czy twoja firma nie korzysta z bibliotek?<\/h3>\n<p><\/p>\n<p>Widzia\u0142em, jak in\u017cynierowie, rozwijaj\u0105c nowy projekt za pomoc\u0105 Terraform, po prostu kopiowali gigantyczne fragmenty z innych projekt\u00f3w do swoich, a potem d\u0142ubali w nich, a\u017c zacz\u0119\u0142y dzia\u0142a\u0107. Czy w Waszej firmie pracowaliby\u015bcie tak z \u201eprodukcyjnym\u201d kodem? Przecie\u017c nie u\u017cywamy bibliotek bez powodu. Tak, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">nie wszystko musi by\u0107 bibliotek\u0105,<\/a><\/noindex> ale jak w og\u00f3le mogliby\u015bmy funkcjonowa\u0107 bez wsp\u00f3lnych bibliotek?<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Czy nie korzystasz z PEP8 lub gofmt?<\/h3>\n<p><\/p>\n<p>W wi\u0119kszo\u015bci j\u0119zyk\u00f3w istnieje standardowy schemat formatowania. W Pythonie to PEP8. W Go \u2014 gofmt. Terraform ma sw\u00f3j: <code>terraform fmt<\/code>. Korzystaj bez obaw! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Czy zaczniesz u\u017cywa\u0107 React, nie znaj\u0105c JavaScript?<\/h3>\n<p><\/p>\n<p>Modu\u0142y Terraform mog\u0105 upro\u015bci\u0107 niekt\u00f3re cz\u0119\u015bci tworzonej przez ciebie z\u0142o\u017conej infrastruktury, ale to nie znaczy, \u017ce mo\u017cesz w tym nie mie\u0107 poj\u0119cia. Chcesz u\u017cywa\u0107 Terraform prawid\u0142owo bez zrozumienia zasob\u00f3w? Jeste\u015b skazany na pora\u017ck\u0119: czas b\u0119dzie mija\u0142, a ty wci\u0105\u017c nie opanujesz Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Czy piszesz singletony, czy wprowadzasz zale\u017cno\u015bci?<\/h3>\n<p><\/p>\n<p>Wstrzykiwanie zale\u017cno\u015bci to uznawana za najlepsz\u0105 praktyk\u0119 w tworzeniu oprogramowania, preferowana przez singletony. Jak to mo\u017cna wykorzysta\u0107 w Terraformie? Spotka\u0142em modu\u0142y Terraform, kt\u00f3re zale\u017c\u0105 od zdalnego stanu. Zamiast pisa\u0107 modu\u0142y wyci\u0105gaj\u0105ce ze zdalnego stanu, napisz modu\u0142, kt\u00f3ry akceptuje parametry. A nast\u0119pnie przeka\u017c te parametry do modu\u0142u.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Twoje biblioteki wykonuj\u0105 dziesi\u0119\u0107 rzeczy dobrze czy jedn\u0105 \u2014 doskonale?<\/h3>\n<p><\/p>\n<p>Najlepiej dzia\u0142aj\u0105 biblioteki skoncentrowane na jednej zadaniu, kt\u00f3re wykonuj\u0105 doskonale. Zamiast pisa\u0107 du\u017ce modu\u0142y Terraform, kt\u00f3re pr\u00f3buj\u0105 robi\u0107 wszystko naraz, sk\u0142adaj je z cz\u0119\u015bci, kt\u00f3re dobrze robi\u0105 co\u015b konkretnego. A potem po\u0142\u0105cz je tak, jak to potrzebne.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Jak wprowadzasz zmiany w bibliotekach bez zachowania kompatybilno\u015bci wstecznej?<\/h3>\n<p><\/p>\n<p>Og\u00f3lny modu\u0142 Terraform, podobnie jak zwyk\u0142a biblioteka, musi jako\u015b powiadomi\u0107 u\u017cytkownik\u00f3w o zmianach bez zachowania kompatybilno\u015bci wstecznej. Gdy takie zmiany zachodz\u0105 w bibliotekach, jest to frustruj\u0105ce, i dok\u0142adnie tak samo frustruj\u0105ce, gdy zmiany bez kompatybilno\u015bci wstecznej s\u0105 wprowadzane w modu\u0142ach Terraform. Zaleca si\u0119 stosowanie git tags i semver przy u\u017cywaniu modu\u0142\u00f3w Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Czy serwis produkcyjny dzia\u0142a na twoim laptopie, czy w centrum danych?<\/h3>\n<p><\/p>\n<p>Hashicorp ma narz\u0119dzia takie jak <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> do uruchamiania twojego terraformu. Te scentralizowane us\u0142ugi u\u0142atwiaj\u0105 zarz\u0105dzanie, audyt i zatwierdzanie zmian terraformu.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Czy nie piszesz test\u00f3w?<\/h3>\n<p><\/p>\n<p>In\u017cynierowie przyznaj\u0105, \u017ce kod trzeba testowa\u0107, ale sami cz\u0119sto lekcewa\u017c\u0105 testy, pracuj\u0105c z Terraform. Dla infrastruktury mo\u017ce to prowadzi\u0107 do zdradzieckich sytuacji. Radz\u0119 \u201etestowa\u0107\u201d lub \u201etworzy\u0107 przyk\u0142ady\u201d stos\u00f3w wykorzystuj\u0105cych modu\u0142y, kt\u00f3re mo\u017cna poprawnie wdro\u017cy\u0107 do test\u00f3w w czasie CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform i mikroserwisy<\/h3>\n<p><\/p>\n<blockquote><p>\u017bycie i \u015bmier\u0107 firm mikroserwisowych zale\u017cy od pr\u0119dko\u015bci, aktualizacji i niszczenia nowych mikroserwisowych stos\u00f3w roboczych.<\/p><\/blockquote>\n<p>Najcz\u0119\u015bciej wyst\u0119puj\u0105cy negatywny aspekt zwi\u0105zany z architekturami mikroserwisowymi, od kt\u00f3rego nie da si\u0119 uwolni\u0107, dotyczy pracy, a nie kodu. Je\u015bli traktujesz Terraform jako spos\u00f3b automatyzacji tylko infrastrukturalnej strony architektury mikroserwisowej, pozbawiasz si\u0119 prawdziwych korzy\u015bci z tego systemu. Teraz ju\u017c <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">wszystko \u2014 jako kod<\/a><\/noindex>.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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\/pl\/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=\"pl_PL\" \/>\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\/pl\/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\udd47Przeszed\u0142em z Terraform na CloudFormation \u2013 i \u017ca\u0142uj\u0119 | ProHoster","description":"Prezentowanie infrastruktury jako kodu w powtarzalnym formacie tekstowym to prosta najlepsza praktyka dla system\u00f3w, z kt\u00f3r\u0105 nie trzeba si\u0119 zmaga\u0107.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}