„CloudFormation“ prieš „Terraform“

„Terraform“ yra pranašesnis nei „CloudFormation“ kiekviename scenarijuje, išskyrus tuos atvejus, kai būtinai turite naudoti „AWS“ prapūtimo krašto ypatybes. Štai kodėl.

Mokymosi kreivė:

Manau, kad dauguma žmonių mokosi naujų technologijų, seka pamokas arba žiūri į pavyzdžius. Tai gana lengva padaryti daugumoje programavimo kalbų, bent jau pradiniame lygmenyje.
Ne su „CloudFormation“. Tai JSON (arba YAML) suformatuotas. Jis sukurtas vartoti ir gaminti kompiuteriams, o ne žmonėms. Išbandykite patys, žemiau pateiktas kodo fragmento pavyzdys, kurio reikia norint suaktyvinti EC2 egzempliorių (iš esmės VM):

{
  „AWSTemplateFormatVersion“: „2010-09-09“,
....
150 eilučių blah blah blah ...
....
  },

  „Šaltiniai“: {
    „EC2Instance“: {
      "Tipas": "AWS :: EC2 :: instancija",
      „Ypatybės“: {
        "UserData": {"Fn :: Base64": {"Fn :: Join": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"nuoroda": "instanceType"},
        "SecurityGroups": [{"Ref": "instanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "instanceType"}, "Arch"]}]}
      }
    },

    „InstanceSecurityGroup“: {
      "Tipas": "AWS :: EC2 :: SecurityGroup",
      „Ypatybės“: {
        "GroupDescription": "Įgalinti SSH prieigą",
        „SecurityGroupIngress“:
          [{„IpProtocol“: „tcp“, „FromPort“: „22“, „ToPort“: „22“, „CidrIp“: {„Ref“: „SSHLocation“}}]]
      }
    },

    "IP adresas" : {
      „Tipas“: „AWS :: EC2 :: EIP“
    },

    „IPAssoc“: {
      "Tipas": "AWS :: EC2 :: EIPAssociation",
      „Ypatybės“: {
        "InstanceId": {"nuoroda": "EC2Instance"},
        „EIP“: {„Ref“: „IPAddress“}
      }
    }
  },
  „Išėjimai“: {
    „InstancesId“: {
      "Aprašymas": "Naujai sukurto EC2 egzemplioriaus ID",
      „Vertė“: {„Nuoroda": „EC2Instance"}
    },
    „InstancesIPAddress“: {
      "Aprašymas": "Naujai sukurto EC2 egzemplioriaus IP adresas",
      „Vertė“: {„Ref“: „IPAddress“}
    }
  }
}

Bjaurus. 210 kodo eilučių, kad gautumėte VM su viešuoju IP, kurį saugo saugos grupė. 210. 210! Kiekviename šablone yra didžiulis katilinės kodo kiekis, iš esmės tai yra triukšmas (plačiau apie tai vėliau).
Jei to nepakanka, kad jus atleistų šiame etape, pažiūrėkite į oficialius dokumentus. Dabar perėjo prie YAML naudojimo, bet kai norėsite pažiūrėti pavyzdžių fragmentus, paaiškės, kad jie visi yra JSON. Tas pats pasakytina apie „google“ rezultatus.
BTW. kai kiekviename regione turite skirtingus pavyzdžių fragmentus, galite pasakyti, kad kažkas yra žuvytė

1 turas: CF: 0 TF: 1

Rašymo kodas

Beveik tie patys argumentai, kaip ir aukščiau, galioja ir rašant patį kodą. Norėdami gauti greitą pavyzdį, pažiūrėkite į tuos pačius išteklius, kaip aprašyta aukščiau, tačiau aprašytus „Terraform“:

šaltinis "aws_instance" "žiniatinklis" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  žymės {
    Vardas = „Saldus“
  }
}
duomenys "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

šaltinis "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  allo_id = "$ {data.aws_eip.pip.id}"
}
šaltinis "aws_security_group" "leisti_visi" {
  name = "leisti_ssh"
  description = "Leisti brūkšnį iš visur"

  įėjimas {
    nuo_porto = 0
    to_port = 22
    protokolas = "TCP"
    cidr_blocks = [„0.0.0.0/0“]
  }
}
šaltinis "aws_network_interface_sg_attachment" "sg_attachment" {
  security_group_id = "$ {aws_security_group.allow_all.id}"
  network_interface_id = "$ {aws_instance.web.primary_network_interface_id}"
}

Skirtumas šokiruoja, ar ne? Atminkite, kaip lengva nurodyti kitus išteklius pagal jų ID. Greitu žvilgsniu galite pasakyti, kas vyksta, ir atlikti pagrindinius infrastruktūros pakeitimus. Kuris gražiai mus nukreipia į kitą tašką

2 turas CF: 0 TF: 1

Patvirtinantis kodas

CF leidžia tik patikrinti sintaksę. Taigi geriausiu atveju jums pasakys, kad praleidote laikiklį čia ir ten. Prieš bandydami pritaikyti „CloudFormation“ šabloną, nežinote, ar kiekvienas jūsų naudojamas kintamasis yra išsprendžiamas, tačiau didžiausias trūkumas yra tai, kad nežinote, kas nutiks.
Kita vertus, „Terraform“ patikrina .tf failus ir patikrina ne tik sintaksę, bet ir tai, ar visos priklausomos priemonės išspręsta tinkamai, ir jis pateikia planą! Taip, naudodamiesi „Terraform“ jūs iš tikrųjų pamatysite, kas bus sukurta / pakeista / sunaikinta prieš pritaikant kodą!

Sukurtas vykdymo planas, kuris parodytas žemiau.
Šaltinio veiksmai žymimi šiais simboliais:
  + kurti
„Terraform“ atliks šiuos veiksmus:
+ azurerm_resource_group.test_tf101
      id: 
      vieta: "ukwest"
      pavadinimas: „test_tf101“
      žymės.%: 
+ azurerm_subnet.sub1
      id: 
      adresas_prefiksas: „172.16.0.8/29“
      ip_configurations. #: 
      pavadinimas: „sub-1“
      „network_security_group_id“: 
      išteklių_grupės_pavadinimas: „test_tf101“
      route_table_id: 
      virtualus tinklo_pavadinimas: „test_vnet“
Planas: 2 pridėti, 0 pakeisti, 0 sunaikinti.
-------------------------------------------------- ------------------

3 turas CF: 0 TF: 1

Nuotolinė būsena

„Terraform“ leidžia lengvai importuoti duomenis iš nuotolinių šaltinių, pavyzdžiui, iš kitų aplinkos, valdomų skirtingoje būsenoje. Tai leidžia lengvai atskirti išteklius ir atsakomybę. Tiesiog nurodykite išorinės informacijos šaltinį ir pasinaudokite viskuo, kuo jis susiduria.
„CloudFormation“ supranta „Cross-Stack References“ sąvoką, tačiau net ir susipažinimas su dokumentais yra skausmas. AWS pavyzdys, kaip nustatyti VPC ryšį, yra 71 eilutė, palyginti su 17 „Terraform“.

4 turas CF: 0 TF: 1

Funkcijos

Patikrinkite žemiau esantį fragmentą.

šaltinis "aws_instance" "žiniatinklis" {
  # Sukurkite vieną egzempliorių kiekvienam pagrindinio kompiuterio pavadinimui
  count = "$ {length (var.hostnames)}"

  # Perduokite kiekvienam egzemplioriui jo atitinkamą šabloną
  user_data = "$ {data.template.web_init. *. perteikta [count.index]}"
}

Taip. „Terraform“ turi nemažai integruotų funkcijų, leidžiančių į savo kodą įtraukti logiką, todėl galite kurti geriau naudodami mažiau kodo arba turėdami skirtingas struktūras, naudodami tą patį kodą, bet su skirtingais kintamaisiais pagal poreikius.

5 turas CF: 0 TF: 1

Moduliai

Galite sugrupuoti tam tikrus išteklius, kuriuos visada naudojate kartu, ir kurti modulius, kad būtų dar lengviau deklaruoti tam tikrų rūšių išteklius. Galite kompaktiškai sutvarkyti, kad VM deklaravimas yra tik 4 kodo eilutės! Be to, naudodami kintamąjį „count“ galite turėti tiek, kiek norite, tiesiog pakeisdami skaičių.

kintamasis „count“ {
  numatytasis = 2
}

šaltinis "aws_instance" "žiniatinklis" {
  # ...

  count = "$ {var.count}"

  # Pažymėkite egzempliorių skaitikliu, kurio vertė prasideda nuo 1, ty. „web-001“
  žymės {
    Pavadinimas = "$ {formatas (" internetinis% 03d ", count.index + 1)}"
  }
}

6 turas CF: 0 TF: 1

Komandinis darbas

Kadangi „Terraform“ HCL yra kaip ir bet kuri kita programavimo kalba, jis yra patogus naudoti tokiu būdu, kad užklausos gražiai paryškintų pakeitimus, todėl patogu peržiūrėti apžvalgas ir bendradarbiauti kuriant kodą. Pabandykite padaryti tą patį su JSON, kuris galiausiai yra duomenų struktūra. Pusė difuzijos yra tik katilų skleidžiamas triukšmas, o paskui kai kurie.

7 turas CF: 0 TF: 1

Teikėjai

Labai neįvertinta „Terraform“ galia yra galimybė valdyti kiekvieną savo infrastruktūros aspektą tuo pačiu įrankiu. Turite 70 ir daugiau teikėjų, kuriuos galite naudoti, sąrašą, pradedant AWS, „Azure“, baigiant „Gitlab“, „Fastly“, „Chef“, „Docker“. Viskas naudojama ta pačia HCL, kurią jūs turite išmokti vieną kartą. Nuostabu!

8 turas: CF: 0 TF: 1

Santrauka

Po 8 raundų viskas

„CloudFormation“: 0 ir „Terraform“: 8.

Net pridėjus papildomą tašką, surišk net du „CloudFormation“, kad būtų arčiau AWS pasiūlymų, galutinis rezultatas yra „CF 2 TF 8“, tai reiškia, kad „Terraform“ absoliučiai sutriuškino savo priešininką!
Esu įsitikinęs, kad tas pats pasakytina apie „Azure ARM“ šablonus ir „Terraform“, taigi yra du palyginimai viename. Dabar tai vadinu efektyvumu.

Atsisakymas
Šiame įraše yra daugybė nuorodų, taip pat klaidų ir klaidingų nuomonių, kurias aš laimingai ištaisysiu, kai atkreipsiu dėmesį. Aš norėčiau paskatinti diskusiją, taigi galbūt čia ar ten paslėptas masalas. „Terraform FTW“.