CloudFormation супраць Terraform

Terraform пераўзыходзіць CloudFormation у любым сцэнарыі, за выключэннем выпадкаў, калі вы абсалютна павінны выкарыстоўваць асаблівасці краёў ад AWS. Вось чаму.

Крывая навучання:

Я думаю, што большасць людзей вывучаюць новыя тэхналогіі, вынікаючы навучальных дапаможнікаў або разглядаючы прыклады. Гэта зрабіць даволі лёгка з большасцю моў праграмавання, прынамсі для пачатковага ўзроўню.
Не з CloudFormation. Гэта фармат JSON (або YAML). Ён распрацаваны так, каб спажываць і вырабляць кампутары, а не людзі. Паспрабуйце самі, ніжэй прыведзены прыклад фрагмента кода, неабходны для атрымання экзэмпляра EC2 (у асноўным гэта VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 радкоў бла-бла-бла ...
....
  },

  "Рэсурсы": {
    "EC2Instance": {
      "Тып": "AWS :: EC2 :: асобнік",
      "Уласцівасці": {
        "UserData": {"Fn :: Base64": {"Fn :: Рэгістрацыя": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Рэгіён"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]}
      }
    },

    "InstanceSecurityGroup": {
      "Тып": "AWS :: EC2 :: SecurityGroup",
      "Уласцівасці": {
        "GroupDescription": "Уключыць доступ да SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "IP-адрас" : {
      "Тып": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Тып": "AWS :: EC2 :: EIPAssociation",
      "Уласцівасці": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAdress"}
      }
    }
  },
  "Вынікі": {
    "InstanceId": {
      "Апісанне": "InstanceId нядаўна створанага асобніка EC2",
      "Значэнне": {"Ref": "EC2Instance"}
    },
    "Адрас асобніка": {
      "Апісанне": "IP-адрас нядаўна створанага асобніка EC2",
      "Значэнне": {"Ref": "IPAdress"}
    }
  }
}

Непрыгожа. 210 радкоў кода, каб атрымаць VM з адкрытым IP, які ахоўваецца групай бяспекі. 210. 210! У кожным шаблоне ёсць вялікая колькасць кода, гэта ў асноўным шум (больш падрабязна пра гэта крыху пазней).
Калі гэтага недастаткова, каб адкласці вас на гэтым этапе, паглядзіце афіцыйную дакументацыю. Цяпер ён перайшоў да выкарыстання YAML, але калі вы хочаце паглядзець узоры фрагментаў, высветлілася, што ўсе яны ў JSON. Тое ж самае тычыцца вынікаў Google.
Дарэчы. калі ў вас ёсць розныя ўзоры фрагментаў у рэгіёне, вы можаце сказаць, што нешта рыбнае

№ 1: CF: 0 TF: 1

Напісанне кода

У прынцыпе аднолькавыя аргументы, як і вышэй, ставяцца да напісання кода. Для кароткага прыкладу паглядзіце на сапраўды тыя ж рэсурсы, што і вышэй, але апісаныя ў Terraform:

рэсурс "aws_in substance" "web" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  тэгі {
    Name = "Салодкі"
  }
}
дадзеныя "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

рэсурс "aws_eip_association" "pip" {
  instance_id = "$ {aws_instan.web.id}"
  distribution_id = "$ {data.aws_eip.pip.id}"
}
рэсурс "aws_security_group" "enable_all" {
  name = "enable_ssh"
  description = "Дазволіць ssh паўсюдна"

  ўваходжанне {
    from_port = 0
    to_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
рэсурс "aws_network_interface_sg_attachment" "sg_attachment" {
  security_group_id = "$ {aws_security_group.allow_all.id}"
  network_interface_id = "$ {aws_instan.web.primary_network_interface_id}"
}

Розніца шакіруе, ці не так? Звярніце ўвагу, як лёгка спасылацца на іншыя рэсурсы па сваіх ідэнтыфікатарах. Кароткім поглядам вы можаце даведацца, што адбываецца, і ўнесці асноўныя змены ў інфраструктуру. Што прыемна падводзіць нас да іншай кропкі

2 тур CF: 0 TF: 1

Пацверджаны код

CF дазваляе толькі праверку сінтаксісу. Так што ў лепшым выпадку ён скажа вам, што вы прапусцілі кранштэйн тут і там. Перш чым паспрабаваць ужыць шаблон CloudFormation, вы не ведаеце, ці можа выкарыстоўвацца кожная выкарыстоўваемая вамі пераменная, але самы недахоп - вы не ведаеце, што будзе.
Terraform з іншага боку, правярае .tf файлы, правяраючы не толькі сінтаксіс, але і, калі ўсе залежныя вырашаюцца правільна, і гэта дае вам план! Так, з Terraform вы сапраўды бачыце, што будзе створана / зменена / знішчана перад тым, як ужыць код!

План выканання быў створаны і паказаны ніжэй.
Дзеянні з рэсурсам абазначаюцца наступнымі сімваламі:
  + стварыць
Terraform будзе выконваць наступныя дзеянні:
+ azurerm_resource_group.test_tf101
      id: <вылічана>
      месцазнаходжанне: "ukwest"
      назва: "test_tf101"
      тэгі.%: <вылічана>
+ azurerm_subnet.sub1
      id: <вылічана>
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: <вылічана>
      назва: "пад-1"
      network_security_group_id: <вылічана>
      resource_group_name: "test_tf101"
      route_table_id: <вылічана>
      virtual_network_name: "test_vnet"
План: 2дадаць, 0 змяніць, 0 знішчыць.
-------------------------------------------------- ------------------

3 тур CF: 0 TF: 1

Аддалены стан

Terraform дазваляе лёгка імпартаваць дадзеныя з аддаленых крыніц, напрыклад з іншых асяроддзяў, якія кантралююцца ў іншым стане. Гэта дазваляе лёгка падзяляць рэсурсы і абавязкі. Проста заявіце пра крыніцу знешняй інфармацыі і выкарыстоўвайце ўсё, што ёй падвяргаецца.
CloudFormation мае паняцце Cross-Stack References, але нават праходжанне дакументацыі - гэта боль, і, напрыклад, AWS для наладжвання пірынга VPC складае 71 радок у параўнанні з 17 у Terraform.

4 тур CF: 0 TF: 1

Функцыі

Праверце фрагмент ніжэй.

рэсурс "aws_in substance" "web" {
  # Стварыце адзін асобнік для кожнага імя хаста
  count = "$ {length (var.hostnames)}"

  # Перадайце кожнаму асобніку адпаведны шаблон_файла
  user_data = "$ {data.template.web_init. *. вынесена [count.index]}"
}

Так. Terraform мае даволі шмат убудаваных функцый, якія дазваляюць вам укладваць логіку ў свой код, таму вы можаце будаваць лепш з меншым кодам або мець розныя структуры, пабудаваныя з выкарыстаннем аднаго і таго ж кода, але з рознымі зменнымі ў залежнасці ад патрэб.

5 тур CF: 0 TF: 1

Модулі

Вы можаце згрупаваць пэўныя рэсурсы, якія вы заўсёды выкарыстоўваеце сумесна, і стварыць модулі, што палягчае аб'яўленне пэўных тыпаў рэсурсаў. Вы маглі б гэта кампактна, так што аб'ява VM - гэта ўсяго 4 радкі кода! Больш таго, выкарыстоўваючы зменную "колькасць" вы можаце мець столькі, колькі хочаце, проста змяніўшы лік.

зменная "кол" {
  па змаўчанні = 2
}

рэсурс "aws_in substance" "web" {
  # ...

  count = "$ {var.count}"

  # Пазначце асобнік лічыльнікам, пачынаючы з 1, г.зн. павуцінне-001
  тэгі {
    Name = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

6 тур CF: 0 TF: 1

Работа ў камандзе

Паколькі HCL Terraform падобны на любую іншую мову праграмавання, ён Git friendly такім чынам, каб выцягваць запыты прыгожа вылучаць змены, так што зручна рабіць агляды і супрацоўнічаць над кавалкам кода. Паспрабуйце зрабіць тое ж самае з JSON, што ў канчатковым выніку з'яўляецца структурай дадзеных. Палова адрозненняў - гэта проста шум, а потым нейкі.

7 тур CF: 0 TF: 1

Пастаўшчыкі

У значнай ступені недаацэненая магутнасць Terraform - гэта магчымасць кантраляваць кожны аспект вашай інфраструктуры тым жа інструментам. У вас ёсць спіс з 70+ правайдэраў, якія вы можаце выкарыстоўваць, пачынаючы ад AWS, праз Azure, да Gitlab, Fastly, Chef, Docker, вы называеце яго. І ўсё выкарыстоўваецца той жа HCL, які вы павінны даведацца адзін раз. Дзіўна!

8 тур CF: 0 TF: 1

Рэзюмэ

Пасля 8 раўндаў, справа

CloudFormation: 0 супраць тэраформы: 8.

Нават пасля таго, як дадаць дадатковую кропку, чорт вазьмі яшчэ два ў CloudFormation за тое, што яны бліжэй да прапаноў AWS, канчатковы вынік - CF 2 TF 8, што азначае, што Terraform абсалютна разграміў свайго суперніка!
Я ўпэўнены, што тое ж самае тычыцца і шаблонаў ARM Azure супраць Terraform, так што ў адным ёсць два параўнання. Цяпер я называю эфектыўнасць.

Адмова ад адказнасці
Гэтая публікацыя поўная ярлыкоў і, магчыма, таксама памылак і памылак, якія я з задавальненнем выпраўляю, калі ўказваю. Я хацеў бы распаліць дыскусію, так што, магчыма, там ёсць прынада, схаваная. Тэраформная ЛТВ.