CloudFormation va Terraform

Terraform har bir stsenariyda CloudFormation-dan ustundir, bundan tashqari siz AWS qon ketishining cheklangan xususiyatlaridan foydalanishingiz kerak. Mana shuning uchun.

O'rganish egri:

O'ylaymanki, ko'pchilik yangi texnologiyalarni darsliklarga yoki misollarga qarab o'rganadilar. Hech bo'lmaganda kirish darajasi uchun ko'pgina dasturlash tillari bilan bu juda oson.
CloudFormation bilan emas. Bu JSON (yoki YAML) formatlangan. U odamlar tomonidan emas, balki kompyuterlar tomonidan ishlatilishi va ishlab chiqarilishi uchun yaratilgan. O'zingizni sinab ko'ring, quyida EC2 nusxasini (asosan VM) yigirish uchun talab qilinadigan kod parchasining namunasi keltirilgan:

{
  "AWSTemplateFormatVersion": "2010-09-09",
….
Blah blah 150 satr ...
….
  },

  "Resurslar": {
    "EC2Instance": {
      "Turi": "AWS :: EC2 :: Instans",
      "Xususiyatlar": {
        "UserData": {"Fn :: Base64": {"Fn :: qo'shilish": ["", ["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": {
      "Turi": "AWS :: EC2 :: SecurityGroup",
      "Xususiyatlar": {
        "GroupDescription": "SSH kirishni yoqish",
        "SecurityGroupIngress":
          [{"IpProtokol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

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

    "IPAssoc": {
      "Turi": "AWS :: EC2 :: EIPAssociation",
      "Xususiyatlar": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Chiqishlar": {
    "InstanceId": {
      "Ta'rif": "yangi yaratilgan EC2 instantsiyasining InstanceId",
      "Qiymat": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Ta'rif": "yangi yaratilgan EC2 nusxasining IP-manzili",
      "Qiymat": {"Ref": "IPAddress"}
    }
  }
}

Yomon. Security Group tomonidan himoyalangan umumiy IP-ga ega bo'lgan VM-ni olish uchun 210 kod satrlari 210. 210! Har bir shablonda juda ko'p miqdordagi qozon kodi mavjud, bu shovqin (bu haqida keyinroq).
Agar sizni ushbu bosqichda qoldirish uchun etarli bo'lmasa, rasmiy hujjatlarni ko'rib chiqing. Endi u YAML-dan foydalanishga o'tdi, ammo siz parchalarni ko'rishni xohlasangiz, ularning barchasi JSON-da ekanligi ayon bo'ladi. Xuddi shu narsa google natijalari uchun ham amal qiladi.
BTW. har bir mintaqada turli xil bo'lakchalar bo'lganda, siz biron bir narsani baliq deb aytishingiz mumkin

1-tur: CF: 0 TF: 1

Kodni yozish

Yuqoridagi kabi bir xil dalillar kodning o'zi yozilishida qo'llaniladi. Qisqa misol uchun yuqoridagi kabi bir xil manbalarni ko'rib chiqing, ammo Terraform-da tavsiflangan:

"aws_instance" "veb" manba {
  ami = "12345-6789-10"
  example_type = "t2.micro"

  teglar {
    Ism = "Shirin"
  }
}
ma'lumotlar "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

manba "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  ajratish_id = "$ {data.aws_eip.pip.id}"
}
manba "aws_security_group" "allow_all" {
  name = "allow_ssh"
  description = "Hamma joyda sshga ruxsat berish"

  kirish {
    dan_port = 0
    to_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
manba "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}"
}

Farq shok, shunday emasmi? Boshqa manbalarga ularning identifikatorlari bo'yicha murojaat qilish qanchalik osonligiga e'tibor bering. Bir qarashda nima bo'layotganini aytib berishingiz va infratuzilmani tubdan o'zgartirishingiz mumkin. Qanchadan-qancha bizni yaxshi tomonga olib chiqadi

Davra # 2 CF: 0 TF: 1

Tekshirish kodi

CF faqat sintaksisni tekshirishga imkon beradi. Shunday qilib, hech bo'lmaganda, siz bu erda va u erda qavsni o'tkazib yuborganingizni aytadi. CloudFormation shablonini qo'llashdan oldin, siz ishlatgan har bir o'zgaruvchini hal qilinishini bilmayapsiz, ammo eng katta kamchilik - nima bo'lishini bilmasligingizdir.
Boshqa tomondan, Terraform .tf fayllarini tekshiradi, bu nafaqat sintaksisni tekshiradi, balki barcha havolalar to'g'ri hal qilinsa va sizga reja tuzsa! Ha, Terraform yordamida kodni ishlatishdan oldin nimani yaratish / o'zgartirish / yo'q qilish kerakligini bilib olasiz!

Ijro rejasi tuzilgan va quyida ko'rsatilgan.
Resurs harakatlari quyidagi belgilar bilan ko'rsatilgan:
  + yaratish
Terraform quyidagi harakatlarni amalga oshiradi:
+ azurerm_resource_group.test_tf101
      id: 
      manzil: "ukwest"
      nomi: "test_tf101"
      teglar.%: 
+ azurerm_subnet.sub1
      id: 
      manzil_refiksi: "172.16.0.8/29"
      ip_configurations. #: 
      nomi: "pastki 1"
      Network_security_group_id: 
      resource_group_name: "test_tf101"
      marshrut_table_id: 
      virtual_network_name: "test_vnet"
Reja: 2tasini qo'shish, 0 o'zgartirish, 0 ni yo'q qilish.
-------------------------------------------------- ------------------

Davra № 3 CF: 0 TF: 1

Masofadan boshqarish

Terraform sizga uzoq manbalardan ma'lumotlarni, masalan, turli xil holatlarda boshqariladigan boshqa muhitlardan osongina import qilishga imkon beradi. Bu sizga resurslar va majburiyatlarni oson ajratish imkonini beradi. Shunchaki tashqi ma'lumot manbasini e'lon qiling va u duch kelgan har qanday narsadan foydalaning.
CloudFormation-da Cross-Stack Referentsiyalar tushunchasi mavjud, ammo hatto hujjatlarni ko'rib chiqish ham og'riqdir va VPC piringini o'rnatish uchun AWS-ga misol Terraform-dagi 17-ga nisbatan.

Davra № 4 CF: 0 TF: 1

Vazifalari

Parcha parchasini tekshiring.

"aws_instance" "veb" manba {
  # Har bir hostname uchun bitta misol yarating
  count = "$ {uzunligi (var.hostnames)}"

  # Har bir misolni tegishli shablon_faylga o'tkazing
  user_data = "$ {data.template.web_init. *. ko'rsatilgan [count.index]}"
}

Ha. Terraform sizning kodingizda mantiqni o'rnatishga imkon beradigan juda ko'p funktsiyalarga ega, shuning uchun siz kamroq kod bilan yaxshiroq qurishingiz yoki turli xil tuzilmalarni xuddi shu koddan foydalangan holda qurishingiz mumkin, ammo ehtiyojlarga qarab turli xil parametrlarga ega bo'lishingiz mumkin.

Davra № 5 CF: 0 TF: 1

Modullar

Siz har doim birgalikda ishlatadigan ma'lum manbalarni guruhlashingiz va modullarni yaratishingiz mumkin, bu esa ma'lum turdagi manbalarni e'lon qilishni osonlashtiradi. Siz VM-ni e'lon qilish faqat to'rtta satrdan iborat bo'lishi uchun uni siqib qo'yishingiz mumkin! Bundan tashqari, o'zgaruvchan "hisoblash" dan foydalanib, siz istaganingizcha sonni o'zgartirishingiz mumkin.

o'zgaruvchan "hisoblash" {
  standart = 2
}

"aws_instance" "veb" manba {
  # ...

  count = "$ {var.count}"

  # Instantsiyani hisoblagich bilan 1 dan boshlaydi, ya'ni. veb-001
  teglar {
    Ism = "$ {formati (" veb-% 03d ", count.index + 1)}"
  }
}

Dumaloq # 6 CF: 0 TF: 1

Jamoa ishi

Terraform HCL boshqa har qanday dasturlash tili kabi Git bilan do'stlashgani sababli, so'rovlarni chiroyli ta'kidlab, ularni o'zgartirishga imkon beradi, shu sababli kodlarni ko'rib chiqish va hamkorlik qilish qulay. JSON bilan xuddi shunday qilib ko'ring, natijada ma'lumotlar tuzilishi. Diffsning yarmi shunchaki qozon shovqini, keyin biroz.

Davra № 7 CF: 0 TF: 1

Ta'minlovchilar

Terraform-ning juda kam baholanadigan kuchi bu xuddi shu vosita yordamida infratuzilmaning har bir jihatini boshqarish qobiliyatidir. Siz AWS dan Azure-ga qadar Gitlab, Fastly, Chef, Docker-ga qadar foydalanishingiz mumkin bo'lgan 70+ provayderlarning ro'yxati bor, siz ularni shunday nomlaysiz. Va barchasi bir xil HCL-dan foydalangan holda siz bir marta o'rganishingiz kerak. Ajablanarli!

Davra № 8 CF: 0 TF: 1

Xulosa

8-turdan so'ng, shunday bo'ldi

CloudFormation: 0 va Terraform: 8.

Qo'shimcha nuqta qo'shgandan so'ng ham, CloudFormation-ga ikkitasini ham qo'shib qo'ying, chunki AWS qurbonliklariga yaqinroq bo'lish CF 2 TF 8 natijasidir, ya'ni Terraform raqibini butkul ezdi!
Ishonchim komilki, xuddi shu narsa Terraform va Azure ARM shablonlari uchun ham amal qiladi, shuning uchun bittada ikkita taqqoslash mavjud. Endi men samaradorlik deb atayman.

Rad etish
Ushbu xabar yorliqlar va xatolar va noto'g'ri tushunchalarga to'la, ularni ta'kidlaganimda ularni tuzataman. Men munozara qilishni istardim, ehtimol bu erda yoki u erda yashirinish mumkin. Terraform FTW.