CloudFormation vs Terraform

Terraform je lepší než CloudFormation ve všech scénářích, s výjimkou případů, kdy musíte použít funkce krvácejících hran od AWS. Tady je důvod.

Křivka učení:

Myslím, že většina lidí se učí nové technologie, a to sledováním výukových programů nebo prohlížením příkladů. To je docela snadné dělat s většinou programovacích jazyků, alespoň pro vstupní úroveň.
Ne s CloudFormation. Je ve formátu JSON (nebo YAML). Byl navržen tak, aby byl spotřebováván a produkován počítači - ne lidmi. Vyzkoušejte si to sami, níže je ukázka kódu, která je nutná k roztříštění instance EC2 (v podstatě VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 řádků bla bla bla ...
....
  },

  "Zdroje": {
    "EC2Instance": {
      "Type": "AWS :: EC2 :: Instance",
      "Vlastnosti": {
        "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": {
      "Type": "AWS :: EC2 :: SecurityGroup",
      "Vlastnosti": {
        "GroupDescription": "Povolit přístup SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]]
      }
    },

    "IP adresa" : {
      "Type": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Type": "AWS :: EC2 :: EIPAssociation",
      "Vlastnosti": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Výstupy": {
    "InstanceId": {
      "Description": "InstanceId nově vytvořené instance EC2",
      "Hodnota": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Description": "IP adresa nově vytvořené instance EC2",
      "Hodnota": {"Ref": "IPAddress"}
    }
  }
}

Nasty. 210 řádků kódu pro získání VM s veřejnou IP chráněnou Security Group. 210. 210! U každé šablony je obrovské množství kódu kotlové desky, což je v podstatě šum (více o tom později).
Pokud to nestačí na to, abyste vás v této fázi odložili, podívejte se na úřední dokumentaci. Nyní se posunula směrem k používání YAML, ale když se chcete podívat na ukázkové úryvky, ukáže se, že jsou všechny v JSON. Totéž platí pro výsledky Google.
MIMOCHODEM. když máte různé ukázky úryvků na region, můžete říct, že je něco rybího

Kolo č. 1: CF: 0 TF: 1

Psaní kódu

Téměř stejné argumenty jako výše platí pro psaní samotného kódu. Pro rychlý příklad se podívejte na přesně stejné zdroje jako výše, ale popsané v Terraformu:

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

  tagy {
    Name = "Sweet"
  }
}
data "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

zdroj "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  přidělení_id = "$ {data.aws_eip.pip.id}"
}
zdroj "aws_security_group" "allow_all" {
  name = "allow_ssh"
  description = "Povolit ssh odkudkoli"

  ingress {
    from_port = 0
    to_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
zdroj "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}"
}

Rozdíl je šokující, že? Všimněte si, jak snadné je odkazovat na jiné zdroje podle jejich ID. Rychlým pohledem můžete zjistit, co se děje, a provést základní změny v infrastruktuře. Což nás pěkně přivádí k dalšímu bodu

Kolo č. 2 CF: 0 TF: 1

Ověřovací kód

CF umožňuje pouze kontrolu syntaxe. Takže v nejlepším případě vám řekne, že jste sem a tam zmeškali závorku. Než se pokusíte použít šablonu CloudFormation, nebudete vědět, zda je každá proměnná, kterou jste použili, rozložitelná, ale co je největší nevýhoda, nevíte, co se stane.
Terraform naproti tomu ověřuje soubory .tf a kontroluje nejen syntaxi, ale také to, zda všechny závislé skupiny správně vyřeší, a poskytne vám plán! Ano, s Terraformem se před použitím kódu skutečně dozvíte, co bude vytvořeno / změněno / zničeno!

Byl vytvořen plán provádění, který je uveden níže.
Akce zdrojů jsou označeny následujícími symboly:
  + vytvořit
Terraform provede následující akce:
+ azurerm_resource_group.test_tf101
      id: 
      umístění: "ukwest"
      jméno: "test_tf101"
      tagy.%: 
+ azurerm_subnet.sub1
      id: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      název: "sub-1"
      network_security_group_id: 
      resource_group_name: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
Plán: 2 přidat, 0 změnit, 0 zničit.
-------------------------------------------------- ------------------

Kolo č. 3 CF: 0 TF: 1

Vzdálený stav

Terraform umožňuje snadno importovat data ze vzdálených zdrojů, například z jiných prostředí řízených v jiném stavu. To vám umožní snadné oddělení zdrojů a odpovědnosti. Jednoduše deklarujte zdroj externích informací a použijte vše, co je jim odhaleno.
CloudFormation má představu o referencích napříč komíny, ale dokonce dostat se skrz dokumentaci je bolest, a příklad na AWS nastavit peering VPC je 71 řádků, oproti 17 v Terraformu.

Kolo č. 4 CF: 0 TF: 1

Funkce

Zkontrolujte úryvek níže.

zdroj "aws_instance" "web" {
  # Vytvořte jednu instanci pro každé jméno hostitele
  count = "$ {length (var.hostnames)}"

  # Předejte každé instanci její odpovídající template_file
  user_data = "$ {data.template.web_init. *. rendered [count.index]}"
}

Ano. Terraform má několik vestavěných funkcí, které vám umožňují vložit logiku do kódu, takže můžete stavět lépe s menším kódem nebo mít různé struktury vytvořené pomocí stejného kódu, ale s různými proměnnými podle potřeby.

Kolo č. 5 CF: 0 TF: 1

Moduly

Určité prostředky, které vždy používáte, můžete seskupovat a vytvářet moduly, což ještě více usnadňuje deklaraci určitých typů zdrojů. Dalo by se to zkomprimovat, takže deklarování VM je jen 4 řádky kódu! A co víc, pomocí proměnné „count“ můžete mít tolik, kolik chcete, jednoduše změnou čísla.

proměnná "count" {
  default = 2
}

zdroj "aws_instance" "web" {
  # ...

  count = "$ {var.count}"

  # Označte instanci čítačem začínajícím na 1, tj. web-001
  tagy {
    Název = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

Kolo č. 6 CF: 0 TF: 1

Týmová práce

Protože HCL Terraform je jako jakýkoli jiný programovací jazyk, je Git přátelský způsobem, který přitahuje žádosti pěkně zvýraznit změny, takže je pohodlné provádět recenze a spolupracovat na kusu kódu. Zkuste to udělat s JSON, což je nakonec struktura dat. Polovina rozdílů je jen hluk z bojlerové desky, a pak některé.

Kolo č. 7 CF: 0 TF: 1

Poskytovatelé

Do značné míry podceňovaná síla Terraformu je schopnost ovládat každý aspekt vaší infrastruktury pomocí stejného nástroje. Máte seznam více než 70 poskytovatelů, které můžete použít, od AWS, přes koryto Azure, po Gitlab, Fastly, Chef, Docker, pojmenujte to. A to vše s použitím stejného HCL, které se musíte naučit jednou. Úžasný!

Kolo č. 8 CF: 0 TF: 1

souhrn

Po 8 kolech to je

CloudFormation: 0 vs Terraform: 8.

Dokonce i po přidání bodu navíc zatlačte ještě dva do CloudFormation za to, že se blíží nabídkám AWS. Výsledkem je CF 2 TF 8, což znamená, že Terraform naprosto rozdrtil svého soupeře!
Jsem si docela jistý, že to samé platí pro šablony Azure ARM vs Terraform, takže tam jsou dvě srovnání v jednom. To je to, čemu říkám účinnost.

Zřeknutí se odpovědnosti
Tento příspěvek je plný zástupců a pravděpodobně také chyb a mylných představ, které budu šťastně napravit, když upozornímu. Rád bych vyvolal diskusi, takže možná tu nebo tam je skrytá návnada. Terraform FTW.