Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Sumber: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraform
Contoh ini mengandung kode sebagai ilustrasi dari struktur konfigurasi Terraform untuk infrastruktur berukuran kecil dimana tidak ada dependensi eksternal di dalamnya.
Sangat cocok untuk permulaan dan direstruktur seiring waktu
Sangat cocok untuk modul sumber daya kecil
Bagus untuk modul infrastruktur kecil dan linier (Contoh terraform-aws-atlantis)
Bagus untuk sumber daya ukuran kecil (lebih sedikit jumlahnya dari 20-30)
Berkas keadaan tunggal untuk semua sumber daya dapat memperlambat proses bekerja dengan Terraform bila jumlah dari sumber daya terus meningkat (Pertimbangkan untuk menggunakan argumen-target
untuk membatasi jumlah sumber daya)
Sumber: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/medium-terraform
Contoh di atas berisi kode sebagai ilustrasi struktur konfigurasi Terraform untuk infrastruktur dengan ukuran medium yang menggunakan hal berikut:
2 buah akun AWS
2 lingkungan yang berbeda (prod
dan stage
yang tidak berbagi apa pun). Setiap lingkungan hidup di dalam akun AWS yang berbeda.
Setiap lingkungan menggunakan versi yang berbeda dari modul infrastruktur siap pakai (alb
) yang berasal dari Terraform Registry
Setiap lingkungan menggunakan versi yang sama dari modul internal modules/network
yang bersumber dari direktori lokal.
Sangat cocok untuk proyek dengan infrastruktur yang terpisah secara logis (Akun AWS yang berbeda)
Cocok ketika tidak ada kebutuhan untuk mengubah sumber daya bersama antar akun AWS (satu lingkungan = satu akun AWS = satu berkas keadaan)
Bagus ketika tidak ada kebutuhan mengorkestrasi perubahan antar lingkungan
Bagus ketika sumber daya infrastruktur sengaja dibedakan untuk setiap lingkungan dan tidak bisa digeneralisasi (Contoh beberapa sumber daya tidak ada di satu lingkungan atau beberapa wilayah)
Seiring berkembangnya proyek, akan menjadi lebih sulit untuk menjaga supaya lingkungan-lingkungan tersebut mutakhir. Pertimbangkan untuk menggunakan modul infrastruktur (siap pakai atau internal) untuk pekerjaan yang berulang.
Dokumentasi ofisial Terraform menjabarkan seluruh aspek konfigurasi secara detail. Bacalah secara seksama untuk memahami sisa dari bagian ini.
Bagian ini menjabarkan konsep-konsep dasar yang digunakan pada buku ini.
Contoh dari sumber daya pada Terraform adalah aws_vpc
, aws_db_instance
, dan lain sebagainya. Sumber daya merupakan bagian dari penyedia (provider), menerima argumen-argumen, mengeluarkan atribut-atribut, dan memiliki siklus hidup. Sumber daya dapat diciptakan, diambil, diperbarui, dan dihapus.
Modul sumber daya adalah sekumpulan sumber daya yang terhubung secara bersamaan untuk mencapai tujuan tertentu. Contohnya adalah modul Terraform AWS VPC. Modul ini menciptakan VPC, subnet, dan pintu gerbang NAT (NAT gateway). Modul sumber daya bergantung pada konfigurasi penyedia yang bisa didefinisikan pada module itu sendiri atau pada struktur lain yang lebih tinggi levelnya.
Modul infrastruktur adalah sekumpulan modul sumber daya yang mungkin saja tidak terhubung secara logis, tetapi memiliki fungsi yang sama pada situasi/proyek/susunan saat ini. Modul infrastruktur mendefinisikan konfigurasi penyedia-penyedia yang akan dialirkan ke modul-modul sumber daya dan sumber daya yang ada di hilir. Modul infrastruktur umumnya bekerja secara terbatas pada satu entitas yang terpisah secara logis. Contohnya wilayah AWS, atau proyek Google.
Kita ambil modul terraform-aws-atlantis sebagai contoh. Modul ini menggunakan modul-modul sumber daya lain seperti terraform-aws-vpc dan terraform-aws-security-group untuk mengelola infrastruktur yang dibutuhkan dalam menjalankan Atlantis pada AWS Fargate.
Contoh lainnya adalah modul terraform-aws-cloudquery. Pada modul ini terdapat berbagai modul lain berasal dari terraform-aws-modules yang digunakan secara bersamaan untuk mengelola infrastruktur. Selain itu module ini juga menggunakan sumber daya Docker untuk membangun, mendorong, dan mengelar gambar-gambar (image) Docker. Semuanya ada di dalam satu paket.
Komposisi adalah sekumpulan modul infrastruktur yang mencakup berbagai area yang terpisah secara logis (Contoh wilayah AWS, beberapa akun AWS). Komposisi digunakan untuk menjabarkan secara penuh infrastruktur yang dibutuhkan oleh seluruh organisasi atau proyek.
Komposisi terdiri dari modul-modul infrastruktur yang di dalamnya berisi modul-modul sumber daya yang pada hakikatnya berisi sumber daya - sumber daya individu.
Sumber data hanya melakukan operasi baca (read-only) dan bergantung pada konfigurasi penyedia. Sumber data digunakan oleh modul sumber daya dan modul infrastruktur.
Sumber data terraform_remote_state
bertindak sebagai perekat untuk modul-modul dan komposisi-komposisi tingkat tinggi.
Sumber data eksternal memungkinkan program lain untuk bertindak sebagai sumber data, mengekspos data arbitrer untuk digunakan di tempat lain di dalam konfigurasi Terraform. Kita ambil contoh modul terraform-aws-lambda. Pada modul ini nama berkas dikomputasi dengan cara memanggil naskah Python eksternal.
Sumber data http mengirimkan permintaan HTTP GET ke target URL dan mengekspor informasi seputar respons dari permintaan tersebut. Sumber data ini berguna untuk mendapatkan informasi dari titik akhir ketika tidak tersedianya penyedia asli Terraform untuk berkomunikasi dengan titik akhir tersebut.
Modul-modul infrastruktur dan komposisi-komposi sebaiknya menyimpan keadaan Terraform di lokasi jarak jauh dimana keadaan tersebut bisa diambil oleh pihak lain secara terkontrol (Misal dengan adanya ACL, pembuatan versi, dan pembuatan catatan).
Penyedia, pengada, dan beberapa istilah lainnya dijabarkan dengan baik pada dokumentasi resmi dan tidak ada gunanya dijabarkan ulang di sini. Menurut pendapat penulis, mereka tidak begitu berguna dalam kaitannya untuk menulis modul Terraform yang baik.
Ketika sumber daya - sumber daya individu diandaikan seperti atom di infrastruktur, maka modul sumber daya adalah molekul. Modul adalah unit terkecil yang dapat diversikan dan dibagikan. Modul memiliki daftar argumen yang tepat dan mengimplementasi logik dasar untuk unit tersebut sehingga dapat menjalankan fungsinya. Contohnya adalah modul terraform-aws-security-group. Modul ini menciptakan sumber daya aws_security_group
dan aws_security_group_rule
berdasarkan masukan yang diberikan. Modul sumber daya ini sendiri bisa digunakan bersamaan dengan modul-modul lain untuk menciptakan modul infrastruktur.
Akses terhadap data lintas molekul (modul sumber daya dan infrastruktur) dilakukan menggunakan keluaran modul dan sumber data.
Akses antar komposisi seringkali dilakukan menggunakan sumber data jarak jauh. Ada beberapa cara untuk membagikan data antara konfigurasi.
Berikut contoh penjabaran konsep di atas dalam hubungan semu:
Contoh-contoh berikut menggunakan penyedia AWS tetapi sebagian besar prinsip yang digunakan pada contoh-contoh di bawah dapat diaplikasikan ke penyedia komputasi awan dan juga penyedia lainnya seperti DNS, Basis data, Pemantauan sistem, dan lain-lain.
Tipe | Deskripsi | Tingkat Kesiapan |
---|---|---|
Tipe | Deskripsi | Tingkat Kesiapan |
---|---|---|
Beberapa sumber daya, tanpa dependensi eksternal. Satu akun AWS. Satu wilayah. Lingkungan tunggal.
Ya
Beberapa lingkungan dan akun AWS, modul-modul infrastruktur siap pakai. Menggunakan Terraform.
Ya
Banyak akun AWS, banyak wilayah, kebutuhan yang mendesak untuk mengurangi salin tempel, modul infrastruktur pesanan, penggunaan komposisi kelas berat. Menggunakan Terraform.
Sedang dalam pengerjaan
Sangat besar
Beberapa penyedia (AWS, GCP, Azure). Penggelaran di banyak komputasi awan. Menggunakan Terraform.
Tidak
sedang
Beberapa akun AWS dan lingkungan, modul infrastruktur siap pakai, pola komposisi menggunakan Terragrunt.
Tidak
besar
Banyak akun AWS, banyak wilayah, kebutuhan mendesak untuk mengurangi salin tempel, penggunaan komposisi kelas berat. Menggunakan Terragrunt.
Tidak
sangat besar
Beberapa penyedia (AWS, GCP, Azure). Penggelaran di banyak komputasi awan. Menggunakan Terragrunt.
Tidak
Seharusnya tidak ada alasan untuk menolak mengikuti kaidah berikut :)
Sadarilah bahwa sumber daya awan seringkali memiliki keterbatasan tersendiri dalam pemberian nama. Sebagai contoh beberapa sumber daya tidak bisa menggunakan tanda hubung, atau harus menggunakan aturan penulisan huruf unta (camel case). Kaidah yang dimaksud dalam buku ini dimaksudkan untuk nama sumber daya Terraform itu sendiri.
Gunakan _
(garis bawah) daripada -
(tanda hubung) dimana saja (nama sumber daya, nama sumber data, nama variabel, keluaran, dan lain-lain)
Pilihlah penggunaan huruf kecil dan angka (walaupun ada dukungan UTF-8)
Hindari mengulang jenis sumber daya pada nama sumber daya (baik itu sebagian atau sepenuhnya):
resource "aws_route_table" "public" {}
resource "aws_route_table" "public_route_table" {}
resource "aws_route_table" "public_aws_route_table" {}
Sumber daya sebaiknya dinamakan this
jika tidak tersedia nama lain yang lebih deskriptif dan umum, atau jika modul sumber daya menciptakan sumber daya tunggal dari tipe tersebut. Sebagai contoh pada modul AWS VPC terdapat sebuah sumber daya dengan tipe aws_nat_gateway
dan beberapa sumber daya dengan tipe aws_route_table
. Maka dari itu sumber daya aws_nat_gateway
sebaiknya dinamakan this
dan aws_route_table
diberi nama yang lebih deskriptif seperti privat
, publik
, database
.
Selalu gunakan kata benda tunggal sebagai nama.
Gunakan -
pada nilai argumen dan ditempat-tempat lain dimana nilai akan dipaparkan ke orang lain (Contoh di dalam nama DNS sebuah RDS).
Letakan argumen count
/ for_each
pada baris pertama di dalam blok sumber daya atau sumber data dan tambahkan baris baru untuk memisahkan dengan argumen lainnya.
Letakan argumen tags
(jika sumber daya mendukung hal tersebut) sebagai argumen terakhir, diikuti oleh depends_on
dan lifecycle
jika diperlukan. Semua argumen tersebut sebaiknya dipisahkan oleh satu baris kosong.
Ketika menggunakan argumen count
/ for_each
sebagai pernyataan bersyarat, pilihlah nilai boolean dibandingkan length
atau ekspresi lainnya
count
/ for_each