CloudFormation gegen Terraform

Terraform ist CloudFormation in jedem Szenario überlegen, es sei denn, Sie müssen unbedingt die neuesten Funktionen von AWS verwenden. Hier ist der Grund.

Lernkurve:

Ich denke, die meisten Leute lernen neue Technologien, indem sie Tutorials folgen oder sich Beispiele ansehen. Dies ist mit den meisten Programmiersprachen relativ einfach zu bewerkstelligen, zumindest für Einsteiger.
Nicht bei CloudFormation. Es ist JSON (oder YAML) formatiert. Es wurde entwickelt, um von Computern konsumiert und produziert zu werden - nicht von Menschen. Probieren Sie es selbst. Nachfolgend finden Sie ein Beispiel für ein Codefragment, das zum Hochfahren einer EC2-Instanz (im Grunde genommen einer VM) erforderlich ist:

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

  "Ressourcen": {
    "EC2Instance": {
      "Typ": "AWS :: EC2 :: Instance",
      "Eigenschaften" : {
        "UserData": {"Fn :: Base64": {"Fn :: Join": ["", ["IPAddress =", {"Ref": "IPAddress"}]}},
        "InstanceType": {"Ref": "InstanceType"},
        "Sicherheitsgruppen": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]}
      }
    },

    "InstanceSecurityGroup": {
      "Typ": "AWS :: EC2 :: SecurityGroup",
      "Eigenschaften" : {
        "GroupDescription": "SSH-Zugriff aktivieren",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "IP Adresse" : {
      "Typ": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Typ": "AWS :: EC2 :: EIPAssociation",
      "Eigenschaften" : {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Outputs": {
    "InstanceId": {
      "Description": "InstanceId der neu erstellten EC2-Instanz",
      "Wert": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Beschreibung": "IP-Adresse der neu erstellten EC2-Instanz",
      "Wert": {"Ref": "IPAddress"}
    }
  }
}

Böse. 210 Codezeilen, um eine VM mit öffentlicher IP zu erhalten, die von der Sicherheitsgruppe geschützt wird. 210. 210! Bei jeder Vorlage gibt es eine große Menge an Code für das Boilerplate, das ist im Grunde genommen Rauschen (dazu später mehr).
Wenn dies nicht ausreicht, um Sie in dieser Phase abzuschrecken, schauen Sie sich die offiziellen Unterlagen an. Es hat sich jetzt auf die Verwendung von YAML verlagert. Wenn Sie sich jedoch Beispiel-Snippets ansehen möchten, stellen Sie fest, dass diese alle in JSON enthalten sind. Gleiches gilt für Google-Ergebnisse.
BTW. Wenn Sie unterschiedliche Beispiel-Snippets pro Region haben, können Sie sagen, dass etwas faul ist

Runde 1: CF: 0 TF: 1

Code schreiben

Ziemlich die gleichen Argumente wie oben gelten für das Schreiben des Codes. Für ein kurzes Beispiel werfen Sie einen Blick auf genau die gleichen Ressourcen wie oben, die jedoch in Terraform beschrieben sind:

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

  Stichworte {
    Name = "Süß"
  }
}
Daten "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

Ressource "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  allocation_id = "$ {data.aws_eip.pip.id}"
}
Ressource "aws_security_group" "allow_all" {
  name = "allow_ssh"
  description = "Erlaube ssh von überall"

  Eindringen {
    from_port = 0
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resource "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}"
}

Der Unterschied ist schockierend, nicht wahr? Beachten Sie, wie einfach es ist, andere Ressourcen anhand ihrer IDs zu referenzieren. Mit einem kurzen Blick können Sie feststellen, was gerade passiert, und grundlegende Änderungen an der Infrastruktur vornehmen. Das bringt uns schön zu einem anderen Punkt

Runde # 2 CF: 0 TF: 1

Code wird überprüft

CF erlaubt nur die Syntaxprüfung. Also wird es dir bestenfalls sagen, dass du hier und da eine Klammer verpasst hast. Bevor Sie versuchen, die CloudFormation-Vorlage anzuwenden, wissen Sie nicht, ob jede von Ihnen verwendete Variable aufgelöst werden kann. Der größte Nachteil ist jedoch, dass Sie nicht wissen, was passieren wird.
Auf der anderen Seite überprüft Terraform .tf-Dateien und prüft nicht nur die Syntax, sondern auch, ob alle Abhängigkeiten korrekt aufgelöst wurden. So erhalten Sie einen Plan! Ja, mit Terraform können Sie tatsächlich sehen, was erstellt / geändert / zerstört wird, bevor Sie Ihren Code anwenden!

Ein Ausführungsplan wurde erstellt und wird unten angezeigt.
Ressourcenaktionen sind mit folgenden Symbolen gekennzeichnet:
  + erstellen
Terraform führt die folgenden Aktionen aus:
+ azurerm_resource_group.test_tf101
      id: 
      Ort: "ukwest"
      Name: "test_tf101"
      Tags.%: 
+ azurerm_subnet1
      id: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      name: "sub-1"
      network_security_group_id: 
      Ressourcengruppenname: "test_tf101"
      route_table_id: 
      Name_des_virtuellen_Netzwerks: "test_vnet"
Plan: 2 hinzufügen, 0 ändern, 0 zerstören.
-------------------------------------------------- ------------------

Runde # 3 CF: 0 TF: 1

Remote-Status

Mit Terraform können Sie auf einfache Weise Daten aus Remote-Quellen importieren, z. B. andere Umgebungen, die in einem anderen Status gesteuert werden. Dies ermöglicht Ihnen eine einfache Trennung von Ressourcen und Verantwortlichkeiten. Geben Sie einfach die Quelle der externen Informationen an und verwenden Sie alles, was von diesen bereitgestellt wird.
CloudFormation kennt Cross-Stack-Referenzen, aber selbst das Durcharbeiten der Dokumentation ist schwierig, und das Beispiel für das Einrichten von VPC-Peering in AWS umfasst 71 Zeilen im Vergleich zu 17 Zeilen in Terraform.

Round # 4 CF: 0 TF: 1

Funktionen

Überprüfen Sie das folgende Snippet.

Ressource "aws_instance" "web" {
  # Erstellen Sie eine Instanz für jeden Hostnamen
  count = "$ {length (var.hostnames)}"

  # Übergeben Sie jeder Instanz die entsprechende Vorlagendatei
  user_data = "$ {data.template.web_init. *. rendering [count.index]}"
}

Ja. Terraform verfügt über eine Reihe integrierter Funktionen, mit denen Sie Logik in Ihren Code einfügen können, sodass Sie besser mit weniger Code oder mit unterschiedlichen Strukturen arbeiten können, die je nach Bedarf mit demselben Code, aber mit unterschiedlichen Variablen erstellt werden.

Runde # 5 CF: 0 TF: 1

Module

Sie können bestimmte Ressourcen, die Sie immer zusammen verwenden, gruppieren und Module erstellen, um die Deklaration bestimmter Ressourcentypen zu vereinfachen. Sie könnten es so komprimieren, dass das Deklarieren einer VM nur 4 Codezeilen umfasst! Darüber hinaus können Sie mit der Variablen "count" beliebig viele festlegen, indem Sie einfach eine Zahl ändern.

Variable "count" {
  Standard = 2
}

Ressource "aws_instance" "web" {
  # ...

  count = "$ {var.count}"

  # Kennzeichnen Sie die Instanz mit einem Zähler, der bei 1 beginnt, dh. web-001
  Stichworte {
    Name = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

Runde # 6 CF: 0 TF: 1

Zusammenspiel

Da Terraforms HCL wie jede andere Programmiersprache ist, ist es git-freundlich, sodass Anfragen deutlich hervorgehoben werden, so dass Sie problemlos Überprüfungen durchführen und an einem Teil des Codes zusammenarbeiten können. Versuchen Sie dasselbe mit JSON, das letztendlich eine Datenstruktur ist. Die Hälfte der Unterschiede ist nur Boilerplate-Rauschen und noch einiges mehr.

Runde 7 CF: 0 TF: 1

Anbieter

Die stark unterschätzte Stärke von Terraform ist die Fähigkeit, jeden Aspekt Ihrer Infrastruktur mit demselben Tool zu steuern. Sie haben eine Liste von über 70 Anbietern, die Sie verwenden können, angefangen von AWS über Azure bis hin zu Gitlab, Fastly, Chef, Docker. Und alle verwenden dieselbe HCL, die Sie einmal lernen müssen. Tolle!

Runde # 8 CF: 0 TF: 1

Zusammenfassung

Nach 8 Runden ist es

CloudFormation: 0 gegen Terraform: 8.

Auch nach dem Hinzufügen eines Extrapunkts können Sie CloudFormation sogar zwei Punkte hinzufügen, um AWS-Angeboten näher zu kommen. Das Endergebnis ist CF 2 TF 8, was bedeutet, dass Terraform seinen Gegner absolut vernichtet hat!
Ich bin mir ziemlich sicher, dass dies auch für Azure ARM-Vorlagen und Terraform gilt. Es gibt also zwei Vergleiche in einem. Das nenne ich Effizienz.

Haftungsausschluss
Dieser Beitrag steckt voller Verknüpfungen und wahrscheinlich auch voller Fehler und Missverständnisse, die ich gerne korrigiere, wenn ich darauf hingewiesen werde. Ich würde gerne eine Diskussion anregen. Vielleicht ist hier oder da ein Köder versteckt. Terraform FTW.