Mengelola konfigurasi DNS di Cloudflare dapat menjadi tugas yang memakan waktu, terutama jika Anda memiliki banyak rekaman yang perlu dikelola. Dalam hal ini, otomatisasi menggunakan alat seperti Terraform dapat sangat berguna. Terraform memungkinkan Anda mendefinisikan dan mengelola infrastruktur Anda sebagai kode, termasuk pengaturan DNS. Dalam artikel ini, kita akan membahas langkah-langkah untuk mengimpor DNS Record Cloudflare ke Terraform.
Install cf-terraforming
Aplikasi cf-terraforming adalah aplikasi yang dibuat Cloudflare untuk mempermudah pengguna mengimpor record Cloudflare menjadi berkas terraform. Aplikasi ini bisa tinggal pakai karena sudah di compile jadi langsung unduh saja di Github cf-terraforming.
Untuk pengguna MacOS bisa menggunakan brew untuk melakukan instalasi cf-terraforming
brew tap cloudflare/cloudflare
brew install --cask cloudflare/cloudflare/cf-terraforming
Mendapatkan API Token Cloudflare
Ketika ingin berkomunikasi dengan Cloudflare tentu kita membutuhkan API Token, berikut langkah untuk mendapatkan API Token
- Pada peramban buka https://dash.cloudflare.com/profile
- Pada menu sebelah kiri pilih API Tokens
- Klik Create Token, di sini Cloudflare telah memberikan beberapa permissions template untuk saat ini pilih Edit zone DNS. Nantinya kita juga bisa membuat permissions secara kustom.
- Selanjutnya pada kolom Zone Resources pilih mau domain mana saja yang bisa diakses oleh token ini nantinya, agar mudah pilih All Zones saja. Jika sudah klik Continue to summary.
- Akan muncul rangkuman token yang akan dibuat, klik Create Token.
- Akan muncul kode token yang digunakan untuk API, pastikan menyimpan dengan baik karena jika pindah ke tangan yang kurang baik maka dia bisa mengacak-ngacak domain kita di Cloudflare.
Konfigurasi Terraform untuk Cloudflare
Sebelum melakukan import kita harus membuat dulu konfigurasi terraform, berikut langkah-langkahnya:
Buat file dengan nama “main.tf”, lalu tambahkan konfigurasi provider untuk Cloudflare
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
Sekarang kita akan mengimpor record yang ada di Cloudflare dengan menggunakan cf-terraforming, pastikan variabelnya sesuaikan yaa.
export CLOUDFLARE_EMAIL="isi dengan alamat email akun Cloudflare"
export CLOUDFLARE_API_TOKEN="isi dengan token yang sudah didapat tadi"
export CLOUDFLARE_ZONE_ID="isi dengan zone ID Cloudflare"
cf-terraforming generate --email $CLOUDFLARE_EMAIL --token $CLOUDFLARE_API_TOKEN -z $CLOUDFLARE_ZONE_ID --resource-type cloudflare_record > ariyolo-id.tf
Jika dilihat pada baris terakhir saya melakukan ekspor record cloudflare ke file bernama ariyolo-id.tf, sekedar saran ketika ekspor alangkah baiknya nama file dibuat nama domain agar mempermudah karena bisa saja nantinya ada domain lain yang akan diimpor. Saat ini file ariyolo-id.tf akan berisi banyak record kurang lebih seperti ini
resource "cloudflare_record" "terraform_managed_resource_9826372bc12dfd739ae4c16a9b3e1994" {
name = "rona"
proxied = false
ttl = 1
type = "A"
value = "16.3.19.94"
zone_id = "1acf2345ad6789f01234e1234a02b908"
}
Sekarang kita sudah punya berkas terraform tetapi ketika melakukan Terraform Plan maka kita bisa melihat bahwa terraform akan menambahkan record baru ke Cloudflare, padahal record tersebut sudah ada. Berikut contoh ketika kita melakukan terraform plan
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# cloudflare_record.terraform_managed_resource_0019a8d746ad4980bfa9dc3603df0a59 will be created
+ resource "cloudflare_record" "terraform_managed_resource_xxxxxxxxxxxxxxxxxxxxxxxx" {
+ allow_overwrite = false
+ created_on = (known after apply)
+ hostname = (known after apply)
+ id = (known after apply)
+ metadata = (known after apply)
+ modified_on = (known after apply)
+ name = "ariyolo.id"
+ proxiable = (known after apply)
+ proxied = false
+ ttl = 1
+ type = "TXT"
+ value = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+ zone_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Cara mengatasinya adalah dengan melakukan impor ke state (bahasan tentang state akan saya buatkan nanti). Kita akan membuat skrip impor dan melakukan impor resource yang ada ke berkas state dengan menggunakan tools cf-terraforming, caranya bisa dilihat sebagai berikut:
#Membuat skrip impor
export CLOUDFLARE_EMAIL="isi dengan alamat email akun Cloudflare"
export CLOUDFLARE_API_TOKEN="isi dengan token yang sudah didapat tadi"
export CLOUDFLARE_ZONE_ID="isi dengan zone ID Cloudflare"
cf-terraforming import --resource-type "cloudflare_record" --email $CLOUDFLARE_EMAIL --token $CLOUDFLARE_API_TOKEN -z $CLOUDFLARE_ZONE_ID > ariyolo-id.sh
#Memberikan izin eksekusi skrip
chmod +x ariyolo-id.sh
#Menjalankan skrip impor
./ariyolo-id.sh
Jika berhasil maka akan muncul tampilan sedang melakukan impor resource terraform ke state, sehingga jika melakukan perintah terraform plan tidak ada lagi resource yang akan ditambahkan yang berarti bahwa kita telah berhasil mengimpor DNS Record ke Terraform.