Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik untuk struktur dasar kode dan organisasi
Struktur dan organisasi basis kode yang tepat sangat penting karena penggunaan Terraform tumbuh di seluruh tim dan perusahaan besar. Basis kode yang dirancang dengan baik memungkinkan kolaborasi dalam skala besar sekaligus meningkatkan pemeliharaan.
Bagian ini memberikan rekomendasi tentang modularitas Terraform, konvensi penamaan, dokumentasi, dan standar pengkodean yang mendukung kualitas dan konsistensi.
Panduan termasuk memecah konfigurasi menjadi modul yang dapat digunakan kembali berdasarkan lingkungan dan komponen, menetapkan konvensi penamaan dengan menggunakan awalan dan sufiks, mendokumentasikan modul dan menjelaskan input dan output dengan jelas, dan menerapkan aturan pemformatan yang konsisten dengan menggunakan pemeriksaan gaya otomatis.
Praktik terbaik tambahan mencakup pengorganisasian modul dan sumber daya secara logis dalam hierarki terstruktur, membuat katalog modul publik dan pribadi dalam dokumentasi, dan mengabstraksi detail implementasi yang tidak perlu dalam modul untuk menyederhanakan penggunaan.
Dengan menerapkan pedoman struktur dasar kode seputar modularitas, dokumentasi, standar, dan organisasi logis, Anda dapat mendukung kolaborasi luas di seluruh tim sambil menjaga Terraform tetap dapat dipertahankan saat penggunaan menyebar di seluruh organisasi. Dengan menegakkan konvensi dan standar, Anda dapat menghindari kompleksitas basis kode yang terfragmentasi.
Praktik terbaik:
Menerapkan struktur repositori standar
Kami menyarankan Anda menerapkan tata letak repositori berikut. Standarisasi praktik konsistensi ini di seluruh modul meningkatkan kemampuan ditemukan, transparansi, organisasi, dan keandalan sambil memungkinkan penggunaan kembali di banyak konfigurasi Terraform.
-
Modul atau direktori root: Ini harus menjadi titik masuk utama untuk root
Terraform dan modul yang dapat digunakan kembali dan diharapkan unik. Jika Anda memiliki arsitektur yang lebih kompleks, Anda dapat menggunakan modul bersarang untuk membuat abstraksi ringan. Ini membantu Anda menggambarkan infrastruktur dalam hal arsitekturnya, bukan secara langsung, dalam hal objek fisik. -
README: Modul root dan modul bersarang apa pun harus memiliki file README. File ini harus diberi nama
README.md
. Ini harus berisi deskripsi modul dan untuk apa modul itu harus digunakan. Jika Anda ingin menyertakan contoh menggunakan modul ini dengan sumber daya lain, letakkan diexamples
direktori. Pertimbangkan untuk menyertakan diagram yang menggambarkan sumber daya infrastruktur yang mungkin dibuat modul dan hubungannya. Gunakan terraform-docsuntuk menghasilkan input atau output modul secara otomatis. -
main.tf: Ini adalah titik masuk utama. Untuk modul sederhana, semua sumber daya dapat dibuat dalam file ini. Untuk modul yang kompleks, pembuatan sumber daya mungkin tersebar di beberapa file, tetapi panggilan modul bersarang apa pun harus ada di
main.tf
file. -
variables.tf dan outputs.tf: File-file ini berisi deklarasi untuk variabel dan output. Semua variabel dan output harus memiliki deskripsi satu kalimat atau dua kalimat yang menjelaskan tujuannya. Deskripsi ini digunakan untuk dokumentasi. Untuk informasi selengkapnya, lihat HashiCorp dokumentasi untuk konfigurasi variabel
dan konfigurasi keluaran . -
Semua variabel harus memiliki tipe yang ditentukan.
-
Deklarasi variabel juga dapat menyertakan argumen default. Jika deklarasi menyertakan argumen default, variabel dianggap opsional, dan nilai default digunakan jika Anda tidak menetapkan nilai saat Anda memanggil modul atau menjalankan Terraform. Argumen default membutuhkan nilai literal dan tidak dapat mereferensikan objek lain dalam konfigurasi. Untuk membuat variabel diperlukan, hilangkan default dalam deklarasi variabel dan pertimbangkan apakah pengaturan masuk
nullable = false
akal. -
Untuk variabel yang memiliki nilai yang tidak bergantung pada lingkungan (seperti
disk_size
), berikan nilai default. -
Untuk variabel yang memiliki nilai khusus lingkungan (seperti
project_id
), jangan berikan nilai default. Dalam hal ini, modul panggilan harus memberikan nilai yang berarti. -
Gunakan default kosong untuk variabel seperti string kosong atau daftar hanya ketika membiarkan variabel kosong adalah preferensi valid yang tidak ditolak oleh API yang mendasarinya.
-
Bersikaplah bijaksana dalam penggunaan variabel. Parameterisasi nilai hanya jika mereka harus bervariasi untuk setiap instance atau lingkungan. Ketika Anda memutuskan apakah akan mengekspos variabel, pastikan bahwa Anda memiliki kasus penggunaan konkret untuk mengubah variabel itu. Jika hanya ada kemungkinan kecil bahwa variabel mungkin diperlukan, jangan mengeksposnya.
-
Menambahkan variabel dengan nilai default kompatibel ke belakang.
-
Menghapus variabel tidak kompatibel ke belakang.
-
Dalam kasus di mana literal digunakan kembali di banyak tempat, Anda harus menggunakan nilai lokal tanpa mengeksposnya sebagai variabel.
-
-
Jangan melewatkan output secara langsung melalui variabel input, karena hal itu mencegahnya ditambahkan dengan benar ke grafik ketergantungan. Untuk memastikan bahwa dependensi implisit
dibuat, pastikan bahwa output referensi atribut dari sumber daya. Alih-alih mereferensikan variabel input untuk sebuah instance secara langsung, berikan atribut.
-
-
locals.tf: File ini berisi nilai-nilai lokal yang menetapkan nama ke ekspresi, sehingga nama dapat digunakan beberapa kali dalam modul alih-alih mengulangi ekspresi. Nilai lokal seperti variabel lokal sementara fungsi. Ekspresi dalam nilai lokal tidak terbatas pada konstanta literal; mereka juga dapat mereferensikan nilai lain dalam modul, termasuk variabel, atribut sumber daya, atau nilai lokal lainnya, untuk menggabungkannya.
-
providers.tf: File ini berisi blok terraform
dan blok penyedia. provider
blok harus dideklarasikan hanya dalam modul root oleh konsumen modul.Jika Anda menggunakan HCP Terraform, tambahkan juga blok cloud kosong.
cloud
Blok harus dikonfigurasi sepenuhnya melalui variabel lingkungandan kredenal variabel lingkungan sebagai bagian dari pipa CI/CD. -
versions.tf: File ini berisi blok required_providers.
Semua modul Terraform harus mendeklarasikan penyedia mana yang diperlukan sehingga Terraform dapat menginstal dan menggunakan penyedia ini. -
data.tf: Untuk konfigurasi sederhana, letakkan sumber data di sebelah sumber
daya yang mereferensikannya. Misalnya, jika Anda mengambil gambar yang akan digunakan dalam meluncurkan instance, letakkan di samping instance alih-alih mengumpulkan sumber daya data dalam file mereka sendiri. Jika jumlah sumber data menjadi terlalu besar, pertimbangkan untuk memindahkannya ke data.tf
file khusus. -
.tfvars file: Untuk modul root, Anda dapat menyediakan variabel non-sensitif dengan menggunakan file.
.tfvars
Untuk konsistensi, beri nama file variabelterraform.tfvars
. Tempatkan nilai umum di root repositori, dan nilai khusus lingkungan di dalam folder.envs/
-
Modul bersarang: Modul bersarang harus ada di bawah subdirektori.
modules/
Setiap modul bersarang yang memiliki aREADME.md
dianggap dapat digunakan oleh pengguna eksternal. JikaREADME.md
tidak ada, modul dipertimbangkan untuk penggunaan internal saja. Modul bersarang harus digunakan untuk membagi perilaku kompleks menjadi beberapa modul kecil yang dapat dipilih dan dipilih oleh pengguna dengan hati-hati.Jika modul root menyertakan panggilan ke modul bersarang, panggilan ini harus menggunakan jalur relatif seperti
./modules/sample-module
sehingga Terraform akan menganggapnya sebagai bagian dari repositori atau paket yang sama alih-alih mengunduhnya lagi secara terpisah.Jika repositori atau paket berisi beberapa modul bersarang, mereka idealnya dapat dikomposisi oleh pemanggil alih-alih langsung memanggil satu sama lain dan membuat pohon modul yang sangat bersarang.
-
Contoh: Contoh penggunaan modul yang dapat digunakan kembali harus ada di bawah
examples/
subdirektori di root repositori. Untuk setiap contoh, Anda dapat menambahkan README untuk menjelaskan tujuan dan penggunaan contoh. Contoh untuk submodul juga harus ditempatkan diexamples/
direktori root.Karena contoh sering disalin ke repositori lain untuk penyesuaian, blok modul harus mengatur sumbernya ke alamat yang akan digunakan pemanggil eksternal, bukan ke jalur relatif.
-
File bernama layanan: Pengguna sering ingin memisahkan sumber daya Terraform berdasarkan layanan dalam beberapa file. Praktik ini harus berkecil hati sebanyak mungkin, dan sumber daya harus didefinisikan sebagai gantinya.
main.tf
Namun, jika kumpulan sumber daya (misalnya, peran dan kebijakan IAM) melebihi 150 baris, masuk akal untuk memecahnya menjadi file-nya sendiri, sepertiiam.tf
. Jika tidak, semua kode sumber daya harus didefinisikan dalam filemain.tf
. -
Skrip khusus: Gunakan skrip hanya jika diperlukan. Terraform tidak memperhitungkan, atau mengelola, status sumber daya yang dibuat melalui skrip. Gunakan skrip khusus hanya jika sumber daya Terraform tidak mendukung perilaku yang diinginkan. Tempatkan skrip khusus yang dipanggil oleh Terraform di direktori.
scripts/
-
Skrip pembantu: Atur skrip pembantu yang tidak dipanggil oleh Terraform di direktori.
helpers/
Dokumen skrip pembantu dalamREADME.md
file dengan penjelasan dan contoh pemanggilan. Jika skrip pembantu menerima argumen, berikan pemeriksaan argumen dan--help
output. -
File statis: File statis yang direferensikan Terraform tetapi tidak dijalankan (seperti skrip startup yang dimuat ke instance EC2) harus diatur ke dalam direktori.
files/
Tempatkan dokumen panjang dalam file eksternal, terpisah dari HCL mereka. Referensikan mereka dengan fungsi file (). -
Template: Untuk file yang dibaca fungsi Templatefile
Terraform, gunakan ekstensi file. .tftpl
Template harus ditempatkan ditemplates/
direktori.
Struktur modul root
Terraform selalu berjalan dalam konteks modul root tunggal. Konfigurasi Terraform lengkap terdiri dari modul root dan pohon modul anak (yang mencakup modul yang dipanggil oleh modul root, modul apa pun yang disebut oleh modul tersebut, dan sebagainya).
Contoh dasar tata letak modul root Terraform:
. ├── data.tf ├── envs │ ├── dev │ │ └── terraform.tfvars │ ├── prod │ │ └── terraform.tfvars │ └── test │ └── terraform.tfvars ├── locals.tf ├── main.tf ├── outputs.tf ├── providers.tf ├── README.md ├── terraform.tfvars ├── variables.tf └── versions.tf
Struktur modul yang dapat digunakan kembali
Modul yang dapat digunakan kembali mengikuti konsep yang sama dengan modul root. Untuk mendefinisikan modul, buat direktori baru untuk itu dan tempatkan .tf
file di dalamnya, sama seperti Anda akan mendefinisikan modul root. Terraform dapat memuat modul baik dari jalur relatif lokal atau dari repositori jarak jauh. Jika Anda mengharapkan modul digunakan kembali oleh banyak konfigurasi, letakkan di repositori kontrol versinya sendiri. Sangat penting untuk menjaga pohon modul relatif datar untuk membuatnya lebih mudah untuk menggunakan kembali modul dalam kombinasi yang berbeda.
Contoh dasar tata letak modul Terraform yang dapat digunakan kembali:
. ├── data.tf ├── examples │ ├── multi-az-new-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ ├── versions.tf │ │ └── vpc.tf │ └── single-az-existing-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ └── versions.tf ├── iam.tf ├── locals.tf ├── main.tf ├── outputs.tf ├── README.md ├── variables.tf └── versions.tf
Struktur untuk modularitas
Pada prinsipnya, Anda dapat menggabungkan sumber daya apa pun dan konstruksi lain ke dalam modul, tetapi terlalu sering menggunakan modul bersarang dan dapat digunakan kembali dapat membuat konfigurasi Terraform Anda secara keseluruhan lebih sulit untuk dipahami dan dipelihara, jadi gunakan modul ini dalam jumlah sedang.
Jika masuk akal, pisahkan konfigurasi Anda menjadi modul yang dapat digunakan kembali yang meningkatkan tingkat abstraksi dengan menjelaskan konsep baru dalam arsitektur Anda yang dibangun dari tipe sumber daya.
Saat Anda memodulasi infrastruktur Anda menjadi definisi yang dapat digunakan kembali, arahkan kumpulan sumber daya yang logis alih-alih komponen individual atau koleksi yang terlalu kompleks.
Jangan membungkus sumber daya tunggal
Anda tidak boleh membuat modul yang merupakan pembungkus tipis di sekitar jenis sumber daya tunggal lainnya. Jika Anda kesulitan menemukan nama untuk modul Anda yang berbeda dari nama tipe sumber daya utama di dalamnya, modul Anda mungkin tidak membuat abstraksi baru―itu menambahkan kompleksitas yang tidak perlu. Sebagai gantinya, gunakan jenis sumber daya secara langsung di modul panggilan.
Merangkum hubungan logis
Kumpulan kumpulan sumber daya terkait seperti fondasi jaringan, tingkatan data, kontrol keamanan, dan aplikasi. Modul yang dapat digunakan kembali harus merangkum bagian infrastruktur yang bekerja sama untuk memungkinkan suatu kemampuan.
Jaga agar warisan tetap rata
Saat Anda membuat modul sarang di subdirektori, hindari kedalaman lebih dari satu atau dua level. Struktur pewarisan yang sangat bersarang memperumit konfigurasi dan pemecahan masalah. Modul harus dibangun di atas modul lain―bukan membangun terowongan melaluinya.
Dengan memfokuskan modul pada pengelompokan sumber daya logis yang mewakili pola arsitektur, tim dapat dengan cepat mengkonfigurasi fondasi infrastruktur yang andal. Seimbangkan abstraksi tanpa rekayasa berlebihan atau penyederhanaan berlebihan.
Sumber referensi dalam output
Untuk setiap sumber daya yang didefinisikan dalam modul yang dapat digunakan kembali, sertakan setidaknya satu output yang mereferensikan sumber daya. Variabel dan output memungkinkan Anda menyimpulkan dependensi antara modul dan sumber daya. Tanpa output apa pun, pengguna tidak dapat memesan modul Anda dengan benar sehubungan dengan konfigurasi Terraform mereka.
Modul terstruktur dengan baik yang memberikan konsistensi lingkungan, pengelompokan berdasarkan tujuan, dan referensi sumber daya yang diekspor memungkinkan kolaborasi Terraform di seluruh organisasi dalam skala besar. Tim dapat merakit infrastruktur dari blok bangunan yang dapat digunakan kembali.
Jangan mengkonfigurasi penyedia
Meskipun modul bersama mewarisi penyedia dari modul panggilan, modul tidak boleh mengonfigurasi pengaturan penyedia sendiri. Hindari menentukan blok konfigurasi penyedia dalam modul. Konfigurasi ini seharusnya hanya dideklarasikan sekali secara global.
Deklarasikan penyedia yang diperlukan
Meskipun konfigurasi penyedia dibagi antar modul, modul bersama juga harus mendeklarasikan persyaratan penyedia mereka sendiri.
Dengan mendeklarasikan persyaratan versi dan menghindari konfigurasi penyedia hardcode, modul menyediakan portabilitas dan penggunaan kembali di seluruh konfigurasi Terraform menggunakan penyedia bersama.
Untuk modul bersama, tentukan versi penyedia minimum yang diperlukan di blok required_providersversions.tf
Untuk menyatakan bahwa modul memerlukan versi AWS penyedia tertentu, gunakan required_providers
blok di dalam blok: terraform
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0.0" } } }
Jika modul bersama hanya mendukung versi AWS penyedia tertentu, gunakan operator kendala pesimis (~>
), yang hanya mengizinkan komponen versi paling kanan untuk bertambah:
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
Dalam contoh ini, ~> 4.0
memungkinkan instalasi 4.57.1
dan 4.67.0
tetapi tidak5.0.0
. Untuk informasi selengkapnya, lihat Version Constraint Syntax dalam dokumentasi
Ikuti konvensi penamaan
Nama yang jelas dan deskriptif menyederhanakan pemahaman Anda tentang hubungan antara sumber daya dalam modul dan tujuan nilai konfigurasi. Konsistensi dengan pedoman gaya meningkatkan keterbacaan bagi pengguna modul dan pengelola.
Ikuti panduan untuk penamaan sumber daya
-
Gunakan snake_case (di mana istilah huruf kecil dipisahkan oleh garis bawah) untuk semua nama sumber daya agar sesuai dengan standar gaya Terraform. Praktik ini memastikan konsistensi dengan konvensi penamaan untuk tipe sumber daya, tipe sumber data, dan nilai standar lainnya. Konvensi ini tidak berlaku untuk argumen nama
. -
Untuk menyederhanakan referensi ke sumber daya yang merupakan satu-satunya dari jenisnya (misalnya, penyeimbang beban tunggal untuk seluruh modul), beri nama sumber daya
main
atauthis
untuk kejelasan. -
Gunakan nama bermakna yang menggambarkan tujuan dan konteks sumber daya, dan yang membantu membedakan antara sumber daya yang serupa (misalnya,
primary
untuk database utama danread_replica
untuk replika baca database). -
Gunakan nama tunggal, bukan jamak.
-
Jangan ulangi jenis sumber daya dalam nama sumber daya.
Ikuti panduan untuk penamaan variabel
-
Tambahkan unit ke nama input, variabel lokal, dan output yang mewakili nilai numerik seperti ukuran disk atau ukuran RAM (misalnya,
ram_size_gb
untuk ukuran RAM dalam gigabyte). Praktek ini membuat unit input yang diharapkan jelas untuk pengelola konfigurasi. -
Gunakan unit biner seperti MiB dan GiB untuk ukuran penyimpanan, dan unit desimal seperti MB atau GB untuk metrik lainnya.
-
Berikan variabel Boolean nama-nama positif seperti
enable_external_access
.
Gunakan sumber daya lampiran
Beberapa sumber daya memiliki sumber daya semu yang disematkan sebagai atribut di dalamnya. Jika memungkinkan, Anda harus menghindari penggunaan atribut sumber daya yang disematkan ini dan menggunakan sumber daya unik untuk melampirkan sumber daya semu tersebut. Hubungan sumber daya ini dapat menyebabkan cause-and-effect masalah yang unik untuk setiap sumber daya.
Menggunakan atribut tertanam (hindari pola ini):
resource "aws_security_group" "allow_tls" { ... ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } }
Menggunakan sumber daya lampiran (lebih disukai):
resource "aws_security_group" "allow_tls" { ... } resource "aws_security_group_rule" "example" { type = "ingress" description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] security_group_id = aws_security_group.allow_tls.id }
Gunakan tag default
Tetapkan tag ke semua sumber daya yang dapat menerima tag. AWS Penyedia Terraform memiliki sumber data aws_default_tags
Pertimbangkan untuk menambahkan tag yang diperlukan ke semua sumber daya yang dibuat oleh modul Terraform. Berikut daftar kemungkinan tag untuk dilampirkan:
-
Nama: Nama sumber daya yang dapat dibaca manusia
-
AppId: ID untuk aplikasi yang menggunakan sumber daya
-
AppRole: Fungsi teknis sumber daya; misalnya, “server web” atau “database”
-
AppPurpose: Tujuan bisnis sumber daya; misalnya, “frontend ui” atau “prosesor pembayaran”
-
Lingkungan: Lingkungan perangkat lunak, seperti dev, test, atau prod
-
Proyek: Proyek yang menggunakan sumber daya
-
CostCenter: Siapa yang harus ditagih untuk penggunaan sumber daya
Memenuhi persyaratan registri Terraform
Repositori modul harus memenuhi semua persyaratan berikut sehingga dapat dipublikasikan ke registri Terraform.
Anda harus selalu mengikuti persyaratan ini bahkan jika Anda tidak berencana untuk mempublikasikan modul ke registri dalam jangka pendek. Dengan demikian, Anda dapat mempublikasikan modul ke registri nanti tanpa harus mengubah konfigurasi dan struktur repositori.
-
Nama repositori: Untuk repositori modul, gunakan nama tiga bagian
terraform-aws-<NAME>
, yang<NAME>
mencerminkan jenis infrastruktur yang dikelola modul.<NAME>
Segmen ini dapat berisi tanda hubung tambahan (misalnya,terraform-aws-iam-terraform-roles
). -
Struktur modul standar: Modul harus mematuhi struktur repositori standar. Ini memungkinkan registri untuk memeriksa modul Anda dan menghasilkan dokumentasi, melacak penggunaan sumber daya, dan banyak lagi.
-
Setelah Anda membuat repositori Git, salin file modul ke root repositori. Kami menyarankan Anda menempatkan setiap modul yang dimaksudkan untuk dapat digunakan kembali di root repositorinya sendiri, tetapi Anda juga dapat mereferensikan modul dari subdirektori.
-
Jika Anda menggunakan HCP Terraform, publikasikan modul yang dimaksudkan untuk dibagikan ke registri organisasi Anda. Registri menangani unduhan dan mengontrol akses dengan token API HCP Terraform, sehingga konsumen tidak memerlukan akses ke repositori sumber modul bahkan ketika mereka menjalankan Terraform dari baris perintah.
-
-
Lokasi dan izin: Repositori harus berada di salah satu penyedia sistem kontrol versi (VCS)
yang dikonfigurasi, dan akun pengguna HCP Terraform VCS harus memiliki akses administrator ke repositori. Registri memerlukan akses administrator untuk membuat webhook untuk mengimpor versi modul baru. -
tag x.y.z untuk rilis: Setidaknya satu tag rilis harus ada bagi Anda untuk menerbitkan modul. Registri menggunakan tag rilis untuk mengidentifikasi versi modul. Nama tag rilis harus menggunakan versi semantik, yang
dapat Anda awalan secara opsional dengan v
(misalnya, dan).v1.1.0
1.1.0
Registri mengabaikan tag yang tidak terlihat seperti nomor versi. Untuk informasi selengkapnya tentang modul penerbitan, lihat dokumentasi Terraform.
Untuk informasi selengkapnya, lihat Mempersiapkan Repositori Modul dalam dokumentasi
Gunakan sumber modul yang direkomendasikan
Terraform menggunakan source
argumen dalam blok modul untuk menemukan dan mengunduh kode sumber untuk modul anak.
Kami menyarankan Anda menggunakan jalur lokal untuk modul terkait erat yang memiliki tujuan utama untuk memfaktorkan elemen kode berulang, dan menggunakan registri modul Terraform asli atau penyedia VCS untuk modul yang dimaksudkan untuk dibagikan oleh beberapa konfigurasi.
Contoh berikut menggambarkan jenis sumber
Registri
Registri Terraform:
module "lambda" { source = "github.com/terraform-aws-modules/terraform-aws-lambda.git?ref=e78cdf1f82944897ca6e30d6489f43cf24539374" #--> v4.18.0 ... }
Dengan menyematkan hash komit, Anda dapat menghindari penyimpangan dari pendaftar publik yang rentan terhadap serangan rantai pasokan.
Terraform HCP:
module "eks_karpenter" { source = "app.terraform.io/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
Perusahaan Terraform:
module "eks_karpenter" { source = "terraform.mydomain.com/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
Penyedia VCS
Penyedia VCS mendukung ref
argumen untuk memilih revisi tertentu, seperti yang ditunjukkan pada contoh berikut.
GitHub (HTTPS):
module "eks_karpenter" { source = "github.com/my-org/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Repositori Git Generik (HTTPS):
module "eks_karpenter" { source = "git::https://example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Repositori Git Generik (SSH):
Awas
Anda perlu mengonfigurasi kredensil untuk mengakses repositori pribadi.
module "eks_karpenter" { source = "git::ssh://username@example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Ikuti standar pengkodean
Terapkan aturan dan gaya pemformatan Terraform yang konsisten di semua file konfigurasi. Menegakkan standar dengan menggunakan pemeriksaan gaya otomatis di pipa CI/CD. Saat Anda menyematkan praktik terbaik pengkodean ke dalam alur kerja tim, konfigurasi tetap dapat dibaca, dipelihara, dan kolaboratif karena penggunaan menyebar luas di seluruh organisasi.
Ikuti pedoman gaya
-
Format semua file Terraform (
.tf
file) dengan perintah terraform fmtagar sesuai dengan standar gaya. HashiCorp -
Gunakan perintah terraform validate
untuk memverifikasi sintaks dan struktur konfigurasi Anda. -
Analisis kualitas kode secara statis dengan menggunakan TFLint
. Linter ini memeriksa praktik terbaik Terraform lebih dari sekadar memformat dan gagal membangun saat menemukan kesalahan.
Konfigurasikan kait pra-komit
Konfigurasikan kait pra-komit sisi klien yang menjalankanterraform fmt
,, tflint
checkov
, dan pemindaian kode lainnya serta pemeriksaan gaya sebelum Anda mengizinkan komit. Praktik ini membantu Anda memvalidasi kesesuaian standar sebelumnya dalam alur kerja pengembang.
Gunakan kerangka kerja pra-komit seperti pra-komit
Memindahkan gaya dan pemeriksaan kualitas ke kait pra-komit lokal memberikan umpan balik cepat kepada pengembang sebelum perubahan diperkenalkan. Standar menjadi bagian dari alur kerja pengkodean.