CloudFormation vs Terraform

Terraform este superior CloudFormation în fiecare scenariu, cu excepția cazului în care trebuie să utilizați absolut caracteristicile de margine sângerare de la AWS. Iata de ce.

Curbă de învățare:

Cred că majoritatea oamenilor învață tehnologii noi, urmând tutoriale sau analizând exemple. Acest lucru este destul de ușor de făcut cu majoritatea limbajelor de programare, cel puțin pentru un nivel de intrare.
Nu cu CloudFormation. Este formatat JSON (sau YAML). A fost proiectat pentru a fi consumat și produs de computere - nu de oameni. Încercați singur, mai jos este un exemplu de fragment de cod necesar pentru a crea o instanță EC2 (practic o mașină virtuală):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 de linii de bla bla bla ...
....
  },

  "Resurse": {
    "EC2Instance": {
      „Tip”: „AWS :: EC2 :: Instanță”,
      „Proprietăți”: {
        "UserData": {"Fn :: Base64": {"Fn :: Join": ["", ["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": {
      "Tip": "AWS :: EC2 :: SecurityGroup",
      „Proprietăți”: {
        "GroupDescription": "Activați accesul SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "Adresa IP" : {
      „Tip”: „AWS :: EC2 :: EIP”
    },

    "IPAssoc": {
      "Tip": "AWS :: EC2 :: EIPAssociation",
      „Proprietăți”: {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Ieșiri": {
    "InstanceId": {
      "Descriere": "InstanceId a instanței EC2 nou creată",
      "Valoare": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Descriere": "Adresa IP a instanței recent create EC2",
      "Valoare": {"Ref": "IPAddress"}
    }
  }
}

Neplăcut. 210 linii de cod pentru a obține o mașină virtuală cu IP public protejat de Security Group. 210. 210! Cu fiecare șablon există o cantitate uriașă de cod pentru plăci de cazane, care este practic zgomot (mai multe despre acest lucru mai târziu).
Dacă nu este suficient pentru a vă opri în acest stadiu, aruncați o privire la documentația oficială. A trecut acum către utilizarea YAML, dar când doriți să consultați fragmente de probă, se dovedește că sunt toți în JSON. Același lucru este valabil și pentru rezultatele Google.
BTW. atunci când aveți diferite fragmente de eșantion pentru fiecare regiune, puteți spune ceva pește

Runda nr. 1: CF: 0 TF: 1

Cod de scriere

Aproximativ aceleași argumente ca mai sus se aplică la scrierea codului în sine. Pentru un exemplu rapid, aruncați o privire exact la aceleași resurse ca mai sus, dar descrise în Terraform:

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

  Etichete {
    Nume = "Dulce"
  }
}
date "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

resursa "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  alloc_id = "$ {data.aws_eip.pip.id}"
}
resursa "aws_security_group" "allow_all" {
  nume = "allow_ssh"
  description = "Permiteți ssh de pretutindeni"

  intrare {
    din_port = 0
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resursa "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}"
}

Diferența este șocantă, nu-i așa? Rețineți cât de ușor este să faceți referire la alte resurse prin ID-urile lor Cu o privire rapidă puteți spune ce se întâmplă și puteți face modificări de bază ale infrastructurii. Ceea ce ne aduce frumos într-un alt punct

Etapa # 2 CF: 0 TF: 1

Cod de validare

CF permite doar verificarea sintaxei. Deci, în cel mai bun caz, vă va spune că ați ratat o paranteză aici și acolo. Înainte de a încerca să aplici șablonul CloudFormation, nu vei ști dacă fiecare variabilă pe care ai folosit-o este rezolvabilă, dar care este cel mai mare dezavantaj este că nu știi ce se va întâmpla.
Terraform, pe de altă parte, validează fișierele .tf, verificând nu numai sintaxa, ci și dacă toate programele dependente se rezolvă corect și vă oferă un plan! Da, cu Terraform, de fapt, veți vedea ce va fi creat / schimbat / distrus înainte de a aplica codul!

Un plan de execuție a fost generat și este prezentat mai jos.
Acțiunile de resurse sunt indicate cu următoarele simboluri:
  + creează
Terraform va efectua următoarele acțiuni:
+ azurerm_resource_group.test_tf101
      id: 
      locație: „ukwest”
      nume: "test_tf101"
      Etichete.%: 
+ azurerm_subnet.sub1
      id: 
      adresa_prefix: "172.16.0.8/29"
      configurații ip_configurații. #: 
      nume: "sub-1"
      network_security_group_id: 
      resource_group_name: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
Plan: 2 pentru a adăuga, 0 pentru a schimba, 0 pentru a distruge.
-------------------------------------------------- ------------------

Etapa # 3 CF: 0 TF: 1

Stare de la distanță

Terraform vă permite să importați cu ușurință date din surse la distanță, de exemplu, alte medii controlate în stare diferită. Acest lucru vă permite să separați ușor resursele și responsabilitățile. Pur și simplu declarați sursa de informații externe și folosiți orice este expus de aceasta.
CloudFormation are noțiunea de referințe cross-Stack, dar chiar și documentarea este o durere, și un exemplu pe AWS pentru a configura peering VPC este de 71 de linii, comparativ cu 17 în Terraform.

Etapa # 4 CF: 0 TF: 1

funcţii

Verificați fragmentul de mai jos.

resursa "aws_instance" "web" {
  # Creați o singură instanță pentru fiecare nume de gazdă
  count = "$ {lungime (var.hostnames)}"

  # Treceți fiecare instanță fișierul său template_ corespunzător
  user_data = "$ {data.template.web_init. *. redat [count.index]}"
}

Da. Terraform are câteva funcții încorporate care vă permit să puneți logică în codul dvs., astfel încât să puteți construi mai bine cu mai puțin cod sau să aveți structuri diferite construite folosind același cod, dar cu variabile diferite în funcție de nevoi.

Etapa # 5 CF: 0 TF: 1

module

Puteți grupa anumite resurse pe care le utilizați întotdeauna împreună și creați module, ceea ce face și mai ușoară declararea anumitor tipuri de resurse. Ați putea să-l compactați astfel încât declararea unui VM să fie doar 4 linii de cod! Mai mult decât atât, folosind variabila „număr” puteți avea atât cât doriți, pur și simplu modificând un număr.

variabila „număr” {
  implicit = 2
}

resursa "aws_instance" "web" {
  # ...

  count = "$ {var.count}"

  # Etichetați instanța cu un contor care începe de la 1, adică. Web-001
  Etichete {
    Name = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

Etapa # 6 CF: 0 TF: 1

Lucru in echipa

Deoarece HCL de Terraform este ca orice alt limbaj de programare, este Git prietenoasă într-un mod care aduce solicitări pentru a evidenția modificări, așa că este confortabil să faci recenzii și să colaborezi la o bucată de cod. Încercați să faceți același lucru cu JSON, care în cele din urmă este o structură de date. Jumătate din dif este doar zgomot de placă, apoi unele.

Runda # 7 CF: 0 TF: 1

Furnizori

Puterea extrem de subestimată a Terraform este capacitatea de a controla fiecare aspect al infrastructurii dvs. cu același instrument. Aveți o listă de peste 70 de furnizori pe care îi puteți utiliza, variind de la AWS, prin Azure, până la Gitlab, Fast, Chef, Docker. Și toate folosesc același HCL pe care trebuie să îl înveți o dată. Uimitor!

Etapa # 8 CF: 0 TF: 1

rezumat

După 8 runde, este

CloudFormation: 0 vs Terraform: 8.

Chiar și după ce ați adăugat un punct suplimentar, efectuați două pe CloudFormation pentru că sunt mai aproape de ofertele AWS rezultatul final este CF 2 TF 8, ceea ce înseamnă că Terraform și-a zdrobit absolut adversarul!
Sunt destul de sigur că același lucru este valabil și pentru șabloanele ARM ARM vs Terraform, deci există două comparații într-unul. Acum, asta numesc eficiență.

act de renunțare
Această postare este plină de comenzi rapide și probabil, de asemenea, erori și concepții greșite, pe care le corectez cu plăcere atunci când am subliniat. Mi-ar plăcea să stârnesc o discuție, așa că poate există o momeală ascunsă aici sau acolo. Terraform FTW.