Mengelola DNS langsung dari dashboard Cloudflare memang praktis saat jumlah record masih sedikit. Masalah mulai terasa ketika record sudah banyak, dikelola oleh beberapa orang, atau perlu dijaga konsistensinya antar lingkungan. Pada titik itu, pendekatan manual biasanya mulai merepotkan: perubahan sulit dilacak, review tidak rapi, dan risiko salah ubah record menjadi lebih besar.
Di sinilah Terraform terasa berguna. Dengan Terraform, konfigurasi infrastruktur bisa diperlakukan sebagai kode. DNS record tidak lagi hanya tersimpan di panel web, tetapi juga terdokumentasi dalam file yang bisa ditinjau, diubah, dan dijalankan ulang dengan cara yang lebih terkendali.
Tantangannya adalah satu hal: bagaimana kalau semua DNS record di Cloudflare sudah telanjur ada? Menulis ulang semuanya satu per satu ke Terraform jelas bukan pekerjaan yang efisien. Solusi yang jauh lebih masuk akal adalah mengimpor konfigurasi yang sudah ada ke dalam Terraform.
Artikel ini membahas alur yang lebih rapi untuk melakukan itu: mulai dari menyiapkan token, membuat konfigurasi provider, menghasilkan file resource dengan cf-terraforming, lalu mengimpor resource tersebut ke Terraform state agar terraform plan tidak menganggap semuanya sebagai resource baru.
Sebelum masuk ke langkah teknis, ada baiknya melihat alasan kenapa pendekatan ini layak dilakukan.
Saat DNS dikelola manual lewat dashboard:
Begitu DNS masuk ke Terraform, ada beberapa keuntungan yang langsung terasa:
Untuk domain yang sudah aktif bertahun-tahun, ini sangat membantu karena DNS biasanya berkembang organik dan jarang lagi benar-benar “bersih”.
Banyak orang berhenti setelah berhasil menghasilkan file Terraform dari Cloudflare. Padahal itu baru setengah jalan.
Misalnya kamu sudah menjalankan tool untuk mengekspor semua record Cloudflare menjadi resource Terraform. File .tf memang sudah ada. Tetapi ketika menjalankan:
terraform plan
Terraform masih akan menampilkan banyak aksi create.
Ini bukan karena file hasil ekspor salah. Penyebabnya lebih sederhana: Terraform belum tahu bahwa resource yang tertulis di file itu sebenarnya sudah ada di Cloudflare. Dengan kata lain, definisinya ada, tetapi state Terraform belum mengenalnya.
Jadi, proses lengkapnya terdiri dari dua tahap:
Kalau hanya melakukan tahap pertama, plan masih akan terlihat seolah-olah semua record akan dibuat ulang.
cf-terraformingCloudflare menyediakan tool bernama cf-terraforming untuk membantu proses ini. Tool ini berguna untuk dua hal utama:
Inilah tool yang paling praktis untuk migrasi DNS Cloudflare dari pengelolaan manual ke Infrastructure as Code.
cf-terraformingUntuk pengguna macOS, instalasi paling praktis biasanya lewat Homebrew:
brew tap cloudflare/cloudflarebrew install --cask cloudflare/cloudflare/cf-terraforming
Kalau tidak memakai macOS, tool ini juga tersedia dalam bentuk binary di repository GitHub Cloudflare. Pilih saja metode instalasi yang paling sesuai dengan lingkungan kerja kamu.
Setelah instalasi selesai, pastikan tool bisa dipanggil dari terminal:
cf-terraforming --help
Kalau perintah ini berjalan, berarti tahap awal sudah beres.
Karena kita akan membaca konfigurasi DNS dari Cloudflare, kita perlu token API yang punya izin yang sesuai.
Langkah umumnya:
Untuk kebutuhan ekspor record DNS, pendekatan yang paling aman adalah memberi izin sesempit mungkin, cukup untuk zona yang memang ingin dikelola.
Kalau ingin cepat, kamu bisa mulai dari template seperti Edit zone DNS, lalu sesuaikan resource zone yang boleh diakses. Untuk tahap migrasi awal, beberapa orang memilih All Zones agar lebih praktis, tetapi untuk penggunaan jangka panjang sebaiknya izin dibatasi sesuai kebutuhan.
Satu hal penting: token ini bersifat sensitif. Jangan simpan sembarangan di file yang ikut ter-commit ke repository.
Sebelum generate atau import record, buat dulu konfigurasi dasar provider Cloudflare di Terraform.
Contoh main.tf:
terraform {required_providers {cloudflare = {source = "cloudflare/cloudflare"version = "~> 4.0"}}}provider "cloudflare" {api_token = var.cloudflare_api_token}
Konfigurasi ini cukup untuk memulai. Nanti token API-nya bisa diberikan melalui variable, environment variable, atau mekanisme secret lain yang kamu gunakan di workflow Terraform.
Kalau ingin setup lebih rapi, biasanya token tidak ditulis langsung di file .tf, tetapi disuplai dari luar supaya tidak bercampur dengan source code.
Saat menggunakan cf-terraforming, ada beberapa nilai yang perlu disiapkan:
Contoh:
export CLOUDFLARE_EMAIL="email-akun-cloudflare"export CLOUDFLARE_API_TOKEN="token-cloudflare"export CLOUDFLARE_ZONE_ID="zone-id-domain"
ZONE_ID bisa kamu ambil dari dashboard Cloudflare pada halaman domain yang sedang dikelola.
Kalau kamu mengelola banyak domain, sebaiknya lakukan proses ini per-zone. Hasilnya lebih mudah dirapikan dan lebih jelas saat dibaca ulang nanti.
Setelah environment variable siap, gunakan cf-terraforming untuk menghasilkan resource Terraform:
cf-terraforming generate \--email "$CLOUDFLARE_EMAIL" \--token "$CLOUDFLARE_API_TOKEN" \-z "$CLOUDFLARE_ZONE_ID" \--resource-type cloudflare_record > ariyolo-id.tf
Perintah ini akan membaca semua DNS record pada zone yang dipilih, lalu menulis hasilnya ke file Terraform.
Nama file output sebaiknya dibuat mengikuti nama domain, misalnya:
ariyolo-id.tfexample-com.tfinternal-example-net.tfKebiasaan kecil seperti ini akan sangat membantu kalau nanti jumlah domain yang dikelola bertambah.
Setelah file .tf terbentuk, kamu akan melihat banyak block resource seperti ini:
resource "cloudflare_record" "terraform_managed_resource_xxx" {name = "rona"type = "A"value = "16.3.19.94"ttl = 1proxied = falsezone_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
Di tahap ini, banyak orang mengira migrasi sudah selesai. Padahal belum.
File tersebut baru berisi definisi resource, belum berarti Terraform sudah mengenali resource itu sebagai bagian dari state yang sedang dikelola. Kalau langsung menjalankan terraform plan, Terraform akan cenderung menganggap resource-resource ini sebagai objek baru yang perlu dibuat.
Itulah alasan kenapa proses import ke state tetap wajib dilakukan.
terraform plan masih menampilkan + create?Ini bagian yang paling penting untuk dipahami.
Terraform bekerja dengan dua hal:
.tf),Kalau file konfigurasi ada tetapi state belum tahu bahwa resource tersebut sudah eksis di provider, maka Terraform menganggap resource itu belum ada. Akibatnya, plan akan menunjukkan aksi create.
Jadi, tujuan import bukan membuat record baru di Cloudflare. Tujuan import adalah memberi tahu Terraform bahwa record yang sudah ada di Cloudflare harus dipetakan ke resource yang ada di file konfigurasi.
Begitu mapping ini selesai, barulah terraform plan mulai menunjukkan hasil yang masuk akal.
Untungnya, cf-terraforming tidak hanya bisa generate file resource, tetapi juga bisa membuat skrip import.
Contohnya:
cf-terraforming import \--resource-type "cloudflare_record" \--email "$CLOUDFLARE_EMAIL" \--token "$CLOUDFLARE_API_TOKEN" \-z "$CLOUDFLARE_ZONE_ID" > ariyolo-id.sh
Perintah ini akan menghasilkan skrip shell yang berisi banyak perintah terraform import.
Kemudian beri izin eksekusi:
chmod +x ariyolo-id.sh
Lalu jalankan:
./ariyolo-id.sh
Saat skrip ini berjalan, Terraform akan mulai memasukkan resource Cloudflare yang sudah ada ke dalam state.
Setelah proses import selesai, jalankan:
terraform plan
Kalau semua berjalan sesuai harapan, hasil plan tidak lagi menunjukkan bahwa Terraform akan membuat ulang semua DNS record tadi.
Idealnya, hasilnya mendekati salah satu dari kondisi berikut:
Kalau masih banyak create, biasanya ada beberapa kemungkinan:
.tf yang digenerate tidak sama dengan resource yang diimport,Setelah semua record berhasil masuk ke Terraform, pekerjaan sebenarnya justru baru dimulai. Supaya migrasi ini tidak berakhir sia-sia, ada beberapa langkah lanjutan yang sebaiknya dilakukan:
Kalau perubahan tetap sering dilakukan manual di Cloudflare, maka drift antara dashboard dan Terraform akan cepat muncul lagi.
Ada beberapa kesalahan yang cukup umum saat pertama kali mencoba workflow ini.
Ini kesalahan paling umum. File .tf memang sudah terbentuk, tetapi state belum tahu apa pun. Hasil akhirnya tetap berantakan saat plan.
Kalau mengelola banyak domain, biasakan memisahkan file dan proses impor per-zone. Ini membuat debugging jauh lebih mudah.
API token Cloudflare punya akses yang sensitif. Perlakukan seperti secret lain: jangan ditaruh sembarangan di file yang ikut ter-push ke repository.
Sebaiknya jangan terlalu cepat merombak file hasil generate sebelum import selesai. Pastikan dulu resource berhasil dipetakan ke state, baru setelah itu lakukan refactor atau perapian.
Mengimpor DNS record Cloudflare ke Terraform bukan sekadar soal mengekspor konfigurasi menjadi file .tf. Inti prosesnya ada pada sinkronisasi antara konfigurasi dan state. Kalau hanya berhenti di tahap generate, Terraform masih akan mengira semua record itu baru.
Urutan yang lebih aman adalah:
cf-terraforming,terraform plan.Begitu alur ini selesai, pengelolaan DNS jadi jauh lebih rapi. Perubahan bisa direview, histori lebih jelas, dan risiko perubahan manual yang tidak terdokumentasi bisa ditekan.
Untuk domain yang sudah lama aktif, langkah migrasi seperti ini memang butuh ketelitian. Tetapi setelah sekali beres, manfaat jangka panjangnya sangat terasa.
Quick Links
Legal Stuff
