CloudFormation vs Terraform

Terraform er yfirburði CloudFormation í öllum tilfellum nema þegar þú þarft að nota blæðingarbrúnir frá AWS. Hér er ástæðan.

Námsferill:

Ég held að flestir læri nýja tækni, með því að fylgja námskeið eða skoða dæmi. Þetta er frekar auðvelt að gera við flest forritunarmál, að minnsta kosti fyrir aðgangsstig.
Ekki með CloudFormation. Það er JSON (eða YAML) sniðið. Það er hannað til að neyta og framleiða af tölvum - ekki mönnum. Prófaðu það sjálfur, hér að neðan er dæmi um kóða sem þarf til að snúa upp EC2 dæmi (í grundvallaratriðum VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 línur af bla bla bla ...
....
  },

  „Aðföng“: {
    "EC2Instance": {
      "Type": "AWS :: EC2 :: Instance",
      „Eiginleikar“: {
        "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",
      „Eiginleikar“: {
        "GroupDescription": "Virkja SSH aðgang",
        "SecurityGroupIn Congress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "IPAddress": {
      "Type": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Type": "AWS :: EC2 :: EIPAssociation",
      „Eiginleikar“: {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  „Úttak“: {
    „InstanceId“: {
      "Description": "Dæmi um nýstofnaða EC2 dæmi",
      "Value": {"Ref": "EC2Instance"}
    },
    „InstanceIP Address“: {
      "Lýsing": "IP tölu nýstofnaðs EC2 dæmi",
      "Value": {"Ref": "IPAddress"}
    }
  }
}

Ógeðslegt. 210 línur af kóða til að fá VM með opinberri IP verndaður af Security Group. 210. 210! Við hvert sniðmát er mikið magn af ketilplötum, það er í grundvallaratriðum hávaði (meira um þetta síðar).
Ef það dugar ekki til að koma þér af stað á þessu stigi skaltu skoða opinber skjöl. Það hefur nú færst í átt að því að nota YAML, en þegar þú vilt skoða sýnishornabita, reynist það vera allt í JSON. Sama er að segja um niðurstöður Google.
BTW. þegar þú hefur fengið mismunandi sýnishornabita á hverju svæði, geturðu sagt að eitthvað sé fiskur

Umferð 1: CF: 0 TF: 1

Ritun kóða

Nokkuð sömu rök og að ofan eiga við um að skrifa kóðann sjálfan. Til að fá skjótt dæmi, skoðaðu nákvæmlega sömu auðlindir og að ofan, en lýst er í Terraform:

vefsíðan „aws_instance“ „vefur“ {
  ami = "12345-6789-10"
  dæmi_type = "t2.micro"

  merki {
    Nafn = "Sweet"
  }
}
gögn "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

vefsíðan „aws_eip_association“ „pip“ {
  instans_id = "$ {aws_instance.web.id}"
  allocation_id = "$ {data.aws_eip.pip.id}"
}
vefsíðan „aws_security_group“ „allow_all“ {
  name = "allow_ssh"
  lýsing = "Leyfa ssh hvaðan sem er"

  inngöngu {
    frá_port = 0
    to_port = 22
    siðareglur = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
vefsíðan „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}"
}

Munurinn er átakanlegur, er það ekki? Athugaðu hversu auðvelt það er að vísa til annarra auðlinda með auðkenni þeirra. Með snöggu sýn geturðu sagt hvað er að gerast og gert grunnbreytingar á innviðum. Sem færir okkur fallega á annan stað

Umferð # 2 CF: 0 TF: 1

Staðfesta kóða

CF leyfir aðeins setningafræði. Svo í besta falli mun það segja þér að þú saknaðir sviga hér og þar. Áður en þú reynir að nota CloudFormation sniðmát þá veistu ekki hvort allar breytur sem þú hefur notað séu leysanlegar en hvað er mesti gallinn er að þú veist ekki hvað er að fara að gerast.
Terraform aftur á móti, staðfestir .tf skrár, athugar ekki aðeins setningafræði heldur einnig hvort öll skilyrði leysa almennilega og það gefur þér áætlun! Já, með Terraform færðu í raun að sjá hvað er að fara að búa til / breyta / eyða áður en þú notar kóðann þinn!

Framkvæmdaáætlun hefur verið gerð og er sýnd hér að neðan.
Aðgerðafræði er sýnd með eftirfarandi táknum:
  + búa til
Terraform mun framkvæma eftirfarandi aðgerðir:
+ azurerm_resource_group.test_tf101
      id: 
      staðsetning: "ukwest"
      nafn: "test_tf101"
      merkjum.%: 
+ azurerm_subnet.sub1
      id: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      nafn: "undir-1"
      netkerfi_öryggi_hópur: 
      resource_group_name: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
Plan: 2 til að bæta við, 0 til að breyta, 0 til að eyða.
-------------------------------------------------- ------------------

Umferð 3 CF: 0 TF: 1

Ytra ástand

Terraform gerir þér kleift að flytja inn gögn frá afskekktum uppruna, til dæmis í öðru umhverfi sem stjórnað er í mismunandi ástandi. Þetta gerir þér kleift að aðgreina auðlindir og ábyrgð auðveldlega. Tilgreindu einfaldlega uppruna ytri upplýsinga og notaðu það sem þeim verður vart.
CloudFormation hefur hugmynd um Cross-Stack tilvísanir, en jafnvel að komast í gegnum skjölin er sársauki, og dæmi um AWS til að setja upp VPC peering er 71 línur, samanborið við 17 í Terraform.

Umferð 4 CF: 0 TF: 1

Aðgerðir

Athugaðu bútinn hér að neðan.

vefsíðan „aws_instance“ „vefur“ {
  # Búðu til eitt dæmi fyrir hvert gestgjafarnafn
  telja = "$ {lengd (var.hostnames)}"

  # Framhjá hverju tilviki samsvarandi sniðmátsskrá
  user_data = "$ {data.template.web_init. *. veitt [count.index]}"
}

Já. Terraform hefur töluvert af innbyggðum aðgerðum sem gera þér kleift að setja rökfræði í kóðann þinn, svo þú getur smíðað betur með minni kóða, eða búið til mismunandi mannvirki með sama kóða, en með mismunandi breytur eftir þörfum.

Umferð 5 CF: 0 TF: 1

Einingar

Þú getur flokkað tiltekin úrræði sem þú notar alltaf í tengslum og búið til einingar, sem gerir það enn auðveldara að lýsa yfir ákveðnum tegundum auðlinda. Þú gætir samningur það svo að lýsa yfir VM er aðeins 4 línur af kóða! Það sem meira er, með breytu „talningu“ geturðu haft eins marga og þú vilt, einfaldlega með því að breyta tölu.

breyta "telja" {
  sjálfgefið = 2
}

vefsíðan „aws_instance“ „vefur“ {
  # ...

  count = "$ {var.count}"

  # Merktu dæmi með teljara sem byrjar á 1, þ.e. vefur-001
  merki {
    Nafn = "$ {snið (" vef-% 03d ", telja.index + 1)}"
  }
}

Umferð # 6 CF: 0 TF: 1

Teymisvinna

Vegna þess að HCL Terraform er eins og hvert annað forritunarmál, þá er það vinsamlegt á þann hátt að beðið er vel um breytingar, svo það er þægilegt að gera gagnrýni og vinna saman að kóða. Prófaðu að gera það sama með JSON sem er að lokum gagnaskipulag. Helmingur diffs er bara ketill hávaði, og þá sumir.

Umferð 7 CF: 0 TF: 1

Veitendur

Að miklu leyti vanmetið afl Terraform er hæfileikinn til að stjórna öllum þáttum innviða þinna með sama tæki. Þú ert með lista yfir 70+ veitendur sem þú getur notað, allt frá AWS, trog Azure, til Gitlab, Fastly, Chef, Docker, þú nefnir það. Og það er allt að nota sama HCL sem þú þarft að læra einu sinni. Æðislegur!

Umferð 8 CF: 0 TF: 1

Yfirlit

Eftir 8 umferðir er það

CloudFormation: 0 vs Terraform: 8.

Jafnvel eftir að hafa bætt við aukapunkti, Heck jafnvel tvö í CloudFormation fyrir að vera nær endanlegri niðurstöðu AWS tilboðsins er CF 2 TF 8, sem þýðir að Terraform algerlega andskotaði andstæðing sinn!
Ég er nokkuð viss um að það sama á við um Azure ARM sniðmát vs Terraform, svo það er, tveir samanburðir í einu. Núna kalla ég hagkvæmni.

Fyrirvari
Þessi færsla er full af flýtileiðum og líklega einnig villum og ranghugmyndum, sem ég mun glöð leiðrétta þegar bent er á. Ég myndi elska að vekja umræðu, svo kannski er það agn falin hér eða þar. Terraform FTW.