CloudFormation vs Terraform

Terraform lebih unggul daripada CloudFormation di setiap skenario kecuali ketika Anda benar-benar harus menggunakan fitur edge bleeding dari AWS. Inilah sebabnya.

Kurva belajar:

Saya pikir kebanyakan orang mempelajari teknologi baru, dengan mengikuti tutorial atau melihat contoh. Ini cukup mudah dilakukan dengan sebagian besar bahasa pemrograman, setidaknya untuk level entri.
Tidak dengan CloudFormation. Ini JSON (atau YAML) diformat. Ini dirancang untuk dikonsumsi dan diproduksi oleh komputer - bukan manusia. Coba sendiri, di bawah ini adalah cuplikan kode contoh yang diperlukan untuk memutar instance EC2 (pada dasarnya sebuah VM):

{
  "AWSTemplateFormatVersion": "2010-09-09",
....
150 baris bla bla bla ...
....
  },

  "Sumberdaya": {
    "EC2Instance": {
      "Ketik": "AWS :: EC2 :: Instance",
      "Properti": {
        "UserData": {"Fn :: Base64": {"Fn :: Bergabung": ["", ["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": {
      "Ketik": "AWS :: EC2 :: SecurityGroup",
      "Properti": {
        "GroupDescription": "Aktifkan akses SSH",
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "Alamat IP" : {
      "Ketik": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Ketik": "AWS :: EC2 :: EIPAssociation",
      "Properti": {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "Keluaran": {
    "InstanceId": {
      "Deskripsi": "InstanceId dari instance EC2 yang baru dibuat",
      "Nilai": {"Ref": "EC2Instance"}
    },
    "InstanceIPAddress": {
      "Deskripsi": "Alamat IP instance EC2 yang baru dibuat",
      "Nilai": {"Ref": "IPAddress"}
    }
  }
}

Menjijikan. 210 baris kode untuk mendapatkan VM dengan IP publik yang dilindungi oleh Grup Keamanan. 210. 210! Dengan setiap templat ada sejumlah besar kode boilerplate, itu pada dasarnya berisik (lebih lanjut tentang ini nanti).
Jika itu tidak cukup untuk menunda Anda pada tahap ini, lihatlah dokumentasi resmi. Sekarang telah bergeser ke arah menggunakan YAML, tetapi ketika Anda ingin melihat cuplikan sampel, ternyata semuanya ada di JSON. Hal yang sama berlaku untuk hasil google.
BTW. ketika Anda memiliki cuplikan sampel yang berbeda per wilayah, Anda dapat mengatakan sesuatu yang mencurigakan

Babak # 1: CF: 0 TF: 1

Menulis kode

Argumen yang hampir sama seperti di atas berlaku untuk menulis kode itu sendiri. Untuk contoh singkat, lihat sumber daya yang persis sama seperti di atas, tetapi dijelaskan dalam Terraform:

sumber daya "aws_instance" "web" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  tag {
    Nama = "Manis"
  }
}
data "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

sumber daya "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  alokasi_id = "$ {data.aws_eip.pip.id}"
}
sumber daya "aws_security_group" "allow_all" {
  name = "allow_ssh"
  description = "Izinkan ssh dari mana saja"

  masuk {
    from_port = 0
    to_port = 22
    protokol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
sumber daya "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}"
}

Perbedaan itu mengejutkan, bukan? Perhatikan betapa mudahnya merujuk sumber daya lain dengan ID mereka. Dengan sekilas Anda dapat mengetahui apa yang terjadi dan membuat perubahan mendasar pada infrastruktur. Yang dengan baik membawa kita ke titik lain

Putaran # 2 CF: 0 TF: 1

Memvalidasi kode

CF hanya memungkinkan untuk pemeriksaan sintaks. Jadi yang terbaik itu akan memberi tahu Anda bahwa Anda melewatkan braket di sana-sini. Sebelum Anda mencoba menerapkan template CloudFormation Anda tidak akan tahu jika setiap variabel yang Anda gunakan dapat diselesaikan tetapi apa kelemahan terbesar adalah Anda tidak tahu apa yang akan terjadi.
Sebaliknya, bentuk terformat, memvalidasi file .tf, memeriksa tidak hanya sintaks tetapi juga jika semua dependecine menyelesaikan dengan benar, dan itu memberi Anda rencana! Ya, dengan Terraform Anda benar-benar bisa melihat apa yang akan dibuat / diubah / dihancurkan sebelum Anda menerapkan kode Anda!

Rencana eksekusi telah dibuat dan ditunjukkan di bawah ini.
Tindakan sumber daya ditunjukkan dengan simbol berikut:
  + buat
Terraform akan melakukan tindakan berikut:
+ azurerm_resource_group.test_tf101
      id: 
      lokasi: "ukwest"
      nama: "test_tf101"
      tag.%: 
+ azurerm_subnet.sub1
      id: 
      address_prefix: "172.16.0.8/29"
      konfigurasi ip_. #: 
      nama: "sub-1"
      network_security_group_id: 
      resource_group_name: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
Paket: 2 untuk ditambahkan, 0 untuk diubah, 0 untuk dihancurkan.
-------------------------------------------------- ------------------

Putaran # 3 CF: 0 TF: 1

Keadaan terpencil

Terraform memungkinkan Anda mengimpor data dengan mudah dari sumber jarak jauh, misalnya lingkungan lain yang dikontrol dalam kondisi berbeda. Ini memungkinkan Anda untuk pemisahan sumber daya dan tanggung jawab dengan mudah. Cukup nyatakan sumber informasi eksternal dan gunakan apa pun yang diungkapkan olehnya.
CloudFormation memiliki gagasan tentang Referensi Cross-Stack, tetapi bahkan melewati dokumentasi itu menyebalkan, dan contoh pada AWS untuk mengatur peeling VPC adalah 71 baris, dibandingkan dengan 17 di Terraform.

Putaran # 4 CF: 0 TF: 1

Fungsi

Periksa cuplikan di bawah ini.

sumber daya "aws_instance" "web" {
  # Buat satu contoh untuk setiap nama host
  count = "$ {length (var.hostnames)}"

  # Lewati setiap contoh template_file yang sesuai
  user_data = "$ {data.template.web_init. *. diberikan [count.index]}"
}

Iya. Terraform memiliki beberapa fungsi bawaan yang memungkinkan Anda untuk memasukkan logika ke dalam kode Anda, sehingga Anda dapat membangun lebih baik dengan lebih sedikit kode, atau memiliki struktur berbeda yang dibangun menggunakan kode yang sama, tetapi dengan variabel yang berbeda sesuai dengan kebutuhan.

Putaran # 5 CF: 0 TF: 1

Modul

Anda dapat mengelompokkan sumber daya tertentu yang selalu Anda gunakan bersamaan dan membuat modul, membuatnya lebih mudah untuk mendeklarasikan jenis sumber daya tertentu. Anda bisa memadatkannya sehingga menyatakan VM hanya 4 baris kode! Terlebih lagi, menggunakan "jumlah" variabel yang dapat Anda miliki sebanyak yang Anda inginkan, hanya dengan mengubah angka.

variabel "hitung" {
  default = 2
}

sumber daya "aws_instance" "web" {
  # ...

  count = "$ {var.count}"

  # Tandai instance dengan penghitung mulai dari 1, yaitu. web-001
  tag {
    Name = "$ {format (" web-% 03d ", count.index + 1)}"
  }
}

Putaran # 6 CF: 0 TF: 1

Kerja tim

Karena HCL Terraform seperti bahasa pemrograman lainnya, Git ramah dengan cara yang menarik permintaan dengan baik menyoroti perubahan, sehingga nyaman untuk melakukan ulasan dan berkolaborasi pada sepotong kode. Coba lakukan hal yang sama dengan JSON yang pada akhirnya adalah struktur data. Setengah dari diffs hanyalah kebisingan boilerplate, dan kemudian beberapa.

Putaran # 7 CF: 0 TF: 1

Penyedia

Kekuatan Terraform yang sangat diremehkan adalah kemampuan untuk mengendalikan setiap aspek infrastruktur Anda dengan alat yang sama. Anda memiliki daftar lebih dari 70 penyedia yang dapat Anda gunakan, mulai dari AWS, melalui Azure, hingga Gitlab, Fastly, Chef, Docker, apa saja. Dan semuanya menggunakan HCL yang sama yang harus Anda pelajari sekali. Luar biasa!

Putaran # 8 CF: 0 TF: 1

Ringkasan

Setelah 8 putaran, itu

CloudFormation: 0 vs Terraform: 8.

Bahkan setelah menambahkan poin tambahan, lihat dua poin di CloudFormation karena lebih dekat dengan hasil akhir penawaran AWS adalah CF 2 TF 8, yang berarti Terraform benar-benar menghancurkan lawannya!
Saya cukup yakin hal yang sama berlaku untuk template Azure ARM vs Terraform, jadi ini dia, dua perbandingan dalam satu. Sekarang itulah yang saya sebut efisiensi.

Penolakan
Posting ini penuh dengan pintasan dan kemungkinan juga kesalahan dan kesalahpahaman, yang dengan senang hati akan saya perbaiki ketika ditunjukkan. Saya ingin memulai diskusi, jadi mungkin ada umpan yang disembunyikan di sini atau di sana. Terraform FTW.