arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 15

Bahasa Indonesia (Indonesian)

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Struktur Kode

Pertanyaan-pertanyaan mengenai struktur kode Terraform sejauh ini merupakan hal yang paling sering ditemukan di dalam komunitas. Semua orang akan berpikir mengenai struktur kode terbaik untuk proyek mereka pada satu titik.

hashtag
Bagaimana sebaiknya menstrukturkan konfigurasi Terraform?

Banyak jawaban yang tersedia untuk pertanyaan di atas dan sangat sulit untuk memberikan saran yang bersifat universal. Maka dari itu mari kita mulai dengan pemahaman terhadap apa yang sedang kita hadapi.

  • Bagaimana tingkat kompleksitas dari proyek Anda?

    • Jumlah dari sumber daya yang terhubung

    • Jumlah dari penyedia Terraform (Lihat catatan di bawah mengenai penyedia-penyedia logis)

circle-info

Penyedia-penyedia logis bekerja secara keseluruhan di dalam logik Terraform dan seringkali tidak berinteraksi dengan layanan-layanan lainnya. Maka dari itu kita bisa beranggapan nilai kompleksitasnya adalah O(1). Penyedia-penyedia logis yang umum adalah , , , , .

hashtag
Memulai penstrukturan konfigurasi Terraform

Meletakan seluruh kode di dalam berkas main.tf merupakan ide yang baik ketika Anda baru memulai atau ketika menulis contoh kode. Pada kasus-kasus lainnya, Anda sebaiknya memisahkan konfigurasi secara logis ke dalam beberapa berkas sebagai berikut:

  • main.tf - berisi modul-modul, locals, dan sumber data-sumber data untuk menciptakan seluruh sumber daya.

  • variables.tf - berisi deklarasi variabel-variabel yang digunakan pada main.tf

terraform.tfvars sebaiknya tidak digunakan kecuali pada

hashtag
Bagaimana cara pikir tentang struktur konfigurasi Terraform?

circle-info

Pastikan Anda paham konsep-konsep dasar - , , dan , karena konsep-konsep tersebut digunakan pada contoh-contoh berikut.

hashtag
Rekomendasi umum struktur kode

  • Lebih mudah dan lebih cepat bekerja dengan jumlah sumber daya yang lebih sedikit

    • terraform plan dan terraform apply keduanya memanggil API komputasi awan untuk memverifikasi status sumber daya

Di dalam buku ini, contoh proyek dikelompokan berdasarkan kompleksitas - dari infrastruktur yang kecil sampai sangat besar. Pemisahan ini tidak bersifat mutlak, jadi periksa juga struktur-struktur lainnya.

hashtag
Orkestrasi modul infrastruktur dan komposisi

Memiliki infrastruktur skala kecil sama artinya dengan memiliki jumlah dependensi dan sumber daya yang sedikit. Seiring berkembangnya proyek maka kebutuhan untuk mengeksekusi konfigurasi Terraform secara berantai akan semakin jelas keliatan. Selain itu, kebutuhan untuk menghubungan modul-modul infrastruktur yang berbeda dan menyampaikan nilai di dalam komposisi menjadi semakin jelas juga.

Setidaknya ada 5 group solusi orkestrasi yang berbeda yang bisa digunakan oleh pengembang:

  • Hanya Terraform. Sangat lugas, pengembang hanya perlu mengetahui Terraform untuk menyelesaikan pekerjaan.

  • Terragrunt. Alat orkestrasi murni yang bisa digunakan untuk mengorkestrasi keseluruhan infrastruktur dan juga dependensinya. Terragrunt beroperasi dengan modul infrastruktur dan komposisi secara asli. Hal ini mengurangi jumlah duplikasi kode.

  • Berkas buatan sendiri. Seringkali hal ini terjadi sebagai titik awal menuju orkestrasi dan sebelum menemukan Terragrunt.

Berdasarkan hal yang dijelaskan di atas, buku ini mengulas dua hal pertama dari solusi orkestrasi proyek yaitu hanya Terraform dan Terragrunt.

Lihat contoh struktur kode untuk atau pada bab selanjutnya.

Seberapa sering infrastruktur Anda berubah?

  • Dari sekali sebulan/seminggu/sehari

  • Sampai secara terus-menerus (setiap kali ada commit baru)

  • Inisiator perubahan kode? Apakah Anda memperbolehkan server CI memperbarui repositori ketika artifak baru dibangun?

    • Hanya para pengembang yang boleh mendorong ke dalam repositori infrastruktur

    • Semua orang bisa mengajukan perubahan terhadap segala sesuatu dengan membuka PR (termasuk tugas-tugas otomatis yang berjalan di server CI)

  • platform atau layanan penggelaran mana yang Anda gunakan?

    • AWS CodeDeploy, Kubernetes, atau OpenShift membutuhkan pendekatan yang berbeda

  • Bagaimana lingkungan dikelompokan?

    • Berdasarkan lingkungan, wilayah, proyek

  • outputs.tf - berisi keluaran-keluaran dari sumber daya - sumber daya yang diciptakan pada main.tf
  • versions.tf - berisi persyaratan versi untuk Terraform dan penyedia

  • Jika seluruh infrastruktur Anda berada di dalam satu komposisi maka hal ini akan membuat operasi Terraform memakan waktu yang lama
  • Radius ledakan menjadi lebih kecil dengan sumber daya yang lebih sedikit

    • Mengisolasi sumber daya yang tidak saling berkaitan dengan cara meletakan mereka di komposisi yang berbeda mengurangi resiko ketika terjadi kesalahan

  • Mulai proyek Anda dengan menggunakan keadaan jarak jauh karena:

    • Laptop Anda bukanlah tempat sumber kebenaran infrastruktur Anda

    • Mengelola berkas tfstate di dalam git merupakan mimpi buruk

    • Ketika nantinya lapisan-lapisan infrastruktur mulai berkembang ke berbagai arah (jumlah dependensi atau sumber daya) maka akan lebih mudah bagi Anda untuk mengontrolnya

  • Praktikan aturan penamaan dan struktur yang konsisten:

    • Seperti kode prosedural, kode Terraform sebaiknya ditulis dengan prinsip bawha kode akan dibaca oleh orang lain. Konsistensi akan membantu ketika perubahan terjadi di masa yang akan datang

    • Bukanlah hal yang mustahil untuk memindahkan sumber daya pada berkas keadaan Terraform. Tetapi hal tersebut mungkin sulit dilakukan jika Anda memiliki penamaan dan struktur yang tidak konsisten.

  • Jaga modul-modul sumber daya sesederhana mungkin

  • Jangan gunakan nilai kode keras (hard-coded) untuk nilai yang bisa diberikan sebagai variabel atau ditemukan menggunakan sumber data

  • Gunakan sumber data dan terraform_remote_state secara khusus sebagai perekat antar modul infrastruktur di dalam komposisi

  • Ansible atau alat otomatisasi umum lainnya. Umumnya digunakan ketika Terraform diadopsi setelah Ansible atau ketika Ansible UI digunakan secara aktif.

  • Crossplanearrow-up-right dan solusi lainya yang terinspirasi dari Kubernetes. Kadangkala, merupakan hal yang masuk akal untuk menggunakan ekosistem Kubernetes dan mempekerjakan fitur lingkaran rekonsiliasi untuk mencapai keadaan yang diinginkan dari konfigurasi Terraform. Tonton video Crossplane vs Terraformarrow-up-right untuk informasi lebih lanjut.

  • randomarrow-up-right
    localarrow-up-right
    terraformarrow-up-right
    nullarrow-up-right
    timearrow-up-right
    komposisi
    modul sumber daya
    modul infrastruktur
    komposisi
    Terraformarrow-up-right
    Terragruntarrow-up-right

    Konsep Dasar

    Dokumentasi ofisial Terraform menjabarkan seluruh aspek konfigurasi secara detailarrow-up-right. Bacalah secara seksama untuk memahami sisa dari bagian ini.

    Bagian ini menjabarkan konsep-konsep dasar yang digunakan pada buku ini.

    hashtag
    Sumber daya (resource)

    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.

    hashtag
    Modul sumber daya

    Modul sumber daya adalah sekumpulan sumber daya yang terhubung secara bersamaan untuk mencapai tujuan tertentu. Contohnya adalah . 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.

    hashtag
    Modul infrastruktur

    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 sebagai contoh. Modul ini menggunakan modul-modul sumber daya lain seperti dan untuk mengelola infrastruktur yang dibutuhkan dalam menjalankan pada .

    Contoh lainnya adalah modul . Pada modul ini terdapat berbagai modul lain berasal dari 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.

    hashtag
    Komposisi

    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.

    hashtag
    Sumber data (data source)

    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 memungkinkan program lain untuk bertindak sebagai sumber data, mengekspos data arbitrer untuk digunakan di tempat lain di dalam konfigurasi Terraform. Kita ambil contoh modul . Pada modul ini nama berkas dikomputasi dengan cara memanggil naskah Python eksternal.

    Sumber data 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.

    hashtag
    Keadaan jarak jauh

    Modul-modul infrastruktur dan komposisi-komposi sebaiknya menyimpan di lokasi jarak jauh dimana keadaan tersebut bisa diambil oleh pihak lain secara terkontrol (Misal dengan adanya ACL, pembuatan versi, dan pembuatan catatan).

    hashtag
    Penyedia, pengada, dan lain-lain

    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.

    hashtag
    Kok susah ya?

    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 . 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 .

    Berikut contoh penjabaran konsep di atas dalam hubungan semu:

    Terragrunt

    Terraform

    Berikut daftar artikel yang ada di bagian ini:

    Penggunaan Terraform Untuk Infrastruktur Skala Kecilchevron-rightPenggunaan Terraform Untuk Infrastruktur Skala Sedangchevron-rightPenggunaan Terraform Untuk Infrastruktur Skala Besarchevron-right
    modul Terraform AWS VPCarrow-up-right
    terraform-aws-atlantisarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-aws-security-grouparrow-up-right
    Atlantisarrow-up-right
    AWS Fargatearrow-up-right
    terraform-aws-cloudqueryarrow-up-right
    terraform-aws-modulesarrow-up-right
    eksternalarrow-up-right
    terraform-aws-lambdaarrow-up-right
    httparrow-up-right
    keadaan Terraformarrow-up-right
    terraform-aws-security-grouparrow-up-right
    beberapa cara untuk membagikan data antara konfigurasiarrow-up-right
    Komposisi infrastruktur sederhana

    Selamat Datang

    Dokumen ini adalah upaya untuk menggambarkan secara sistematis praktik terbaik penggunaan Terraform dan menyediakan rekomendasi atas permasalahan yang sering kali dialami oleh pengguna Terraform.

    Terraformarrow-up-right merupakan sebuah proyek (sebagaimana banyaknya alat-alat DevOps lainnya) yang relatif baru yang dimulai pada tahun 2014.

    Terraform adalah alat yang ampuh (mungkin alat yang paling ampuh di luar sana saat ini) dan merupakan alat yang paling banyak digunakan untuk mengelola infrastruktur sebagai kode (Infrastructure as Code/IaC). Terraform memungkin pengembang untuk melakukan banyak hal dan tidak membatasi mereka melakukannya dengan cara yang akan sulit untuk didukung atau diintegrasi dengan sistem lain.

    Beberapa informasi yang dijabarkan pada buku ini mungkin tampak tidak seperti praktik terbaik. Ini merupakan hal yang lumrah. Untuk membantu pembaca memisahkan antara praktik terbaik yang telah teruji atau cara dogmatis lainnya untuk melakukan hal yang sama, penulis sesekali menggunakan petunjuk untuk menyediakan konteks dan ikon-ikon untuk menentukan level kematangan dari setiap subbagian yang terkait dengan praktik terbaik.

    Buku ini mulai ditulis di Madrid yang cerah pada tahun 2018. Buku ini tersedia secara gratis di https://www.terraform-best-practices.com/arrow-up-right

    Beberapa tahun kemudian buku ini telah diperbarui dengan konten praktik terbaik dari Terraform versi 1.0. Pada akhirnya, buku ini akan berisi sebagian besar dari praktik terbaik dan rekomendasi yang tidak terbantahkan bagi para pengguna Terraform.

    hashtag
    Sponsor

    Please if you want to become a sponsor.

    hashtag
    Alih bahasa

    Hubungi penulis jika Anda ingin membantu menerjemahkan buku ini ke dalam bahasa lainnya.

    hashtag
    Kontribusi

    Penulis ingin selalu mendapat umpan balik dan masukan terhadap buku ini sebagai komunitas yang matang dan ide-ide baru diimplementasikan dan diverifikasi dari waktu ke waktu.

    Jika Anda tertarik pada topik tertentu, silakan atau acungkan jempol Anda pada isu yang paling ingin masuk cakupan. Jika Anda mempunyai konten dan Anda ingin berkontribusi, tulis draf dan kirimkan permintaan penarikan/pull request (Tidak perlu khawatir soal penulisan naskah yang baik pada titik ini)

    hashtag
    Penulis

    Buku ini dikelola oleh dengan bantuan dari berbagai kontributor dan pengalih bahasa.

    hashtag
    Lisensi

    Tulisan ini menggunakan lisensi Apache 2. Lihat berkas LICENSE untuk detail penuh.

    Penulis dan kontributor konten ini tidak memberikan garansi akan validitas informasi yang ada di dalam tulisan ini. Pastikan Anda mengerti bahwa informasi yang disediakan pada tulisan ini bersifat gratis, dan tidak ada perjanjian atau kontrak yang dibuat antara Anda dan orang-orang yang terkait dengan konten atau proyek ini. Penulis dan kontributor tidak bertanggung jawab terhadap pihak manapun atas kerugian, kerusakan, dan gangguan yang ditimbulkan akibat kesalahan atau kelalaian informasi yang terkandung, terkait, ataupun dihubungan pada konten ini. Baik itu kesalahan atau kelalaian yang bersumber pada kelalaian, kecelakaan, atau penyebab-penyebab lainnya.

    Hak cipta © 2018-2023 Anton Babenko.

    Referensi

    circle-info

    Ada banyak orang yang membuat konten bagus dan mengelola proyek sumber terbuka yang berkaitan dengan komunitas Terraform. Penulis berpendapat tidak ada struktur lain yang lebih baik untuk mendaftarkan tautan tanpa menyalin daftar seperti awesome-terraformarrow-up-right.

    https://twitter.com/antonbabenko/lists/terraform-expertsarrow-up-right - Daftar orang yang bekerja dengan Terraform secara aktif dan dapat memberitahu banyak hal (tentunya jika Anda bertanya kepada mereka).

    https://github.com/shuaibiyy/awesome-terraformarrow-up-right - Daftar terkurasi dari sumber daya pada Hashicorp Terraform.

    http://bit.ly/terraform-youtubearrow-up-right - "Your Weekly Dose of Terraform" Kanal YouTube milik Anton Babenko. Siaran langung dengan ulasan, wawancara, tanya jawab, memprogram langsung, dan utak-atik menggunakan Terraform.

    - Nawala mingguan Terraform. Berbagai berita di dunia Terraform (proyek, pengumuman, diskusi) oleh Anton Babenko.

    Penggunaan Terraform Untuk Infrastruktur Skala Sedang

    Sumber: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/medium-terraformarrow-up-right

    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

    • Setiap lingkungan menggunakan versi yang sama dari modul internal modules/network yang bersumber dari direktori lokal.

    circle-check
    • 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)

    circle-exclamation

    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.

    hashtag

    Penggunaan Terraform Untuk Infrastruktur Skala Besar

    Sumber: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/large-terraformarrow-up-right

    Contoh di atas berisi kode sebagai ilustrasi struktur konfigurasi Terraform untuk infrastruktur ukuran besar yang mengandung hal berikut:

    • 2 akun AWS

    • 2 wilayah

    • 2 lingkungan terpisah (prod dan stage yang tidak berbagi apa pun). Setiap lingkungan hidup di akun yang berbeda dan menjangkau sumber daya di 2 wilayah

    • Setiap lingkungan menggunakan versi yang berbeda dari modul infrastruktur siap pakai (alb) yang berasal dari

    • Setiap lingkungan menggunakan versi yang sama dari modul internal modules/network yang bersumber dari direktori lokal.

    circle-info

    Pada proyek besar seperti yang dijabarkan di atas, manfaat dari penggunaan Terragrunt menjadi sangat jelas. Lihat Contoh struktur kode pada Terragrunt .

    circle-check
    • Sangat cocok untuk proyek dengan infrastruktur yang terpisah secara logis (akun AWS berbeda)

    • Cocok ketika tidak ada kebutuhan untuk mengubah sumber daya bersama antar akun AWS (satu lingkungan = satu akun AWS = satu berkas keadaan)

    circle-exclamation

    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.

    hashtag

    Menulis Konfigurasi Terraform

    hashtag
    Gunakan locals untuk menetapkan dependensi antar sumber daya secara eksplisit

    Hal ini merupakan cara yang baik untuk memberi petunjuk kepada Terraform bahwa beberapa sumber daya seharusnya dihapus terlebih dahulu bahkan ketika tidak ada dependensi langsung di dalam konfigurasi Terraform.

    https://raw.githubusercontent.com/antonbabenko/terraform-best-practices/master/snippets/locals.tfarrow-up-right

    hashtag
    Terraform 0.12 - Argumen wajib dan pilihan

    1. Argumen wajib index_document harus diisi jika var.website bukanlah map kosong

    2. Argumen pilihan error_document bisa diabaikan

    Contoh-Contoh Struktur Kode

    hashtag
    Struktur kode Terraform

    circle-info

    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.

    Tanja Umum

    MUT (Masalah Umum Terraform)

    hashtag
    Alat-alat apa saja yang sebaiknya diketahui dan dipertimbangkan untuk digunakan?

    • - Tool orkestrasi

    composition-1 {
      infrastructure-module-1 {
        data-source-1 => d1
    
        resource-module-1 {
          data-source-2 => d2
          resource-1 (d1, d2)
          resource-2 (d2)
        }
    
        resource-module-2 {
          data-source-3 => d3
          resource-3 (d1, d3)
          resource-4 (d3)
        }
      }
    
    }
    https://weekly.tfarrow-up-right

    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)

  • Terraform Registryarrow-up-right

    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)

  • Terraform Registryarrow-up-right

    tflintarrow-up-right - Linter kode

  • tfenvarrow-up-right - Pengelola versi

  • Atlantisarrow-up-right - Otomatisasi Pull Request

  • pre-commit-terraformarrow-up-right - Kumpan kait git untuk Terraform yang digunakan bersamaan dengan kerangka kerja pre-commitarrow-up-right

  • hashtag
    Apa yang menjadi solusi untuk masalah dependency hellarrow-up-right dengan modul?

    Versi dari sumber daya dan modul infrastruktur sebaiknya menggunakan versi yang spesifik. Penyedia sebaiknya dikonfigurasi diluar modul tetapi hanya di dalam komposisi. Versi dari penyedia dan Terraform juga sebaiknya dikunci.

    Tidak ada alat pengelola dependensi utama, tetapi ada beberapa tips untuk membuat dependensi menjadi lebih sedikit bermasalah. Sebagai contoh, Dependabotarrow-up-right bisa digunakan untuk mengotomatisasi perbaruan dependensi. Dependabot membuat permintaaan penarikan untuk menjaga dependensi tetap aman dan terbaru. Dependabot mendukung konfigurasi Terraform.

    Terragruntarrow-up-right

    Lokakarya

    Berikut ini adalah lokakarya untuk orang-orang yang ingin mempraktikan hal-hal yang dijabarkan pada panduan ini.

    Konten tersedia pada - https://github.com/antonbabenko/terraform-best-practices-workshoparrow-up-right

    main.tf
    variable "website" {
      type    = map(string)
      default = {}
    }
    
    resource "aws_s3_bucket" "this" {
      # omitted...
    
      dynamic "website" {
        for_each = length(keys(var.website)) == 0 ? [] : [var.website]
    
        content {
          index_document = website.value.index_document
          error_document = lookup(website.value, "error_document", null)
        }
      }
    }
    terraform.tfvars
    website = {
      index_document = "index.html"
    }
    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

    hashtag
    Terragrunt code structures

    Tipe
    Deskripsi
    Tingkat Kesiapan

    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

    arrow-up-right

    Compliance.tfarrow-up-right — Terraform Compliance Simplified. Make your Terraform modules compliance-ready.

    —

    contact mearrow-up-right
    العربية (Arabic)chevron-right
    Bosanski (Bosnian)chevron-right
    Português (Brazilian Portuguese)chevron-right
    Englishchevron-right
    Français (French)chevron-right
    ქართული (Georgian)chevron-right
    Deutsch (German)chevron-right
    ελληνικά (Greek)chevron-right
    עברית (Hebrew)chevron-right
    हिंदी (Hindi)chevron-right
    Italiano (Italian)chevron-right
    日本語 (Japanese)chevron-right
    ಕನ್ನಡ (Kannada)chevron-right
    한국어 (Korean)chevron-right
    Polski (Polish)chevron-right
    Română (Romanian)chevron-right
    简体中文 (Simplified Chinese)chevron-right
    Español (Spanish)chevron-right
    Türkçe (Turkish)chevron-right
    Українська (Ukrainian)chevron-right
    اردو (Urdu)chevron-right
    buat isu baruarrow-up-right
    Anton Babenkoarrow-up-right

    Penataan Kode

    circle-info
    • Contoh dan modul Terraform sebaiknya disertai dengan dokumentasi yang menjelaskan fitur-fitur dan cara penggunaannya.

    • Semua tautan pada berkas README.md sebaiknya menggunakan tautan absolut sehingga tautan akan ditampilkan dengan benar pada halaman Terraform Registry.

    • Dokumentasi bisa diisi dengan diagram yang dibuat menggunakan dan cetak biru buatan .

    • Gunakan untuk memastikan kode valid, diformat dengan benar, dan terdokumentasi secara otomatis sebelum dikirim ke git dan ditinjau oleh orang lain.

    hashtag
    Dokumentasi

    hashtag
    Dokumentasi secara otomatis

    merupakan kerangka kerja untuk mengelola dan memelihara kait pre-commit multi bahasa. Pre-commit ditulis dalam bahasa Python dan merupakan alat ampuh untuk melakukan sesuatu secara otomatis pada mesin pengembang sebelum kode disimpan pada repositori git. Umumnya alat ini digunakan untuk menjalankan linter dan memformat kode (Lihat ).

    Kita bisa menggunakan pre-commit untuk memformat dan memvalidasi konfigurasi Terraform dan juga untuk memperbarui dokumentasi.

    Periksa untuk membiasakan diri Anda akan penggunaan pre-commit untuk Terraform. Beberapa repositori seperti sudah menggunakan pre-commit.

    hashtag
    terraform-docs

    merupakan alat untuk menciptakan dokumentasi modul Terraform dalam berbagai format keluaran. Kita dapat menjalankan terraform-docs secara manual (tanpa kait pre-commit) atau via untuk memperbarui dokumentasi secara otomatis.

    @todo: Dokumentasikan versi modul, rilis, dan GH actions

    hashtag
    Sumber daya

    1. Tulisan blog oleh :

    Penggunaan Terraform Untuk Infrastruktur Skala Kecil

    Sumber: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraformarrow-up-right

    Contoh ini mengandung kode sebagai ilustrasi dari struktur konfigurasi Terraform untuk infrastruktur berukuran kecil dimana tidak ada dependensi eksternal di dalamnya.

    circle-check
    • Sangat cocok untuk permulaan dan direstruktur seiring waktu

    • Sangat cocok untuk modul sumber daya kecil

    • Bagus untuk modul infrastruktur kecil dan linier (Contoh )

    • Bagus untuk sumber daya ukuran kecil (lebih sedikit jumlahnya dari 20-30)

    circle-exclamation

    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)

    mermaidarrow-up-right
    cloudcraft.coarrow-up-right
    kait-kait pre-commit Terraformarrow-up-right
    pre-commitarrow-up-right
    kait yang didukungarrow-up-right
    repository pre-commit-terraformarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-docsarrow-up-right
    kait pre-commit-terraformarrow-up-right
    halaman depan kerangka kerja pre-commitarrow-up-right
    Kumpulan kait-kait git untuk Terraform menggunakan kerangka kerja pre-commitarrow-up-right
    Dean Wilsonarrow-up-right
    pre-commit hooks and terraform - a safety net for your repositoriesarrow-up-right
    terraform-aws-atlantisarrow-up-right

    Beberapa penyedia (AWS, GCP, Azure). Penggelaran di banyak komputasi awan. Menggunakan Terraform.

    Tidak

    kecil
    sedang
    besar

    Kaidah Penamaan

    hashtag
    Kaidah umum

    circle-info

    Seharusnya tidak ada alasan untuk menolak mengikuti kaidah berikut :)

    circle-info

    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.

    1. Gunakan _ (garis bawah) daripada - (tanda hubung) dimana saja (nama sumber daya, nama sumber data, nama variabel, keluaran, dan lain-lain)

    2. Pilihlah penggunaan huruf kecil dan angka (walaupun ada dukungan UTF-8)

    hashtag
    Argumen sumber daya dan sumber data

    1. Hindari mengulang jenis sumber daya pada nama sumber daya (baik itu sebagian atau sepenuhnya):

      circle-check

      resource "aws_route_table" "public" {}

      triangle-exclamation

    hashtag
    Contoh kode resource

    hashtag
    Penggunaan count / for_each

    circle-check
    triangle-exclamation

    hashtag
    Penempatan tags

    circle-check
    triangle-exclamation

    hashtag
    Pernyataan bersyarat count

    circle-check

    hashtag
    Variabel

    1. Hindari membuat ulang secara mandiri (don't reinvent the wheel) pada modul sumber daya: gunakan name, description, dan nilai default untuk variabel seperti yang didefinisikan pada bagian "Referensi Argumen" untuk sumber daya yang Anda kerjakan.

    2. Dukungan untuk validasi variabel bersifat terbatas (Contoh tidak bisa mengakses variabel lain atau melakukan pencarian). Buat perencanaan validasi dengan baik karena fitur ini tidak bisa digunakan pada beberapa kasus tertentu.

    hashtag
    Keluaran

    Buat keluaran konsisten dan mudah dipahami diluar cakupan mereka (Tipe dan atribut dari nilai yang dikembalikan harus jelas bagi pengguna modul ketika menggunakan modul tersebut).

    1. Nama keluaran sebaiknya menjelaskan properti yang dimiliki dan tidak terlalu menggunakan bentuk bebas yang biasa kita inginkan.

    2. Struktur yang baik untuk nama keluaran berbentuk {name}_{type}_{attribute}, dimana:

      1. {name}

    hashtag
    Contoh kode output

    Kembalikan paling banyak satu ID dari security group::

    circle-check

    Ketika bekerja dengan banyak sumber daya berjenis sama, this sebaiknya diabaikan dari nama keluaran:

    triangle-exclamation

    hashtag
    Gunakan bentuk jamak jika mengembalikan nilai yang berupa daftar

    circle-check

    resource "aws_route_table" "public_route_table" {}

    triangle-exclamation

    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 VPCarrow-up-right 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

  • Gunakan bentuk jamak pada nama variabel dengan tipe list(...) atau map(...).

  • Urutkan nama atribut di dalam blok variabel seperti berikut: description, type, default, validation

  • Selalu sertakan description disemua variabel walaupun menurut Anda hal tersebut sudah jelas (Anda akan membutuhkannya dimasa yang akan datang).

  • Pilihlah tipe-tipe sederhana (number, string, list(...), map(...), any) daripada tipe yang lebih spesifik seperti object() kecuali Anda memerlukan batasan ketat pada setiap atributnya.

  • Gunakan tipe spesifik seperti map(map(string)) jika seluruh elemen dari map memiliki tipe yang sama (Contoh string) atau bisa dikonversikan menjadi tipe tersebut (Contoh tipe number bisa dikonversi menjadi string).

  • Gunakan tipe any untuk menonaktifkan validasi tipe mulai dari level tertentu atau ketika perlu mendukung berbagai tipe.

  • Nilai {} bisa bertipe map atau bisa juga bertipe object. Gunakan tomap(...) untuk konversi menjadi map karena tidak ada cara untuk mengubah menjadi object.

  • adalah nama sumber daya atau sumber data tanpa awalan penyedia. Sebagai contoh
    {name}
    untuk
    aws_subnet
    adalah
    subnet
    ,
    {name}
    untuk
    aws_vpc
    adalah
    vpc
    .
  • {type} adalah tipe dari sumber daya

  • {attribute} adalah atribut dari nilai keluaran

  • Lihat contoh

  • Jika keluaran mengembalikan nilai dengan fungsi interpolasi dan banyak sumber daya maka {name} dan {type} sebaiknya dibuat seumum mungkin (this sebagai prefiks sebaiknya diabaikan saja). Lihat contoh.

  • Jika nilai kembalian adalah sebuah daftar maka gunakan bentuk jamak sebagai nama. Lihat contoh.

  • Selalu sertakan description untuk semua keluaran walaupun hal itu dirasa sudah jelas.

  • Hindari argumen sensitive kecuali Anda mengontrol penuh penggunaan keluaran tersebut diseluruh tempat pada seluruh modul.

  • main.tf
    resource "aws_route_table" "public" {
      count = 2
    
      vpc_id = "vpc-12345678"
      # ... sisa argumen sengaja dihilangkan
    }
    
    resource "aws_route_table" "private" {
      for_each = toset(["one", "two"])
    
      vpc_id = "vpc-12345678"
      # ... sisa argumen sengaja dihilangkan
    }
    main.tf
    resource "aws_route_table" "public" {
      vpc_id = "vpc-12345678"
      count  = 2
    
      # ... sisa argumen sengaja dihilangkan
    }
    main.tf
    resource "aws_nat_gateway" "this" {
      count = 2
    
      allocation_id = "..."
      subnet_id     = "..."
    
      tags = {
        Name = "..."
      }
    
      depends_on = [aws_internet_gateway.this]
    
      lifecycle {
        create_before_destroy = true
      }
    }   
    main.tf
    resource "aws_nat_gateway" "this" {
      count = 2
    
      tags = "..."
    
      depends_on = [aws_internet_gateway.this]
    
      lifecycle {
        create_before_destroy = true
      }
    
      allocation_id = "..."
      subnet_id     = "..."
    }
    outputs.tf
    resource "aws_nat_gateway" "that" {    # Best
      count = var.create_public_subnets ? 1 : 0
    }
    
    resource "aws_nat_gateway" "this" {    # Good
      count = length(var.public_subnets) > 0 ? 1 : 0
    }
    outputs.tf
    output "security_group_id" {
      description = "The ID of the security group"
      value       = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
    }
    outputs.tf
    output "this_security_group_id" {
      description = "The ID of the security group"
      value       = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
    }
    outputs.tf
    output "rds_cluster_instance_endpoints" {
      description = "A list of all cluster instance endpoints"
      value       = aws_rds_cluster_instance.this.*.endpoint
    }