CloudFormation vs Terraform

Terraform ແມ່ນ ເໜືອກ ວ່າ CloudFormation ໃນທຸກໆສະຖານະການຍົກເວັ້ນເວລາທີ່ທ່ານຕ້ອງໄດ້ໃຊ້ຄຸນລັກສະນະຕ່າງໆຂອງເສັ້ນເລືອດຝອຍຈາກ AWS. ນີ້ແມ່ນເຫດຜົນທີ່ວ່າ.

ເສັ້ນໂຄ້ງການຮຽນຮູ້:

ຂ້ອຍຄິດວ່າຄົນສ່ວນໃຫຍ່ຮຽນຮູ້ເຕັກໂນໂລຢີ ໃໝ່ໆ, ໂດຍການເຮັດຕາມການສອນຫລືເບິ່ງຕົວຢ່າງ. ນີ້ແມ່ນງ່າຍທີ່ຈະເຮັດກັບພາສາການຂຽນໂປແກຼມສ່ວນໃຫຍ່, ຢ່າງ ໜ້ອຍ ກໍ່ແມ່ນລະດັບການເຂົ້າ.
ບໍ່ແມ່ນກັບ CloudFormation. ມັນມີຮູບແບບ JSON (ຫຼື YAML). ມັນຖືກອອກແບບມາເພື່ອ ນຳ ໃຊ້ແລະຜະລິດໂດຍຄອມພິວເຕີ - ບໍ່ແມ່ນມະນຸດ. ທົດລອງຕົວທ່ານເອງ, ຂ້າງລຸ່ມນີ້ແມ່ນຕົວຢ່າງລະຫັດຕົວຢ່າງທີ່ຕ້ອງການເພື່ອສະແດງຕົວຢ່າງ EC2 (ໂດຍພື້ນຖານແລ້ວແມ່ນ VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
….
150 ເສັ້ນຂອງ blah blah blah ...
….
  },,

  "ຊັບ​ພະ​ຍາ​ກອນ" : {
    "EC2 ໜ້າ ວຽກ": {
      "ປະເພດ": "AWS :: EC2 :: ຕົວຢ່າງ",
      "ຄຸນສົມບັດ": {
        "UserData": {"Fn :: Base64": {"Fn :: ເຂົ້າຮ່ວມ": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"ອ້າງອິງ": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"ອ້າງອິງ": "AWS :: ຂົງເຂດ"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"ອ້າງອີງ:" InstanceType "}," Arch "]}]}
      }
    },,

    "InstanceSecurityGroup": {
      "ປະເພດ": "AWS :: EC2 :: SecurityGroup",
      "ຄຸນສົມບັດ": {
        "GroupDescription": "ເປີດໃຊ້ການເຂົ້າເຖິງ SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },,

    "IPAddress": {
      "ປະເພດ": "AWS :: EC2 :: EIP"
    },,

    "IPAssoc": {
      "ປະເພດ": "AWS :: EC2 :: EIPAssociation",
      "ຄຸນສົມບັດ": {
        "InstanceId": {"ອ້າງອິງ": "EC2Instance"},
        "EIP": {"ອ້າງອິງ": "IPAddress"}
      }
    }
  },,
  "ຜົນໄດ້ຮັບ": {
    "InstanceId": {
      "ລາຍລະອຽດ": "ຕົວຢ່າງຂອງຕົວຢ່າງ EC2 ທີ່ສ້າງຂື້ນ ໃໝ່",
      "ຄ່າ": {"ອ້າງອິງ": "EC2Instance"}
    },,
    "InstanceIPAddress": {
      "ລາຍລະອຽດ": "ທີ່ຢູ່ IP ຂອງຕົວຢ່າງ EC2 ທີ່ສ້າງ ໃໝ່",
      "ຄ່າ": {"ອ້າງອິງ": "IPAddress"}
    }
  }
}

ຂີ້ຮ້າຍ. ລະຫັດ 210 ສາຍເພື່ອໃຫ້ໄດ້ VM ທີ່ມີ IP ສາທາລະນະປົກປ້ອງໂດຍກຸ່ມ Security. 210. 210! ໃນທຸກໆຮູບແບບຂອງລະຫັດທີ່ມີຫຼາຍລະຫັດຂອງເຄື່ອງປັ້ນດິນເຜົາ, ນັ້ນແມ່ນສິ່ງລົບກວນໂດຍພື້ນຖານ (ຫຼາຍກວ່ານີ້ຕໍ່ມາ).
ຖ້າວ່າມັນບໍ່ພຽງພໍທີ່ຈະເຮັດໃຫ້ທ່ານຢູ່ໃນຂັ້ນຕອນນີ້, ເບິ່ງເອກະສານທາງການ. ດຽວນີ້ມັນໄດ້ປ່ຽນໄປສູ່ການ ນຳ ໃຊ້ YAML, ແຕ່ເມື່ອທ່ານຕ້ອງການເບິ່ງຕົວຢ່າງຫຍໍ້ຕົວຢ່າງ, ເບິ່ງວ່າມັນຢູ່ໃນ JSON. ດຽວກັນນີ້ແມ່ນຄວາມຈິງ ສຳ ລັບຜົນລັບຂອງ google.
BTW. ເມື່ອທ່ານມີຕົວຢ່າງທີ່ແຕກຕ່າງກັນໃນແຕ່ລະພາກ, ທ່ານສາມາດເວົ້າບາງສິ່ງບາງຢ່າງທີ່ປາສະຈາກ

ຮອບທີ 1: CF: 0 TF: 1

ຂຽນລະຫັດ

ການໂຕ້ຖຽງທີ່ຄ້າຍຄືກັນກັບຂ້າງເທິງນີ້ແມ່ນຂ້ອນຂ້າງຫຼາຍທີ່ຈະໃຊ້ໃນການຂຽນລະຫັດຕົວມັນເອງ. ສຳ ລັບຕົວຢ່າງທີ່ວ່ອງໄວລອງເບິ່ງຊັບພະຍາກອນດຽວກັນກັບທີ່ກ່າວມາຂ້າງເທິງ, ແຕ່ອະທິບາຍໃນ Terraform:

ຊັບພະຍາກອນ "aws_instance" "web" {
  ami = "12345-6789-10"
  example_type = "t2.micro"

  ແທັກ {
    ຊື່ = "ຫວານ"
  }
}
ຂໍ້ມູນ "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

ຊັບພະຍາກອນ "aws_eip_association" "pip" {
  example_id = "$ {aws_instance.web.id}"
  allocation_id = "$ {data.aws_eip.pip.id}"
}
ຊັບພະຍາກອນ "aws_security_group" "allow_all" {
  name = "allow_ssh"
  description = "ອະນຸຍາດໃຫ້ ssh ຈາກທຸກບ່ອນ"

  ເຄື່ອງດື່ມ {
    from_port = 0
    to_port = 22
    ໂປໂຕຄອນ = "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_instance.web.primary_network_interface_id}"
}

ຄວາມແຕກຕ່າງແມ່ນ ໜ້າ ຕົກໃຈ, ແມ່ນບໍ? ໃຫ້ສັງເກດວ່າມັນງ່າຍທີ່ຈະອ້າງອີງເຖິງແຫລ່ງອື່ນໂດຍບັດປະ ຈຳ ຕົວຂອງພວກເຂົາ. ດ້ວຍການເບິ່ງໄວໆທ່ານສາມາດບອກໄດ້ວ່າ ກຳ ລັງເກີດຫຍັງຂຶ້ນແລະປ່ຽນແປງພື້ນຖານໂຄງລ່າງ. ເຊິ່ງງາມ ນຳ ພວກເຮົາໄປສູ່ຈຸດອື່ນ

ຮອບ # 2 CF: 0 TF: 1

ລະຫັດຢືນຢັນ

CF ພຽງແຕ່ອະນຸຍາດໃຫ້ມີການກວດສອບ syntax ເທົ່ານັ້ນ. ສະນັ້ນທີ່ດີທີ່ສຸດມັນຈະບອກທ່ານວ່າທ່ານພາດວົງເລັບຢູ່ບ່ອນນີ້ແລະບ່ອນນັ້ນ. ກ່ອນທີ່ທ່ານຈະລອງໃຊ້ແບບ CloudFormation, ທ່ານຈະບໍ່ຮູ້ວ່າທຸກໆຕົວປ່ຽນແປງທີ່ທ່ານເຄີຍໃຊ້ແມ່ນສາມາດແກ້ໄຂໄດ້ແຕ່ຂໍ້ເສຍປຽບທີ່ໃຫຍ່ທີ່ສຸດແມ່ນທ່ານບໍ່ຮູ້ວ່າຈະມີຫຍັງເກີດຂື້ນ.
ໃນທາງກົງກັນຂ້າມ, ການກວດສອບເອກະສານ .tf, ກວດສອບບໍ່ພຽງແຕ່ syntax ເທົ່ານັ້ນແຕ່ວ່າການເພິ່ງພາອາໃສທັງ ໝົດ ກໍ່ແກ້ໄຂຢ່າງຖືກຕ້ອງ, ແລະມັນກໍ່ໃຫ້ທ່ານວາງແຜນ! ແມ່ນແລ້ວ, ກັບ Terraform ຕົວຈິງແລ້ວທ່ານຈະໄດ້ເຫັນສິ່ງທີ່ຈະຖືກສ້າງຂື້ນ / ປ່ຽນແປງ / ທຳ ລາຍກ່ອນທີ່ທ່ານຈະໃຊ້ລະຫັດຂອງທ່ານ!

ແຜນການປະຕິບັດໄດ້ຖືກສ້າງຂຶ້ນແລະສະແດງຢູ່ດ້ານລຸ່ມ.
ການກະ ທຳ ຂອງຊັບພະຍາກອນແມ່ນສະແດງດ້ວຍສັນຍາລັກຕໍ່ໄປນີ້
  + ສ້າງ
Terraform ຈະ ດຳ ເນີນການຕໍ່ໄປນີ້:
+ azurerm_resource_group.test_tf101
      id: <ແນະ ນຳ>
      ສະຖານທີ່: "ukwest"
      ຊື່: "test_tf101"
      tags.%: <ຄອມພິວເຕີ້>
+ azurerm_subnet.sub1
      id: <ແນະ ນຳ>
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      ຊື່: "ຍ່ອຍ 1"
      network_security_group_id: 
      resource_group_name: "test_tf101"
      ເສັ້ນທາງ_table_id: 
      virtual_network_name: "test_vnet"
ແຜນການ: 2to ຕື່ມ, 0 ປ່ຽນ, 0 ເພື່ອ ທຳ ລາຍ.
---------------------------------------------------------------------- ------------------

ຮອບ # 3 CF: 0 TF: 1

ລັດຫ່າງໄກສອກຫຼີກ

Terraform ຊ່ວຍໃຫ້ທ່ານສາມາດ ນຳ ເຂົ້າຂໍ້ມູນຈາກແຫລ່ງທີ່ຢູ່ຫ່າງໄກສອກຫຼີກໄດ້ງ່າຍ, ຕົວຢ່າງສະພາບແວດລ້ອມອື່ນໆທີ່ຄວບຄຸມຢູ່ໃນສະພາບຕ່າງກັນ. ນີ້ຊ່ວຍໃຫ້ທ່ານສາມາດແບ່ງແຍກຊັບພະຍາກອນແລະຄວາມຮັບຜິດຊອບໄດ້ງ່າຍ. ພຽງແຕ່ປະກາດແຫຼ່ງຂໍ້ມູນພາຍນອກແລະ ນຳ ໃຊ້ສິ່ງໃດກໍ່ຕາມທີ່ມັນຖືກເປີດເຜີຍ.
CloudFormation ມີແນວຄິດກ່ຽວກັບເອກະສານອ້າງອີງ Cross-Stack, ແຕ່ເຖິງແມ່ນວ່າການໄດ້ຮັບໂດຍຜ່ານເອກະສານແມ່ນຄວາມເຈັບປວດ, ແລະຕົວຢ່າງກ່ຽວກັບ AWS ໃນການຕັ້ງຄ່າ VPC peering ແມ່ນ 71 ເສັ້ນ, ທຽບກັບ 17 ໃນ Terraform.

ຮອບ # 4 CF: 0 TF: 1

ໜ້າ ທີ່

ກວດເບິ່ງຂໍ້ຄວາມຫຍໍ້ຂ້າງລຸ່ມ.

ຊັບພະຍາກອນ "aws_instance" "web" {
  # ສ້າງຕົວຢ່າງ ໜຶ່ງ ສຳ ລັບແຕ່ລະ hostname
  count = "$ {ຄວາມຍາວ (var.hostnames)}"

  # ຜ່ານແຕ່ລະຕົວຢ່າງຂອງມັນ template_file ທີ່ສອດຄ້ອງກັນ
  user_data = "$ {data.template.web_init. *. rendered [count.index]}"
}

ແມ່ນແລ້ວ. Terraform ມີການກໍ່ສ້າງໃນບາງ ໜ້າ ທີ່ທີ່ຊ່ວຍໃຫ້ທ່ານສາມາດໃສ່ເຫດຜົນໃນລະຫັດຂອງທ່ານ, ດັ່ງນັ້ນທ່ານສາມາດສ້າງໄດ້ດີກວ່າດ້ວຍລະຫັດ ໜ້ອຍ, ຫຼືມີໂຄງສ້າງທີ່ແຕກຕ່າງກັນສ້າງໂດຍໃຊ້ລະຫັດດຽວກັນ, ແຕ່ມີຕົວແປທີ່ແຕກຕ່າງກັນຕາມຄວາມຕ້ອງການ.

ຮອບ # 5 CF: 0 TF: 1

ໂມດູນ

ທ່ານສາມາດຈັດກຸ່ມຊັບພະຍາກອນສະເພາະໃດ ໜຶ່ງ ທີ່ທ່ານໃຊ້ຢູ່ສະ ເໝີ ເຂົ້າກັນແລະສ້າງໂມດູນ, ເຮັດໃຫ້ການປະກາດຊັບພະຍາກອນບາງປະເພດງ່າຍຂື້ນ. ທ່ານສາມາດອັດມັນເພື່ອວ່າການປະກາດ VM ແມ່ນພຽງ 4 ລະຫັດຂອງລະຫັດ! ຍິ່ງໄປກວ່ານັ້ນ, ການໃຊ້ຕົວເລກ "ຕົວແປ" ທີ່ທ່ານສາມາດມີໄດ້ຫຼາຍເທົ່າທີ່ທ່ານຕ້ອງການ, ໂດຍການປ່ຽນເລກ ໝາຍ ເລກ ໜຶ່ງ.

ຕົວແປ "ນັບ" {
  default = 2
}

ຊັບພະຍາກອນ "aws_instance" "web" {
  # …

  count = "$ {var.count}"

  # ແທັກຍົກຕົວຢ່າງດ້ວຍຕົວແທນເລີ່ມຕົ້ນທີ່ 1, ie. web-001
  ແທັກ {
    ຊື່ = "$ {ຮູບແບບ (" web-% 03d ", count.index + 1)}"
  }
}

ຮອບ # 6 CF: 0 TF: 1

ເຮັດວຽກເປັນທີມ

ເນື່ອງຈາກວ່າ Terraform's HCL ແມ່ນຄ້າຍຄືກັບພາສາການຂຽນໂປຼແກຼມອື່ນໆທີ່ມັນມີຄວາມເປັນມິດໃນແບບທີ່ດຶງການຮ້ອງຂໍໃຫ້ເນັ້ນການປ່ຽນແປງທີ່ດີ, ສະນັ້ນມັນສະດວກສະບາຍທີ່ຈະກວດກາແລະຮ່ວມມືກັນໃນລະຫັດ. ລອງເຮັດແບບດຽວກັບ JSON ເຊິ່ງສຸດທ້າຍແມ່ນໂຄງສ້າງຂໍ້ມູນ. ເຄິ່ງ ໜຶ່ງ ຂອງສິ່ງທີ່ແຕກຕ່າງແມ່ນພຽງແຕ່ສິ່ງລົບກວນຂອງການຜະລິດ, ແລະຈາກນັ້ນບາງອັນ.

ຮອບ # 7 CF: 0 TF: 1

ຜູ້ສະ ໜອງ

ພະລັງງານທີ່ບໍ່ໄດ້ຖືກຄາດຄະເນໂດຍສ່ວນໃຫຍ່ຂອງ Terraform ແມ່ນຄວາມສາມາດໃນການຄວບຄຸມທຸກໆດ້ານຂອງພື້ນຖານໂຄງລ່າງຂອງທ່ານດ້ວຍເຄື່ອງມືດຽວກັນ. ທ່ານມີບັນຊີລາຍຊື່ຂອງຜູ້ໃຫ້ບໍລິການ 70+ ທ່ານສາມາດໃຊ້ໄດ້, ຕັ້ງແຕ່ AWS, trough Azure, ເຖິງ Gitlab, ໄວ, Chef, Docker, ທ່ານຕັ້ງຊື່ມັນ. ແລະມັນໃຊ້ທັງ ໝົດ HCL ດຽວກັນທີ່ທ່ານຕ້ອງຮຽນຮູ້ເທື່ອດຽວ. ອັດສະຈັນ!

ຮອບ # 8 CF: 0 TF: 1

ບົດສະຫຼຸບ

ຫລັງຈາກ 8 ຮອບ, ມັນແມ່ນ

CloudFormation: 0 vs Terraform: 8.

ເຖິງແມ່ນວ່າຫລັງຈາກໄດ້ເພີ່ມຈຸດພິເສດແລ້ວ, ເຖິງແມ່ນວ່າສອງຈຸດທີ່ຈະ CloudFormation ສໍາລັບການໃກ້ຊິດກັບການສະເຫນີຂອງ AWS ຜົນໄດ້ຮັບສຸດທ້າຍແມ່ນ CF 2 TF 8, ຊຶ່ງຫມາຍຄວາມວ່າ Terraform ໄດ້ຕີຄູ່ແຂ່ງຂອງຕົນຢ່າງແທ້ຈິງ!
ຂ້າພະເຈົ້າແນ່ໃຈວ່າສິ່ງດຽວກັນນີ້ໃຊ້ກັບແມ່ແບບ Azure ARM vs Terraform, ສະນັ້ນ, ມັນມີຢູ່, ສອງການປຽບທຽບໃນ ໜຶ່ງ ດຽວ. ນີ້ແມ່ນສິ່ງທີ່ຂ້ອຍເອີ້ນວ່າປະສິດທິພາບ.

ປະຕິເສດ
ຂໍ້ຄວາມນີ້ເຕັມໄປດ້ວຍທາງລັດແລະອາດຈະມີຂໍ້ຜິດພາດແລະຄວາມເຂົ້າໃຈຜິດເຊິ່ງຂ້ອຍຈະຖືກແກ້ໄຂຢ່າງມີຄວາມສຸກເມື່ອຖືກຊີ້ໃຫ້ເຫັນ. ຂ້ອຍມັກເຮັດໃຫ້ການສົນທະນາສົນທະນາ, ດັ່ງນັ້ນບາງທີມັນອາດຈະມີຖີ້ມຢູ່ບ່ອນນີ້ຫລືຢູ່ບ່ອນນັ້ນ. Terraform FTW.