CloudFormation vs Terraform

Terraform, hər ssenaridə CloudFormation-dan üstündür, istisna olmaqla, AWS-in qanaxma kənar xüsusiyyətlərindən tamamilə istifadə etməlisiniz. Buna görə.

Öyrənmə əyrisi:

Düşünürəm ki, əksər insanlar dərsləri izləmək və ya nümunələrə baxmaqla yeni texnologiyaları öyrənirlər. Ən azı giriş səviyyəsi üçün ən çox proqramlaşdırma dillərində bunu etmək olduqca asandır.
CloudFormation ilə deyil. Bu JSON (və ya YAML) biçimlidir. İnsanlar deyil, kompüterlər tərəfindən istehlak və istehsal üçün hazırlanmışdır. Özünüz cəhd edin, aşağıda bir EC2 nümunəsini (əsasən bir VM) fırlatmaq üçün tələb olunan bir nümunə kod parçasıdır:

{
  "AWSTemplateFormatVersion": "2010-09-09",
….
150 sətir blah blah blah ...
….
  },

  "Resurslar": {
    "EC2Instance": {
      "Növ": "AWS :: EC2 :: Ani",
      "Xüsusiyyətlər": {
        "UserData": {"Fn :: Base64": {"Fn :: Qoşulun": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "Təhlükəsizlik qrupları": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]}
      }
    },

    "InstanceSecurityGroup": {
      "Növ": "AWS :: EC2 :: SecurityGroup",
      "Xüsusiyyətlər": {
        "GroupDescription": "SSH girişi aktivləşdirin",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "IP ünvanı" : {
      "Növ": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Növ": "AWS :: EC2 :: EIPAssociation",
      "Xüsusiyyətlər": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Çıxışlar": {
    "InstanceId": {
      "Təsvir": "Yeni yaradılan EC2 instansiyasının InstanceId",
      "Dəyər": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Təsvir": "yeni yaradılan EC2 instansiyasının IP ünvanı",
      "Dəyər": {"Ref": "IPAddress"}
    }
  }
}

Murdar. Təhlükəsizlik Qrupu tərəfindən qorunan ictimai IP ilə bir VM almaq üçün 210 kod xətti. 210. 210! Hər şablonda çox sayda qazan şablon kodu var ki, bu da səs-küy doğurur (daha sonra bu barədə).
Bu mərhələdə sizi yola salmaq üçün kifayət deyilsə, rəsmi sənədlərə baxın. İndi YAML istifadə yönəlmişdir, ancaq nümunə parçalarına baxmaq istədikdə, hamısı JSON-dadır. Eyni nəticə google nəticələrinə aiddir.
BTW. hər bölgədə müxtəlif nümunə parçaları olduqda bir şeyin balıq olduğunu söyləyə bilərsiniz

1-ci tur: CF: 0 TF: 1

Kod yazmaq

Yuxarıdakı kimi eyni arqumentlər kodun yazılmasına aiddir. Sürətli bir nümunə üçün yuxarıda göstərilən eyni mənbələrə nəzər yetirin, lakin Terraform-da təsvir:

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

  etiketlər {
    Ad = "Şirin"
  }
}
data "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

resurs "aws_eip_association" "pip" {
  example_id = "$ {aws_instance.web.id}"
  ayrılması_id = "$ {data.aws_eip.pip.id}"
}
resurs "aws_security_group" "imkan verir" {
  name = "allow_ssh"
  description = "Hər yerdən ssh-a icazə verin"

  girmək {
    from_port = 0
    to_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resurs "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}"
}

Fərq şokdur, elə deyilmi? Digər mənbələrə şəxsiyyətləri ilə istinad etmək nə qədər asan olduğuna diqqət yetirin. Qısa bir nəzər ilə nə baş verdiyini izah edə və infrastrukturda əsas dəyişikliklər edə bilərsiniz. Hansı ki, bizi başqa məqama aparır

Dəyirmi # 2 CF: 0 TF: 1

Doğrulama kodu

CF yalnız sintaksis yoxlanmasına imkan verir. Beləliklə, ən yaxşı halda burada və orada bir mötərizəni əldən verdiyinizi söyləyəcəkdir. CloudFormation şablonunu tətbiq etməyə başlamazdan əvvəl istifadə etdiyiniz hər dəyişənin həll oluna biləcəyini bilmirsiniz, amma ən böyük çatışmazlığı nəyin baş verəcəyini bilmirsiniz.
Digər tərəfdən Terraform, yalnız sintaksis yoxlanılmadan .tf fayllarını doğrulayır və bütün asılılar düzgün həll edərsə və bu sizə bir plan verirsə! Bəli, Terraform ilə kodunuzu tətbiq etməzdən əvvəl nəyin yaradıldığını / dəyişdirildiyini / məhv edildiyini görməli olacaqsınız!

Bir icra planı hazırlanmış və aşağıda göstərilmişdir.
Resurs hərəkətləri aşağıdakı simvollarla göstərilir:
  + yaratmaq
Terraform aşağıdakı hərəkətləri edəcək:
+ azurerm_resource_group.test_tf101
      id: 
      yer: "ukwest"
      adı: "test_tf101"
      etiketlər.%: 
+ azurerm_subnet.sub1
      id: 
      ünvan_refiksi: "172.16.0.8/29"
      ip_configurations. #: 
      adı: "alt-1"
      şəbəkə_səhiyyə_qrupu_id: 
      resource_group_name: "test_tf101"
      marşrut_table_id: 
      virtual_network_name: "test_vnet"
Plan: 2 əlavə etmək, 0 dəyişdirmək, 0 məhv etmək.
-------------------------------------------------- ------------------

Dəyirmi # 3 CF: 0 TF: 1

Uzaq vəziyyət

Terraform, uzaq mənbələrdən, məsələn, fərqli vəziyyətdə idarə olunan digər mühitlərdən məlumatları asanlıqla idxal etməyə imkan verir. Bu, resursların və məsuliyyətlərin asanlıqla ayrılmasına imkan verir. Sadəcə xarici məlumat mənbəyini elan edin və onun məruz qaldığı hər şeyi istifadə edin.
CloudFormation, Cross-Stack Referans anlayışına sahibdir, lakin sənədləşmədən keçmək də bir ağrıdır və VPC peering qurmaq üçün AWS-də nümunə Terraform-da 17 ilə müqayisədə 71 satır.

Dəyirmi # 4 CF: 0 TF: 1

Funksiyaları

Aşağıdakı parçanı yoxlayın.

"aws_instance" "veb" resursu {
  # Hər bir host adı üçün bir nümunə yaradın
  count = "$ {uzunluğu (var.hostnames)}"

  # Hər misala uyğun şablonu_faylını ötür
  user_data = "$ {data.template.web_init. *. göstərildi [count.index]}"
}

Bəli. Terraform, kodunuzda məntiq qoymağınıza imkan verən bir neçə funksiyaya malikdir, beləliklə daha az kodu ilə daha yaxşı qura bilərsiniz və ya eyni koddan istifadə edərək fərqli quruluşlara sahib ola bilərsiniz, lakin ehtiyaclarına görə fərqli dəyişənlərlə.

Dəyirmi # 5 CF: 0 TF: 1

Modullar

Həmişə birlikdə istifadə etdiyiniz müəyyən mənbələri qruplaşdıra və modullar hazırlaya bilərsiniz, bu da müəyyən növ qaynaqları elan etməyi asanlaşdırır. Bir VM elan etmənin yalnız 4 sətir şifrəsi olması üçün onu kompaktlaşdıra bilərsiniz! Əlavə olaraq, sadəcə bir nömrəni dəyişdirməklə dəyişə bilən "saymaq" istifadə edərək istədiyiniz qədər ola bilər.

dəyişən "saymaq" {
  default = 2
}

"aws_instance" "veb" resursu {
  # ...

  count = "$ {var.count}"

  # Nümunəni 1-dən başlayan sayğacla, yəni. veb-001
  etiketlər {
    Ad = "$ {format (" veb-% 03d ", count.index + 1)}"
  }
}

Dəyirmi # 6 CF: 0 TF: 1

Komanda işi

Terraform-un HCL digər hər hansı bir proqramlaşdırma dili kimi, Git dostu olduqda, tələbləri gözəl dəyişiklikləri vurğulayan bir tərzə sahibdir, buna görə də araşdırma və kod parçası ilə işləmək rahatdır. Nəticədə məlumat quruluşu olan JSON ilə də eyni işi görməyə çalışın. Difslərin yarısı yalnız qazan plitəsinin səs-küyü, sonra da bəziləri.

Dəyirmi # 7 CF: 0 TF: 1

Təchizatçılar

Terraform'un əhəmiyyətli dərəcədə qiymətləndirilməmiş gücü, eyni bir vasitə ilə infrastrukturunuzun hər tərəfini idarə etmək qabiliyyətidir. AWS-dən başlayaraq Azure-dən Gitlab, Sürətli, Şef, Docker-ə qədər istifadə edə biləcəyiniz 70+ provayderinizin siyahısı var. Və hamısı eyni HCL istifadə edərək bir dəfə öyrənməlisiniz. Qəribə!

Dəyirmi # 8 CF: 0 TF: 1

Xülasə

8 turdan sonra belədir

CloudFormation: 0 vs Terraform: 8.

Əlavə bir nöqtə əlavə etdikdən sonra, CloudFormation-a AWS təkliflərinin son nəticəsinə yaxın olmaq üçün hətta ikisini götürün, CF 2 TF 8, yəni Terraform tamamilə rəqibini əzdi!
Tamam eyni şeyin Terraform vs Azure ARM şablonlarına aid olduğuna əminəm, buna görə də birində iki müqayisə var. İndi səmərəlilik dediyim budur.

İmtina
Bu yazı qısa yollarla və ehtimal edilən səhvlər və səhv anlayışlarla doludur, qeyd edildiyi zaman xoşbəxtlikdən düzəldəcəyəm. Müzakirə açmaq istərdim, bəlkə burada və ya orada gizlənmiş bir yem var. Terraform FTW.