CloudFormation vs Terraform

Terraform on igas stsenaariumis parem kui CloudFormation, välja arvatud juhul, kui peate absoluutselt kasutama AWS-i verejooksu serva funktsioone. Siin on miks.

Õppimiskõver:

Arvan, et enamik inimesi õpib uusi tehnoloogiaid, järgides õpetusi või vaadates näiteid. Enamiku programmeerimiskeeltega on seda üsna lihtne teha, vähemalt algtaseme jaoks.
Pole koos CloudFormationiga. See on JSON (või YAML) vormindatud. See on mõeldud kasutamiseks arvutites, mitte inimestes. Proovige ise järele, allpool on näidiskoodilõik, mida on vaja EC2 eksemplari (põhimõtteliselt VM) keerutamiseks:

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 rida blah blah blah ...
....
  },

  "Ressursid": {
    "EC2Instance": {
      "Tüüp": "AWS :: EC2 :: näiteks",
      "Atribuudid": {
        "UserData": {"Fn :: Base64": {"Fn :: Liitu": ["", ["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": {
      "Tüüp": "AWS :: EC2 :: SecurityGroup",
      "Atribuudid": {
        "GroupDescription": "Luba SSH-juurdepääs",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]]
      }
    },

    "IP-aadress" : {
      "Tüüp": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Tüüp": "AWS :: EC2 :: EIPAssociation",
      "Atribuudid": {
        "InstanceId": {"viide": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Väljundid": {
    "InstanceId": {
      "Kirjeldus": "Vastloodud EC2 eksemplariId",
      "Väärtus": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Kirjeldus": "vastloodud EC2 eksemplari IP-aadress",
      "Väärtus": {"Ref": "IPAddress"}
    }
  }
}

Vastik. 210 koodirida, et saada VM, millel on turvarühm kaitstud avalik IP. 210. 210! Iga malli juures on tohutul hulgal katlakivi koodi, see on põhimõtteliselt müra (sellest lähemalt hiljem).
Kui sellest ei piisa, et teid selles etapis töölt lahkuda, siis tutvuge ametliku dokumentatsiooniga. Nüüd on see liikunud YAML-i kasutamise suunas, kuid kui soovite proovilõike vaadata, selgub, et need on kõik JSON-is. Sama on ka google'i tulemustega.
BTW. kui teil on piirkonna kohta erinevad näidislõiked, võite öelda, et midagi on kahtlane

1. voor: CF: 0 TF: 1

Koodikood

Peaaegu samad argumendid, mis ülaltoodud, kehtivad koodi kirjutamise kohta. Kiire näite saamiseks vaadake täpselt samu ressursse, mis ülaltoodud, kuid mida on kirjeldatud Terraformis:

ressurss "aws_instance" "web" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  sildid {
    Nimi = "Magus"
  }
}
data "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

ressurss "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  jaotamine_id = "$ {data.aws_eip.pip.id}"
}
ressurss "aws_security_group" "luba_all" {
  nimi = "luba_ssh"
  description = "Luba kõikjal ssh"

  sissepääs {
    alates_port = 0
    to_port = 22
    protokoll = "TCP"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
ressurss "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}"
}

Erinevus on šokeeriv, kas pole? Pange tähele, kui lihtne on ID-de abil teistele ressurssidele viidata. Kiire pilguga saate teada, mis toimub, ja teha põhilisi muudatusi infrastruktuuris. Mis viib meid kenasti teise punkti

2. voor CF: 0 TF: 1

Kinnituskood

CF võimaldab ainult süntaksi kontrolli. Nii et parimal juhul ütleb see teile, et teil jäi sulg siin ja seal. Enne kui proovite CloudFormationi malli rakendada, ei tea te, kas kõik teie kasutatavad muutujad on lahendatavad, kuid kõige suurem puudus on see, et te ei tea, mis juhtub.
Terraform seevastu valideerib .tf-failid, kontrollides mitte ainult süntaksit, vaid ka seda, kas kõik dependetsiinid lahendavad õigesti, ja see annab teile plaani! Jah, Terraformi abil saate tegelikult enne oma koodi rakendamist näha, mida luuakse / muudetakse / hävitatakse!

Koostatud on täitmisplaan, mida näidatakse allpool.
Ressursitoimingud on tähistatud järgmiste sümbolitega:
  + loo
Terraform teeb järgmised toimingud:
+ azurerm_resource_group.test_tf101
      id: 
      asukoht: "ukwest"
      nimi: "test_tf101"
      tags:%: 
+ azurerm_subnet.sub1
      id: 
      aadress_prefiks: "172.16.0.8/29"
      ip_configurations. #: 
      nimi: "alam-1"
      network_security_group_id: 
      ressursi_grupi_nimi: "test_tf101"
      marsruudi_tabel_id: 
      virtuaalne_võrgu_nimi: "test_vnet"
Plaan: 2 lisada, 0 muuta, 0 hävitada.
-------------------------------------------------- ------------------

Voor # 3 CF: 0 TF: 1

Kaugolek

Terraform võimaldab teil hõlpsalt importida andmeid kaugetest allikatest, näiteks muudest keskkondadest, mida kontrollitakse erinevas olekus. See võimaldab teil ressursid ja kohustused hõlpsalt eraldada. Lihtsalt kuulutage välisteabe allikas ja kasutage kõike, mis sellega puutub kokku.
CloudFormation on mõjutanud risttekkide viiteid, kuid isegi dokumentidest läbi saamine on valus ning näiteks AWS-is VPC võrdluse seadistamiseks on 71 rida, võrreldes Terraformi 17 reaga.

Voor # 4 CF: 0 TF: 1

Funktsioonid

Kontrollige allpool olevat katkendit.

ressurss "aws_instance" "web" {
  # Looge iga hostinime jaoks üks eksemplar
  count = "$ {pikkus (var.hostnames)}"

  # Andke igale eksemplarile vastav mallifail
  user_data = "$ {data.template.web_init. *. renderdatud [count.index]}"
}

Jah. Terraformil on üsna palju sisseehitatud funktsioone, mis võimaldavad teil oma koodi loogikat sisestada, nii et saate paremini luua väiksema koodiga või luua erinevad struktuurid, kasutades sama koodi, kuid erinevate muutujatega vastavalt vajadustele.

Voor # 5 CF: 0 TF: 1

Moodulid

Saate rühmitada teatud ressursid, mida alati koos kasutate, ja moodulite loomine, mis teeb teatud tüüpi ressursside deklareerimise veelgi lihtsamaks. Saate selle kompaktseks muuta, nii et VM-i kuulutamine on vaid 4 koodirida! Veelgi enam, kasutades muutujat „count”, võib teil olla lihtsalt nii palju kui soovite, lihtsalt arvu muutmisega.

muutuja "count" {
  vaikimisi = 2
}

ressurss "aws_instance" "web" {
  # ...

  count = "$ {var.count}"

  # Märgistage esinemisloendur loenduriga 1, st. veeb-001
  sildid {
    Nimi = "$ {vorming (" web-% 03d ", count.index + 1)}"
  }
}

Voor # 6 CF: 0 TF: 1

Meeskonnatöö

Kuna Terraformi HCL on nagu iga teine ​​programmeerimiskeel, on see Git-sõbralik viisil, mis tõmbab taotlused kenasti esile muudatused, nii et on mugav arvustusi teha ja kooditükiga koostööd teha. Proovige sama teha JSON-iga, mis lõpuks on andmestruktuur. Pool diffidest on lihtsalt katlamaja müra ja siis mõned.

Voor # 7 CF: 0 TF: 1

Pakkujad

Terraformi tugevalt alahinnatud võimsus on võime kontrollida oma tööriistaga kõiki oma infrastruktuuri aspekte. Teil on nimekiri 70 või enam pakkujast, mida saate kasutada, alates AWS-ist, Azure'i juurest kuni Gitlabini, Fastlyni, Chefini, Dockerit nimetades. Ja see kõik kasutab sama HCL-i, mida peate üks kord õppima. Hämmastav!

Voor # 8 CF: 0 TF: 1

Kokkuvõte

Pärast 8 vooru on

CloudFormation: 0 vs Terraform: 8.

Pärast lisapunkti lisamist hävitage isegi kaks CloudFormationi, kuna olete AWS-i pakkumistele lähemal. Lõpptulemus on CF 2 TF 8, mis tähendab, et Terraform purustas oma vastase!
Olen üsna kindel, et sama kehtib Azure ARM-i mallide ja Terraformi kohta, nii et seal on kaks võrdlust ühes. Nüüd nimetan seda efektiivsuseks.

Kohustustest loobumine
See postitus on täis otseteid ning tõenäoliselt ka vigu ja väärarusaamu, mille ma osutun hea meelega õigeks. Mulle meeldiks arutelu käivitada, nii et võib-olla on siin või seal peidus sööt. Terraform FTW.