CloudFormation vs Terraform

Terraform je v vsakem scenariju boljši od CloudFormation, razen kadar morate nujno uporabiti krvave lastnosti sistema AWS. Tukaj je razlog.

Krivulja učenja:

Mislim, da se večina ljudi nauči novih tehnologij, če sledijo vajam ali gledajo primere. To je dokaj enostavno storiti z večino programskih jezikov, vsaj za vstopno raven.
Ne z CloudFormation. V formatu JSON (ali YAML). Zasnovan je tako, da ga porabijo in proizvajajo računalniki, ne ljudje. Poskusite sami, spodaj je primer odrezka kode, ki je potreben za izdelovanje primerka EC2 (v bistvu VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
….
150 vrstic bla bla bla ...
….
  },

  "Viri": {
    "EC2Instance": {
      "Vrsta": "AWS :: EC2 :: Primerek",
      "Lastnosti": {
        "UserData": {"Fn :: Base64": {"Fn :: Pridružite se": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]}
      }
    },

    "InstanceSecurityGroup": {
      "Type": "AWS :: EC2 :: SecurityGroup",
      "Lastnosti": {
        "GroupDescription": "Omogoči dostop do SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]]
      }
    },

    "IP naslov" : {
      "Tip": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Type": "AWS :: EC2 :: EIPAssociation",
      "Lastnosti": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAdress"}
      }
    }
  },
  "Rezultati": {
    "InstanceId": {
      "Description": "InstanceId novo ustvarjenega primerka EC2",
      "Vrednost": {"Ref": "EC2Instance"}
    },
    "InstanceIPAdress": {
      "Description": "IP naslov novo ustvarjenega primerka EC2",
      "Vrednost": {"Ref": "IPAdress"}
    }
  }
}

Grozno. 210 vrstic kode, da dobite VM z javnim IP zaščitenim s strani Security Group. 210. 210! Z vsako predlogo je ogromna količina kode, kar je v bistvu hrup (več o tem kasneje).
Če to ni dovolj, da vas na tej stopnji odloži, si oglejte uradno dokumentacijo. Zdaj se je usmeril v uporabo YAML, ko pa si želite ogledati vzorčne odlomke, se izkaže, da so vsi v JSON-u. Enako velja za rezultate v Googlu.
BTW. ko imate različne vzorčne odrezke na regijo, lahko rečete, da je nekaj rib

1. krog: CF: 0 TF: 1

Koda za pisanje

Pri pisanju kode veljajo skoraj enaki argumenti kot zgoraj. Za hiter primer si oglejte popolnoma enake vire kot zgoraj, vendar opisane v Terraformu:

vir "aws_instanca" "splet" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  oznake {
    Name = "Sladko"
  }
}
podatki "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

vir "aws_eip_association" "pip" {
  instance_id = "$ {aws_instan.web.id}"
  dodelitev_id = "$ {data.aws_eip.pip.id}"
}
vir "aws_security_group" "enable_all" {
  name = "dovoli_ssh"
  description = "Dovoli ssh od povsod"

  vstop {
    from_port = 0
    do_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
vir "aws_network_interface_sg_attachment" "sg_attachment" {
  security_group_id = "$ {aws_security_group.allow_all.id}"
  network_interface_id = "$ {aws_instan.web.primary_network_interface_id}"
}

Razlika je šokantna, kajne? Upoštevajte, kako enostavno je sklicevanje na druge vire po njihovih identifikacijskih številkah. S hitrim pogledom lahko poveš, kaj se dogaja, in spremeniš osnovne infrastrukture. Kar nas lepo pripelje do druge točke

2. krog CF: 0 TF: 1

Validacijska koda

CF omogoča samo preverjanje skladnje. Tako bo v najboljšem primeru povedal, da ste tu in tam zamudili oklepaj. Preden poskusite uporabiti predlogo CloudFormation, ne boste vedeli, ali je vsaka spremenljivka, ki jo uporabljate, ločljiva, toda največja pomanjkljivost je, da ne veste, kaj se bo zgodilo.
Po drugi strani pa Terraform potrjuje datoteke .tf in preverja ne samo sintakso, ampak tudi, ali se vsi odvisni odpravljajo pravilno, in vam daje načrt! Da, s Terraformom boste dejansko videli, kaj bo ustvarjeno / spremenjeno / uničeno, preden uporabite kodo!

Načrt izvršitve je bil ustvarjen in je prikazan spodaj.
Dejanja vira so označena z naslednjimi simboli:
  + ustvari
Terraform bo izvedel naslednja dejanja:
+ azurerm_resource_group.test_tf101
      id: 
      lokacija: "ukwest"
      ime: "test_tf101"
      oznake.%: 
+ azurerm_subnet.sub1
      id: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      ime: "pod-1"
      network_security_group_id: 
      ime_posnetka_skupine: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
Načrt: 2 dodati, 0 spremeniti, 0 uničiti.
-------------------------------------------------- ------------------

3. krog CF: 0 TF: 1

Oddaljeno stanje

Terraform vam omogoča enostavno uvoz podatkov iz oddaljenih virov, na primer iz drugih okolij, ki so nadzorovana v različnem stanju. To vam omogoča enostavno ločitev virov in odgovornosti. Preprosto prijavite vir zunanjih informacij in uporabite vse, kar je izpostavljeno.
CloudFormation ima pojem referenc v navzkrižnem stacku, vendar je celo iskanje po dokumentaciji bolečina, primer AWS-a za nastavitev vnašanja VPC-ja je 71 vrstic v primerjavi s 17 v Terraformu.

4. krog CF: 0 TF: 1

Funkcije

Oglejte si delček spodaj.

vir "aws_instanca" "splet" {
  # Ustvari en primerek za vsako ime gostitelja
  count = "$ {length (var.hostnames)}"

  # Vsakemu primerku podajte ustrezen datoteko predloga
  user_data = "$ {data.template.web_init. *. upodobljeno [count.index]}"
}

Da. Terraform ima kar nekaj vgrajenih funkcij, ki vam omogočajo, da v kodo vnesete logiko, tako da lahko gradite bolje z manj kode ali imate različne strukture, zgrajene z isto kodo, vendar z različnimi spremenljivkami glede na potrebe.

5. krog CF: 0 TF: 1

Moduli

Lahko združite določene vire, ki jih vedno uporabljate skupaj in ustvarjate module, kar še olajša razglasitev določenih vrst virov. Lahko bi ga kompaktirali tako, da je razglasitev VM samo 4 vrstice kode! Še več, če uporabite spremenljivko "štetje", jih lahko imate toliko, kolikor želite, s spremembo številke.

spremenljivka "štetje" {
  privzeto = 2
}

vir "aws_instanca" "splet" {
  # ...

  count = "$ {var.count}"

  # Označite primerek s števcem, ki se začne pri 1, tj. splet-001
  oznake {
    Name = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

6. krog CF: 0 TF: 1

Skupinsko delo

Ker je Terraform-ov HCL kot kateri koli drug programski jezik, je Git prijazen na način, da povleče zahteve lepo poudari spremembe, zato je lahko pregledovati in sodelovati pri kodi. Poskusite enako z JSON-om, ki je na koncu struktura podatkov. Polovica razlik je le hrup kotlov, nato pa nekaj.

7. krog CF: 0 TF: 1

Ponudniki

Moč Terraform je močno podcenjena, saj lahko z istim orodjem nadzorujete vse vidike svoje infrastrukture. Imate seznam 70 ali več ponudnikov, ki jih lahko uporabljate, od AWS, preko Azure, do Gitlab, Fast, Chef, Docker, poimenujete ga. In vse to uporablja isti HCL, ki se ga moraš enkrat naučiti. Neverjetno!

8. krog CF: 0 TF: 1

Povzetek

Po 8 krogih je

Oblikovanje v oblaku: 0 proti teraformi: 8.

Tudi potem, ko ste dodali dodatno točko, hec celo dva za CloudFormation, ker je bližje ponudbi AWS, končni rezultat je CF 2 TF 8, kar pomeni, da je Terraform popolnoma podrl svojega nasprotnika!
Prepričan sem, da enako velja za predloge Azure ARM proti Terraformu, tako da obstajata dve primerjavi v eni. To je tisto, čemur pravim učinkovitost.

Izjava o omejitvi odgovornosti
Ta objava je polna bližnjic in verjetno tudi napak in napačnih predstav, ki jih bom z veseljem popravila. Rad bi sprožil razpravo, zato je morda tu ali tam skrita vaba. Terraform FTW.