CloudFormation vs Terraform

Terraform është superiore ndaj CloudFormation në çdo skenar, përveç rasteve kur ju duhet të përdorni tiparet e avionit të gjakderdhjes nga AWS. Ja pse

Kurba e të mësuarit:

Unë mendoj se shumica e njerëzve mësojnë teknologji të reja, duke ndjekur mësime ose duke shikuar shembuj. Kjo është mjaft e thjeshtë për t'u bërë me shumicën e gjuhëve programuese, të paktën për një nivel hyrje.
Jo me CloudFormation. Jshtë formatuar JSON (ose YAML). Beenshtë krijuar për tu konsumuar dhe prodhuar nga kompjuterët - jo njerëzit. Provojeni vetë, më poshtë është një shembull i kodit kod që kërkohet për të rrjedhur një shembull EC2 (në thelb një VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 rreshta të blah blah blah ...
....
  }

  "Burimet": {
    "EC2Instance": {
      "Tipi": "AWS :: EC2 :: Instanca",
      "Vetitë" : {
        "UserData": {"Fn :: Base64": {"Fn :: Join": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "SecurityGroups": [{"Ref": "InstanceSecuranceGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region",
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]
      }
    }

    "InstanceSecuranceGroup": {
      "Tipi": "AWS :: EC2 :: SecurityGroup",
      "Vetitë" : {
        "GroupDescription": "Aktivizo hyrjen në SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    }

    "Adresa IP" : {
      "Tipi": "AWS :: EC2 :: EIP"
    }

    "IPAssoc": {
      "Tipi": "AWS :: EC2 :: EIPAssociation",
      "Vetitë" : {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  }
  "Rezultatet": {
    "InstanceId":
      "Përshkrimi": "RastiIi i instancës së sapo krijuar EC2",
      "Vlera": {"Ref": "EC2Instance"}
    }
    "InstanceIPAddress": {
      "Përshkrimi": "Adresa IP e instancës së sapo krijuar EC2",
      "Vlera": {"Ref": "IPAddress"}
    }
  }
}

Nasty. 210 rreshta kodesh për të marrë një VM me IP publike të mbrojtur nga Security Group. 210. 210! Me çdo shabllon ka një sasi të madhe të kodit të kazanëve, që në thelb është zhurma (më shumë për këtë më vonë).
Nëse kjo nuk është e mjaftueshme për t'ju hequr në këtë fazë, shikoni në dokumentacionin zyrtar. Tani ajo është zhvendosur drejt përdorimit të YAML, por kur doni të shikoni copëzat e mostrës, rezulton se ata janë të gjithë në JSON. E njëjta gjë është e vërtetë për rezultatet e google.
Btw. kur të keni copëza të mostrave të ndryshme për rajonin, mund të thoni diçka të peshkut

Raundi # 1: CF: 0 TF: 1

Kodi i shkrimit

Pothuajse të njëjtat argumente si më lart vlejnë për të shkruar vetë kodin. Për një shembull të shpejtë hidhni një sy në burimet saktësisht të njëjta si më lart, por të përshkruara në Terraform:

burimi "aws_instance" "web"
  ami = "12345-6789-10"
  shembull_type = "t2.micro"

  etiketat {
    Emri = "E embel"
  }
}
të dhënat "aws_eip" "pip"
  public_ip = "1.1.1.1"
}

burimi "aws_eip_association" "pip"
  shembull_id = "$ {aws_instance.web.id}"
  alokim_id = "$ {data.aws_eip.pip.id}"
}
burimi "aws_securance_group" "lejoj_all"
  emri = "lejoj_ssh"
  përshkrimi = "Lejo ssh nga kudo"

  hyrje {
    nga_port = 0
    to_port = 22
    protokoll = "TCP"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
burim "aws_network_interface_sg_attachment" "sg_attachment"
  sigurisë_group_id = "$ {aws_securance_group.allow_all.id}"
  network_interface_id = "$ {aws_instance.web.primary_network_interface_id}"
}

Diferenca është tronditëse, apo jo? Vini re se sa e lehtë është të referohen burimet e tjera nga ID e tyre. Me një vështrim të shpejtë mund të tregoni se çfarë po ndodh dhe të bëni ndryshime themelore në infrastrukturë. E cila na sjell bukur në një pikë tjetër

Raundi # 2 CF: 0 TF: 1

Kodi i vërtetimit

CF lejon vetëm kontrollin e sintaksës. Kështu që në rastin më të mirë do t'ju tregojë se keni humbur një parantezë këtu dhe atje. Para se të provoni të aplikoni modelin CloudFormation nuk do të dini nëse çdo variabël që keni përdorur është e zgjidhshme, por cili është pengesa më e madhe është që nuk e dini se çfarë do të ndodhë.
Terraform nga ana tjetër, vërteton skedarët .tf, duke kontrolluar jo vetëm sintaksën, por edhe nëse të gjitha vartësit zgjidhen si duhet, dhe kjo ju jep një plan! Po, me Terraform ju në të vërtetë shihni se çfarë do të krijoni / ndryshoni / shkatërroni para se të aplikoni kodin tuaj!

Një plan ekzekutimi është gjeneruar dhe është paraqitur më poshtë.
Veprimet e burimeve tregohen me simbolet e mëposhtme:
  + krijoj
Terraform do të kryejë veprimet e mëposhtme:
+ azurerm_resource_group.test_tf101
      id: 
      vendndodhja: "ukwest"
      emri: "test_tf101"
      etiketat.%: 
+ azurerm_subnet.sub1
      id: 
      adresa_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      emri: "nën-1"
      network_securance_group_id: 
Plani: 2to shtoni, 0 për të ndryshuar, 0 për të shkatërruar.
-------------------------------------------------- ------------------

Raundi # 3 CF: 0 TF: 1

Gjendja në distancë

Terraform ju lejon të importoni me lehtësi të dhëna nga burime të largëta, për shembull mjedise të tjera të kontrolluara në gjendje të ndryshme. Kjo ju lejon për ndarje të lehtë të burimeve dhe përgjegjësive. Thjesht deklaroni burimin e informacionit të jashtëm dhe përdorni gjithçka që është e ekspozuar prej tij.
CloudFormation ka nocionin e Referencave Cross-Stack, por edhe marrja në dorë e dokumentacionit është një dhimbje, dhe shembulli në AWS për të ngritur shikimin e VPC është 71 rreshta, krahasuar me 17 në Terraform.

Raundi # 4 CF: 0 TF: 1

Funksione

Kontrolloni copëzën më poshtë.

burimi "aws_instance" "web"
  # Krijoni një shembull për secilin emër hosti
  numëro = "$ {gjatësi (var.hostnames)}"

  # Kaloni secilën shembull modelin e saj përkatës
  user_data = "$ {data.template.web_init. *. e dhënë [numër.index]}"
}

Po. Terraform ka mjaft funksione të ndërtuara që ju lejojnë të vendosni logjikë në kodin tuaj, kështu që ju mund të ndërtoni më mirë me më pak kod, ose të keni struktura të ndryshme të ndërtuara duke përdorur të njëjtin kod, por me ndryshore të ndryshme sipas nevojave.

Raundi # 5 CF: 0 TF: 1

modulet

Ju mund të gruponi burime të caktuara që përdorni gjithmonë në lidhje dhe të krijoni module, duke e bërë edhe më të lehtë deklarimin e llojeve të caktuara të burimeve. Ju mund ta kompaktoni atë që deklarimi i një VM është vetëm 4 rreshta kodesh! Për më tepër, duke përdorur "numërimin" të ndryshueshëm mund të keni sa më shumë që dëshironi, thjesht duke ndryshuar një numër.

"numërimi" i ndryshueshëm {
  parazgjedhje = 2
}

burimi "aws_instance" "web"
  # ...

  numëro = "$ {var.count"

  # Etiketoni rastin me një kundër, duke filluar nga 1, d.m.th. web-001
  etiketat {
    Emri = "format $ $ ((" uebi-% 03d ", numërim.index + 1)}"
  }
}

Raundi # 6 CF: 0 TF: 1

Puna ekipore

Për shkak se HCL i Terraform është si çdo gjuhë tjetër programuese, është miqësore në një mënyrë që tërheq kërkesat të nxjerrë në pah bukur ndryshimet, kështu që është e rehatshme të bësh rishikime dhe të bashkëpunosh në një copë kod. Provoni të bëni të njëjtën gjë me JSON që në fund të fundit është një strukturë e të dhënave. Gjysma e dallimeve është vetëm zhurma e boilerplate, dhe pastaj disa.

Raundi # 7 CF: 0 TF: 1

Mundësuesa

Fuqia e nënvlerësuar shumë e Terraform është aftësia për të kontrolluar çdo aspekt të infrastrukturës tuaj me të njëjtin mjet. Ju keni një listë të 70+ ofruesve që mund të përdorni, duke filluar nga AWS, përmes Azure, deri në Gitlab, Fastly, Chef, Docker, ju e emëroni atë. Dhe është e gjitha duke përdorur të njëjtën HCL që duhet të mësosh një herë. Amazing!

Raundi # 8 CF: 0 TF: 1

përmbledhje

Pas 8 raundeve, është

CloudFormimi: 0 vs Terraform: 8.

Edhe pasi të shtoni një pikë shtesë, dreq edhe dy në CloudFormation për të qenë afër rezultatit përfundimtar të ofertave AWS është CF 2 TF 8, që do të thotë Terraform shkatërruar absolutisht kundërshtarin e saj!
Jam mjaft i sigurt se e njëjta vlen edhe për modelet e Azure ARM-së kundër Terraform, kështu që ka, dy krahasime në një. Tani kjo është ajo që unë e quaj efikasitet.

mohim
Ky postim është plot me shkurtore dhe ka të ngjarë edhe gabime dhe keqkuptime, të cilat për fat të mirë do t’i korrigjoj kur theksohen. Unë do të doja të nxisja një diskutim, kështu që mbase ka një karrem të fshehur këtu ose atje. Terraform FTW.