{"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\/sv\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Jag gick fr\u00e5n Terraform till CloudFormation - och \u00e5ngrade mig","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Att representera infrastruktur som kod i ett reproducerbart textformat \u00e4r en enkel, b\u00e4sta praxis f\u00f6r system som inte beh\u00f6ver kn\u00e5das. Denna praxis har f\u00e5tt namnet - <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, och hittills finns det tv\u00e5 popul\u00e4ra verktyg f\u00f6r att genomf\u00f6ra detta, s\u00e4rskilt i AWS: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jag gick fr\u00e5n Terraform till CloudFormation - och \u00e5ngrade mig\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Jag j\u00e4mf\u00f6r erfarenheten av att arbeta med Terraform och CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Innan jag kom till <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (\u00e4ven k\u00e4nd som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) arbetade jag <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">p\u00e5 en startup<\/a><\/noindex> och i tre \u00e5r anv\u00e4nde jag Terraform. P\u00e5 min nya arbetsplats anv\u00e4nde jag ocks\u00e5 Terraform friskt, men senare pressade f\u00f6retaget inf\u00f6randet av allt som liknade Amazon, inklusive CloudFormation. Jag utvecklade noggrant b\u00e4sta praxis f\u00f6r b\u00e5de och anv\u00e4nde b\u00e5da verktygen i mycket komplexa arbetsfl\u00f6den p\u00e5 organisationsniv\u00e5. Efter att ha \u00f6verv\u00e4gt konsekvenserna av att g\u00e5 fr\u00e5n Terraform till CloudFormation ins\u00e5g jag att Terraform antagligen \u00e4r det b\u00e4sta valet f\u00f6r organisationen.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform Skr\u00e4mmande<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Beta-version av mjukvara<\/h3>\n<p><\/p>\n<p>Terraform har inte ens lanserat version 1.0 \u00e4n, och det \u00e4r en god anledning att inte anv\u00e4nda det. Sedan jag f\u00f6rst testade det har det f\u00f6r\u00e4ndrats mycket, men d\u00e5 var det fortfarande <code>terraform apply<\/code> \u0447\u0430\u0441\u0442\u043e \u043b\u043e\u043c\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u042f \u0431\u044b \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e &#171;\u0441\u0435\u0439\u0447\u0430\u0441-\u0442\u043e \u0432\u0441\u0435 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443&#187;, \u043d\u043e\u2026 \u0442\u0430\u043a \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043d\u0435\u0442? \u0415\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u0445\u043e\u0442\u044f \u043e\u043d\u0438 \u0443\u043c\u0435\u0441\u0442\u043d\u044b, \u0438 \u0434\u0430\u0436\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0442\u0435\u043f\u0435\u0440\u044c \u0447\u0442\u043e \u043d\u0430\u0434\u043e. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430 \u0441\u0442\u0430\u043b \u043b\u0443\u0447\u0448\u0435, \u043d\u043e\u2026 :-0<\/p>\n<p><\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, AWS \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0430\u0441\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438. \u0412\u0441\u0435, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0447\u0430\u0441\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043d\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0432, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442. \u0422\u0430\u043a \u0447\u0442\u043e &#171;\u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c&#187; \u044d\u0442\u043e \u0435\u0449\u0435 \u0441\u043b\u0430\u0431\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 API \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0439 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u0430\u043a AWS, \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e. \u041b\u044e\u0431\u043e\u0439, \u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 API, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0430\u043a \u0436\u0435 \u0448\u0438\u0440\u043e\u043a\u043e, \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0442\u0440\u0443\u0434\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442. \u0410 \u0432\u043e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 CloudFormation \u043d\u0430 \u043c\u043e\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0438 \u0440\u0430\u0437\u0443 \u0441 \u0433\u043e\u0434\u0430\u043c\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">H\u00e4lsning, fot... detta \u00e4r en kula<\/h3>\n<p><\/p>\n<p>S\u00e5vitt jag vet g\u00e5r det inte att ta bort en resurs <strong>fr\u00e5n tredje part<\/strong> Att importera en CloudFormation-stapel fr\u00e5n sin egen CF-stapel \u00e4r om\u00f6jligt. Det \u00e4r i princip samma sak med Terraform. Det till\u00e5ter import av befintliga resurser till sin stapel. Funktionen \u00e4r, kan man s\u00e4ga, fantastisk, men med stor makt kommer stort ansvar. S\u00e5 fort du l\u00e4gger en resurs i stapeln, kan du inte ta bort eller \u00e4ndra den resursen medan du arbetar med din stapel. En g\u00e5ng fick vi k\u00e4nna av konsekvenserna. N\u00e5gon p\u00e5 Twitch, som inte hade n\u00e5got ont i sinnet, av misstag importerade n\u00e5gon annans AWS-s\u00e4kerhetsgrupp till sin egen Terraform-stapel. Han skrev n\u00e5gra kommandon och\u2026 s\u00e4kerhetsgruppen (tillsammans med den inkommande trafiken) f\u00f6rsvann.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Stor<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">\u00c5terst\u00e4llning fr\u00e5n ofullst\u00e4ndiga tillst\u00e5nd<\/h3>\n<p><\/p>\n<p>Ibland kan CloudFormation inte helt \u00f6verg\u00e5 fr\u00e5n ett tillst\u00e5nd till ett annat. I s\u00e5 fall f\u00f6rs\u00f6ker det \u00e5terg\u00e5 till det f\u00f6reg\u00e5ende. Tyv\u00e4rr \u00e4r det inte alltid m\u00f6jligt. Att fels\u00f6ka det som uppst\u00e5tt kan vara ganska skr\u00e4mmande \u2014 man vet aldrig om CloudFormation kommer att bli glad av att bli 'hackad' \u2014 \u00e4ven om det \u00e4r f\u00f6r reparation. Och om det verkligen g\u00e5r att \u00e5terg\u00e5 till det f\u00f6reg\u00e5ende tillst\u00e5ndet vet det inte riktigt, och som standard h\u00e4nger det i timmar i v\u00e4ntan p\u00e5 ett mirakel.<\/p>\n<p><\/p>\n<p>Terraform tv\u00e4rt om har en tendens att \u00e5terh\u00e4mta sig efter misslyckade \u00f6verg\u00e5ngar p\u00e5 ett mer elegant s\u00e4tt och erbjuder ett ut\u00f6kat fels\u00f6kningsverktyg.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Tydligare \u00e4ndringar i dokumentets tillst\u00e5nd<\/h3>\n<p><\/p>\n<blockquote><p>&#171;\u041b\u0430\u0434\u043d\u043e, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0442\u044b \u043c\u0435\u043d\u044f\u0435\u0448\u044c\u0441\u044f. \u041d\u043e \u043a\u0430\u043a?&#187;<\/p>\n<p>\u2014\u043e\u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u043f\u0440\u0438\u043d\u044f\u0442\u044c&#187;.<\/p><\/blockquote>\n<p>Ibland beh\u00f6ver jag g\u00f6ra vissa manipulationer med lastbalanseraren i CloudFormation-stapeln \u2014 till exempel l\u00e4gga till ett portnummer eller \u00e4ndra s\u00e4kerhetsgruppen. CloudFormation visar f\u00f6r\u00e4ndringar svagt. Jag, \u00e5 sin sida, g\u00e5r p\u00e5 n\u00e5lar och dubbelkollar yaml-filen tio g\u00e5nger f\u00f6r att f\u00f6rs\u00e4kra mig om att jag inte raderar n\u00e5got n\u00f6dv\u00e4ndigt eller l\u00e4gger till n\u00e5got on\u00f6digt.<\/p>\n<p><\/p>\n<p>Terraform \u00e4r mycket mer transparent i detta avseende. Ibland \u00e4r den till och med f\u00f6r transparent (l\u00e4s: irriterande). Som tur \u00e4r, har den senaste versionen f\u00f6rb\u00e4ttrat visningen av \u00e4ndringar \u2014 nu syns det tydligt vad som f\u00f6r\u00e4ndras.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibilitet<\/h3>\n<p><\/p>\n<blockquote><p>Skriv mjukvara bakl\u00e4nges.<\/p><\/blockquote>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u044f\u043c\u043e, \u0441\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0435\u0440\u0442\u0430 \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0435\u0433\u043e \u041f\u041e \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c. \u041b\u044e\u0431\u043e\u0435 \u041f\u041e \u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e. \u042f \u0432\u043e\u0442 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u043a\u0430\u043b\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0440\u0430\u043b &#171;\u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439&#187; \u0441\u0435\u0440\u0432\u0438\u0441, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0432\u043f\u0438\u0445\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0435\u043a CloudFormation \u0438\u043b\u0438 Terraform. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u043f\u0443\u0441\u0442\u044f \u043c\u0435\u0441\u044f\u0446\u044b \u0432\u0441\u043a\u0440\u044b\u0432\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044f \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u043b \u043d\u0435 \u0442\u0430\u043a, \u0438 \u0441\u0435\u0440\u0432\u0438\u0441-\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439! \u0418 \u0432\u043e\u0442 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0435\u043a \u043d\u0430 \u043c\u0430\u043b\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435. \u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 CloudFormation, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0442\u0435\u043a, \u0430 \u044d\u0442\u043e\u0433\u043e \u044f, \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0411\u0414, \u043d\u0435 \u0434\u0435\u043b\u0430\u044e. Terraform \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b \u043f\u0440\u0435\u043f\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u0438 \u0440\u0430\u0441\u0447\u043b\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Moduler i git<\/h3>\n<p><\/p>\n<p>Att dela Terraform-kod mellan flera stackar \u00e4r mycket enklare \u00e4n att dela CloudFormation-kod. Med Terraform kan man placera koden i ett git-repo och referera till den med hj\u00e4lp av semantisk versionskontroll. Alla som har \u00e5tkomst till detta repo kan \u00e5teranv\u00e4nda den delade koden. Motsvarigheten i CloudFormation \u00e4r S3, men den har inte samma f\u00f6rdelar, och det finns ingen anledning att \u00f6verge git till f\u00f6rm\u00e5n f\u00f6r S3.<\/p>\n<p><\/p>\n<p>Organisationen v\u00e4xte och f\u00f6rm\u00e5gan att dela gemensamma stackar n\u00e5dde en kritisk niv\u00e5. Med Terraform g\u00e5r detta enkelt och naturligt, medan CloudFormation f\u00e5r dig att hoppa genom ringar innan n\u00e5got liknande fungerar f\u00f6r dig.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operations som kod<\/h3>\n<p><\/p>\n<blockquote><p>&#171;\u0417\u0430\u0441\u043a\u0440\u0438\u043f\u0442\u0443\u0435\u043c \u0438 \u043b\u0430\u0434\u043d\u043e&#187;.<\/p>\n<p>\u2014en ingenj\u00f6r tre \u00e5r innan han uppfann Terraform.<\/p><\/blockquote>\n<p>N\u00e4r det g\u00e4ller mjukvaruutveckling \u00e4r Go eller ett program i Java inte bara kod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jag gick fr\u00e5n Terraform till CloudFormation - och \u00e5ngrade mig\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kod som kod<\/em><\/p>\n<p><\/p>\n<p>Det finns ju ocks\u00e5 infrastrukturen d\u00e4r den k\u00f6rs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jag gick fr\u00e5n Terraform till CloudFormation - och \u00e5ngrade mig\" 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>Men var kommer den ifr\u00e5n? Hur \u00f6vervakar man den? Var finns din kod? Beh\u00f6ver utvecklarna beh\u00f6righet f\u00f6r \u00e5tkomst?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jag gick fr\u00e5n Terraform till CloudFormation - och \u00e5ngrade mig\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operations som kod<\/em><\/p>\n<p><\/p>\n<blockquote><p>Att vara mjukvaruutvecklare handlar inte bara om att skriva kod.<\/p><\/blockquote>\n<p>Inte bara AWS: du anv\u00e4nder s\u00e4kert tj\u00e4nster fr\u00e5n andra leverant\u00f6rer ocks\u00e5. SignalFx, PagerDuty eller Github. Kanske har du en intern Jenkins-server f\u00f6r CI\/CD eller en intern Grafana-panel f\u00f6r \u00f6vervakning. Infra som kod v\u00e4ljs av olika anledningar och alla \u00e4r lika viktiga f\u00f6r allt som har att g\u00f6ra med mjukvara.<\/p>\n<p><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 Twitch, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u044f\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0441\u0438\u0441\u0442\u0435\u043c AWS Amazon&#8217;\u0430. \u041c\u044b \u0448\u0442\u0430\u043c\u043f\u043e\u0432\u0430\u043b\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438. \u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u043a\u043b\u044e\u0447\u0435:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Jag<\/strong>: Fan, ganska mycket arbete f\u00f6r att f\u00e5 ig\u00e5ng en mikrotj\u00e4nst. Jag m\u00e5ste anv\u00e4nda det h\u00e4r f\u00f6r att skapa ett AWS-konto (vi gick mot 2 konton p\u00e5 <strong>mikrotj\u00e4nst<\/strong>), \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u0443 \u2014 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439, \u0435\u0449\u0435 \u044d\u0442\u0443 \u2014 \u0434\u043b\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043a\u043e\u0434\u0430, \u0438 \u044d\u0442\u0443 \u2014 \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b, \u043d\u0443 \u0438 \u0432\u043e\u0442 \u044d\u0442\u0443&#8230;<\/li>\n<li><strong>Lead<\/strong>: L\u00e5t oss f\u00e5 det skripterat och klart.<\/li>\n<li><strong>Jag<\/strong>: \u041b\u0430\u0434\u044b, \u043d\u043e \u0441\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u041d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u043e\u0432\u0438\u043d\u044b amazon&#8217;\u0430 \u0438\u043c\u0435\u044e\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/li>\n<li><strong>Lead<\/strong>: L\u00e5ter bra. S\u00e5 vi f\u00e5r skriva ett skript f\u00f6r det.<\/li>\n<li><strong>Jag<\/strong>: Utm\u00e4rkt! Och skriptet beh\u00f6ver s\u00e4kert ocks\u00e5 ha parametrar. Kommer det att acceptera dem?<\/li>\n<li><strong>Lead<\/strong>: Ja, det accepterar de, vad kan det annars g\u00f6ra!<\/li>\n<li><strong>Jag<\/strong>: Processen kan f\u00f6r\u00e4ndras, bak\u00e5tkompatibiliteten kan g\u00e5 f\u00f6rlorad. Vi kommer att beh\u00f6va n\u00e5gon form av semantisk versionskontroll.<\/li>\n<li><strong>Lead<\/strong>: Utm\u00e4rkt id\u00e9!<\/li>\n<li><strong>Jag<\/strong>: Verktygen kan \u00e4ndras manuellt i anv\u00e4ndargr\u00e4nssnittet. Vi beh\u00f6ver ett s\u00e4tt att kontrollera och \u00e5tg\u00e4rda det.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>&#8230;3 \u0433\u043e\u0434\u0430 \u0441\u043f\u0443\u0441\u0442\u044f:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: Och nu har vi terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>Moralen i historien \u00e4r: \u00e4ven om du <strong>\u043f\u043e \u0443\u0448\u0438 \u0432\u043e \u0432\u0441\u0435\u043c amazon&#8217;\u043e\u0432\u0441\u043a\u043e\u043c<\/strong>, anv\u00e4nder du \u00e4nd\u00e5 n\u00e5got som inte \u00e4r fr\u00e5n AWS, och dessa tj\u00e4nster har ett tillst\u00e5nd som anv\u00e4nder ett spr\u00e5k f\u00f6r konfiguration f\u00f6r att synkronisera det tillst\u00e5ndet.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs git-moduler terraform<\/h3>\n<p><\/p>\n<p>lambda \u00e4r CloudFormation-l\u00f6sningen f\u00f6r anv\u00e4ndarlogik. Med lambda kan man <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">skapa makron<\/a><\/noindex> eller <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">anpassad resurs<\/a><\/noindex>. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 git \u0443 Terraform. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0441\u0443\u0449\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0441\u0442\u0430\u043b\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 lambda (\u0430 \u044d\u0442\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 AWS). \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u043e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0438\u043f\u0430 &#171;\u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u2014 \u043a\u0443\u0440\u0438\u0446\u0430 \u0438\u043b\u0438 \u044f\u0439\u0446\u043e?&#187;: \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c lambda. \u0421\u0430\u043c\u0430 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u043a\u043e\u0434, \u0438 \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u0445. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0433\u0432\u043e\u0437\u0434\u0435\u043c \u0432 \u0433\u0440\u043e\u0431 \u0441\u0442\u0430\u043b\u0430 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043a\u043e\u0434\u0430 lambda; \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0431\u0435\u0437 \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043c\u0438.<\/p>\n<p><\/p>\n<p>Jag kommer ih\u00e5g en g\u00e5ng n\u00e4r jag ville skapa en kanariedepoy f\u00f6r Elastic Beanstalk-milj\u00f6n med en klassisk belastningsutj\u00e4mnare. Det skulle vara enklast att g\u00f6ra en andra distribution f\u00f6r EB bredvid produktionsmilj\u00f6n, och ta ett steg till genom att koppla samman den automatiskt skalbara gruppen av kanariedepoy med LB-distributionen i produktionsmilj\u00f6n. Eftersom Terraform anv\u00e4nder <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk som utdata<\/a><\/noindex>, det skulle kr\u00e4va 4 extra kodrader i Terraform. N\u00e4r jag fr\u00e5gade om det fanns n\u00e5gon j\u00e4mf\u00f6rbar l\u00f6sning i CloudFormation, pekade man mig p\u00e5 ett helt arkiv p\u00e5 git med distributionspipeline och annat: och allt detta bara f\u00f6r att vi skulle kunna g\u00f6ra de el\u00e4ndiga 4 raderna kod i Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Den uppt\u00e4cker drifts\u00e4ttning<\/h3>\n<p><\/p>\n<blockquote><p>Se till att verkligheten \u00f6verensst\u00e4mmer med f\u00f6rv\u00e4ntningarna.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Uppt\u00e4ckte drifts\u00e4ttning<\/a><\/noindex> \u2014 \u00e4r en mycket kraftfull funktion f\u00f6r operations as code, eftersom den hj\u00e4lper till att s\u00e4kerst\u00e4lla att verkligheten \u00f6verensst\u00e4mmer med f\u00f6rv\u00e4ntningarna. Den \u00e4r tillg\u00e4nglig b\u00e5de med CloudFormation och med Terraform. Men n\u00e4r arbetsstacken v\u00e4xte visade CloudFormation allt fler falska positiva resultat vid driftuppt\u00e4ckten.<\/p>\n<p><\/p>\n<p>Med Terraform har du mycket mer avancerade livscykelhakar f\u00f6r att uppt\u00e4cka drift. Till exempel skriver du kommandot <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> direkt i ECS-uppgiftsdefinitionen om du vill ignorera \u00e4ndringar i definitionen av en specifik uppgift utan att ignorera \u00e4ndringar i hela ECS-distributionen.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK och framtiden f\u00f6r CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation \u00e4r sv\u00e5rt att hantera i stora, tv\u00e4rinfrastrukturiska skala. M\u00e5nga av dessa sv\u00e5righeter \u00e4r erk\u00e4nda, och verktyget beh\u00f6ver s\u00e5dana saker som <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, en struktur f\u00f6r att definiera molninfrastruktur i kod och f\u00f6ra den genom AWS CloudFormation. Det blir intressant att se vad som v\u00e4ntar aws-cdk i framtiden, men det blir sv\u00e5rt f\u00f6r det att konkurrera med de andra f\u00f6rdelarna med Terraform; f\u00f6r att CloudFormation ska kunna f\u00f6rb\u00e4ttras kr\u00e4vs globala f\u00f6r\u00e4ndringar.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">F\u00f6r att Terraform inte ska g\u00f6ra en besviken<\/h3>\n<p><\/p>\n<blockquote><p>\u042d\u0442\u043e \u0436\u0435 &#171;\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u041a\u041e\u0414&#187;, \u0430 \u043d\u0435 &#171;\u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442&#187;.<\/p><\/blockquote>\n<p>Min f\u00f6rsta upplevelse av Terraform var ganska negativ. Jag tror att jag helt enkelt inte f\u00f6rstod konceptet. N\u00e4stan alla ingenj\u00f6rer upplever det f\u00f6rst oavsiktligt som ett textformat som m\u00e5ste omvandlas till \u00f6nskad infrastruktur. DET \u00c4R INTE N\u00d6DV\u00c4NDIGT S\u00c5.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Sj\u00e4lvklart g\u00e4ller de grundl\u00e4ggande sanningarna f\u00f6r god programvaruutveckling \u00e4ven f\u00f6r Terraform.<\/h3>\n<p><\/p>\n<p>Jag har sett hur m\u00e5nga av de metoder som antas f\u00f6r att skapa bra kod ignoreras i Terraform. Du har studerat i \u00e5ratal f\u00f6r att bli en bra programmerare. Tveka inte att anv\u00e4nda den kunskapen bara f\u00f6r att du arbetar med Terraform. Grundl\u00e4ggande principer f\u00f6r bra mjukvaruutveckling g\u00e4ller \u00e4ven f\u00f6r Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Hur kan man inte dokumentera koden?<\/h3>\n<p><\/p>\n<p>Jag har st\u00f6tt p\u00e5 enorma Terraform-staplar helt utan dokumentation. Hur kan man skriva kod i sidor utan att ha n\u00e5gon dokumentation? L\u00e4gg till dokumentation som f\u00f6rklarar din <strong>kod<\/strong> Terraform (\u0443\u0434\u0430\u0440\u0435\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u043d\u0430 \u0441\u043b\u043e\u0432\u043e &#171;\u043a\u043e\u0434&#187;), \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u0442\u0430\u043a \u0432\u0430\u0436\u0435\u043d, \u0438 \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Hur kan man drifts\u00e4tta tj\u00e4nster som tidigare var en stor main()-funktion?<\/h3>\n<p><\/p>\n<p>Jag har st\u00f6tt p\u00e5 mycket komplexa Terraform-staplar presenterade som en enda modul. Varf\u00f6r drifts\u00e4tter vi inte mjukvara s\u00e5? Varf\u00f6r delar vi upp stora funktioner i mindre? Samma svar g\u00e4ller f\u00f6r Terraform. Om modulen \u00e4r f\u00f6r stor, b\u00f6r vi dela upp den i mindre moduler.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Anv\u00e4nder inte ditt f\u00f6retag bibliotek?<\/h3>\n<p><\/p>\n<p>\u042f \u0432\u0438\u0434\u0435\u043b, \u043a\u0430\u043a \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b, \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Terraform, \u0442\u0443\u043f\u043e \u043a\u043e\u043f\u0438-\u043f\u0435\u0439\u0441\u0442\u0438\u043b\u0438 \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u043a\u043e\u0432\u044b\u0440\u044f\u043b\u0438 \u0438\u0445, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412\u043e\u0442 \u0432\u044b \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u043b\u0438 \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0441 &#171;\u0431\u043e\u0435\u0432\u044b\u043c&#187; \u043a\u043e\u0434\u043e\u043c? \u041c\u044b \u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0414\u0430, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">inte allt b\u00f6r vara ett bibliotek,<\/a><\/noindex> men hur ska vi klara oss utan gemensamma bibliotek \u00f6verhuvudtaget?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Anv\u00e4nder ni inte PEP8 eller gofmt?<\/h3>\n<p><\/p>\n<p>De flesta spr\u00e5k har ett standardformat som \u00e4r allm\u00e4nt accepterat. I Python \u00e4r det PEP8. I Go \u00e4r det gofmt. Terraform har sitt: <code>terraform fmt<\/code>. Anv\u00e4nd det g\u00e4rna! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Kommer du att anv\u00e4nda React utan att veta JavaScript?<\/h3>\n<p><\/p>\n<p>Terraform-moduler kan f\u00f6renkla en del av den komplexa infrastruktur som du bygger, men det betyder inte att man helt kan ignorera den. Vill du anv\u00e4nda Terraform korrekt utan att f\u00f6rst\u00e5 resurser? Du \u00e4r d\u00f6md: tiden kommer att g\u00e5, och du kommer fortfarande inte att beh\u00e4rska Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Kodrar du singeltoner, eller injicerar du beroenden?<\/h3>\n<p><\/p>\n<p>Dependency injection \u00e4r en erk\u00e4nd b\u00e4sta praxis f\u00f6r programutveckling, f\u00f6redragen av singeltoner. Hur kommer detta till nytta i Terraform? Jag har st\u00f6tt p\u00e5 Terraform-moduler som \u00e4r beroende av ett fj\u00e4rrl\u00e4ge. Ist\u00e4llet f\u00f6r att skriva moduler som h\u00e4mtar fr\u00e5n fj\u00e4rrl\u00e4get, skriv en modul som tar emot parametrar. Och skicka sedan dessa parametrar till modulen.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">G\u00f6r dina bibliotek tio saker bra eller en - utm\u00e4rkt?<\/h3>\n<p><\/p>\n<p>Bibliotek fungerar b\u00e4st n\u00e4r de fokuserar p\u00e5 en enda uppgift som de utf\u00f6r utm\u00e4rkt. Ist\u00e4llet f\u00f6r att skriva stora Terraform-moduler som f\u00f6rs\u00f6ker g\u00f6ra allt p\u00e5 en g\u00e5ng, bryt ner dem i delar som g\u00f6r en sak bra. Och kombinera dem sedan p\u00e5 det s\u00e4tt som beh\u00f6vs.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Hur g\u00f6r ni f\u00f6r\u00e4ndringar i biblioteken utan att bryta bak\u00e5tkompatibiliteten?<\/h3>\n<p><\/p>\n<p>En gemensam Terraform-modul, precis som ett vanligt bibliotek, m\u00e5ste p\u00e5 n\u00e5got s\u00e4tt kommunicera f\u00f6r\u00e4ndringar till anv\u00e4ndarna utan att bryta bak\u00e5tkompatibiliteten. N\u00e4r s\u00e5dana f\u00f6r\u00e4ndringar intr\u00e4ffar i biblioteken \u00e4r det frustrerande, och precis lika frustrerande n\u00e4r f\u00f6r\u00e4ndringar utan bak\u00e5tkompatibilitet g\u00f6rs i Terraform-moduler. Det rekommenderas att anv\u00e4nda git-tags och semver vid anv\u00e4ndning av Terraform-moduler.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">\u00c4r produktionsservicen ig\u00e5ng p\u00e5 din b\u00e4rbara dator eller i datacentret?<\/h3>\n<p><\/p>\n<p>Hashicorp har verktyg som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> f\u00f6r att k\u00f6ra din terraform. Dessa centraliserade tj\u00e4nster f\u00f6renklar hantering, revision och godk\u00e4nnande av terraform-f\u00f6r\u00e4ndringar.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Skriver du inte tester?<\/h3>\n<p><\/p>\n<p>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0441\u0430\u043c\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 Terraform. \u0414\u043b\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u043c\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u042f \u0441\u043e\u0432\u0435\u0442\u0443\u044e &#171;\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c&#187; \u0438\u043b\u0438 &#171;\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b&#187; \u0441\u0442\u0435\u043a\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform och mikrotj\u00e4nster<\/h3>\n<p><\/p>\n<blockquote><p>Liv och d\u00f6d f\u00f6r f\u00f6retag med mikrotj\u00e4nster beror p\u00e5 hastighet, uppdateringar och avveckling av nya mikrotj\u00e4nstarbets staplar.<\/p><\/blockquote>\n<p>Det mest utbredda negativa problemet med mikrotj\u00e4nstarkitekturer, som inte g\u00e5r att undkomma, handlar om arbete, och inte kod. Om man endast ser Terraform som ett s\u00e4tt att automatisera den infrastrukturella sidan av mikrotj\u00e4nstarkitekturen, ber\u00f6var man sig de riktiga f\u00f6rdelarna med detta system. Nu \u00e4r allt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">som kod<\/a><\/noindex>.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Jag gick fr\u00e5n Terraform till CloudFormation \u2014 och \u00e5ngrade mig | ProHoster","description":"Att representera infrastruktur som kod i ett reproducerbart textformat \u00e4r en enkel b\u00e4sta praxis f\u00f6r system som inte kr\u00e4ver musinteraktion.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}