Praktik terbaik untuk modul yang dapat digunakan kembali

Dokumen ini memberikan panduan dan rekomendasi untuk dipertimbangkan saat menggunakan modul Terraform yang dapat digunakan kembali.

Panduan ini bukan merupakan pengantar untuk Terraform. Untuk pengantar penggunaan Terraform dengan Google Cloud, baca Mulai menggunakan Terraform.

Mengaktifkan API yang diperlukan dalam modul

Modul Terraform dapat mengaktifkan layanan apa pun yang diperlukan menggunakan resource google_project_service atau modul project_services. Menyertakan aktivasi API akan mempermudah demonstrasi.

  • Jika disertakan dalam modul, aktivasi API harus dapat dinonaktifkan dengan mengekspos variabel enable_apis yang ditetapkan secara default ke true.
  • Jika disertakan dalam modul, aktivasi API harus menetapkan disable_services_on_destroy ke false, karena atribut ini dapat menyebabkan masalah saat bekerja dengan beberapa instance modul ini.

    Contoh:

    module "project-services" {
      source  = "terraform-google-modules/project-factory/google//modules/project_services"
      version = "~> 12.0"
    
      project_id  = var.project_id
      enable_apis = var.enable_apis
    
      activate_apis = [
        "compute.googleapis.com",
        "pubsub.googleapis.com",
      ]
      disable_services_on_destroy = false
    }
    

Menyertakan file pemilik

Untuk semua modul bersama, sertakan file OWNERS (atau CODEOWNERS di GitHub), yang mendokumentasikan penanggung jawab untuk modul ini. Sebelum permintaan pull apa pun digabungkan, pemilik harus menyetujuinya.

Merilis versi yang diberi tag

Terkadang modul memerlukan perubahan yang dapat menyebabkan gangguan dan Anda perlu menyampaikan efeknya kepada pengguna agar mereka dapat menyematkan konfigurasi mereka ke versi tertentu.

Pastikan modul bersama mengikuti SemVer v2.0.0 saat versi baru diberi tag atau dirilis.

Saat mereferensikan modul, gunakan batasan versi untuk disematkan ke versi utama. Contoh:

module "gke" {
  source  = "terraform-google-modules/kubernetes-engine/google"
  version = "~> 20.0"
}

Jangan mengonfigurasi penyedia atau backend

Modul bersama tidak boleh mengonfigurasi penyedia atau backend. Sebagai gantinya, konfigurasikan penyedia dan backend di modul root.

Untuk modul bersama, tentukan versi penyedia minimum yang diperlukan dalam blok required_providers, sebagai berikut:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = ">= 4.0.0"
    }
  }
}

Kecuali terbukti sebaliknya, asumsikan bahwa versi penyedia baru akan berfungsi.

Mengekspos label sebagai variabel

Izinkan fleksibilitas dalam pelabelan resource melalui antarmuka modul. Pertimbangkan untuk menyediakan variabel labels dengan nilai default peta kosong, seperti berikut:

variable "labels" {
  description = "A map of labels to apply to contained resources."
  default     = {}
  type        = "map"
}

Mengekspos output untuk semua resource

Variabel dan output memungkinkan Anda melakukan inferensi dependensi antara modul dan resource. Tanpa output apa pun, pengguna tidak dapat mengurutkan modul dengan benar sehubungan dengan konfigurasi Terraform mereka.

Untuk setiap resource yang ditentukan dalam modul bersama, sertakan setidaknya satu output yang mereferensikan resource tersebut.

Menggunakan submodul inline untuk logika yang kompleks

  • Modul inline dapat Anda gunakan untuk mengatur modul Terraform yang kompleks ke dalam unit-unit yang lebih kecil dan menghapus duplikat resource umum.
  • Tempatkan modul inline di modules/$modulename.
  • Perlakukan modul inline sebagai modul pribadi, bukan untuk digunakan oleh modul luar, kecuali jika dokumentasi modul bersama secara khusus menyatakan sebaliknya.
  • Terraform tidak melacak resource yang difaktorkan ulang. Jika Anda memulai dengan beberapa resource di modul level atas lalu memasukkannya ke submodul, Terraform akan mencoba membuat ulang semua resource yang telah difaktorkan ulang. Untuk mengurangi perilaku ini, gunakan blok moved saat pemfaktoran ulang.
  • Output yang ditetapkan oleh modul internal tidak otomatis ditampilkan. Untuk membagikan output dari modul internal, ekspor ulang modul tersebut.

Langkah selanjutnya