實現 CloudFlare DNS 解析:使用 Terraform 和 GCS 進行高效配置

更新 發佈閱讀 11 分鐘
raw-image

👨‍💻 簡介

之前透過 Terraform 在 GCP 上建立外部和內部的全球 IP,延續上一篇的文,我們要把 Global IP 在 CloudFlare 上做 DNS 解析綁定,使我們一般在瀏覽網頁時能夠輸入網址進行訪問。

🛠️ 使用工具

  • Terraform
  • CloudFlare
  • GCS

📝 功能需求

  1. 研究 Terraform 建立 CloudFlare DNS 解析
  2. 取得 GCS 上的 Terraform state file 並透過 terraform 建立 CloudFlare DNS 解析
  3. 模組化

🎯Setup

1. 研究 Terraform 建立 CloudFlare DNS 解析

查看 terraform cloudflare_record 官方文件 可以看到與 dns 的相關設定會使用這個 resource。 而要操作 CloudFlare 必須取得要調整的 Website zone id 與操作者的 api token

raw-image
raw-image

接下來開始撰寫 terraform 代碼

resource "cloudflare_record" "example" {
zone_id = "your_zone_id"
name = "terraform"
type = "A"
comment = "Managed by Terraform"
value = "192.0.2.1"
proxied = false
ttl = 3600
}

terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.28.0"
}
}
}

provider "cloudflare" {
api_token = "your_api_token"

}

接著執行 terraform 指令部署上去就可以到 CloudFlare 頁面上查看是否建立成功。

raw-image

2. 取得 GCS 上的 Terraform state file 並透過 terraform 建立 CloudFlare DNS 解析

這部分需要提前設定好狀態檔

raw-image

狀態檔如下

raw-image

接著修改 terraform 代碼,在代碼的部分使用 data 去取得 GCS 上的 Global IP 狀態檔

resource "cloudflare_record" "example" {
zone_id = "your_zone_id"
name = "terraform"
type = "A"
comment = "Managed by Terraform"
# 添加這行取得IP
value = data.terraform_remote_state.global_ip.outputs.global_ip_info.address
proxied = false
ttl = 3600
}

# 來源設定
data "terraform_remote_state" "global_ip" {
backend = "gcs"
config = {
bucket = "alan-test-terraform"
prefix = "gcp/global-ip"
}
}
raw-image

3. 模組化

先建立一個資料夾叫做 modules,並依序建立以下檔案放在這個資料夾

  1. 撰寫 variables.tf
variable "cloudflare_api_token" {
type = string
}

variable "zone_id" {
type = string
}

variable "name" {
type = string
}

variable "type" {
type = string
}

variable "comment" {
type = string
}

variable "allow_overwrite" {
type = bool
}

variable "records" {
type = list(object({
value = optional(string)
proxied = optional(bool, false)
ttl = optional(number, 1)
}))
}

這裡補充說明一下 optional 函數,這個函數的主要功能是指定這些屬性是可選的,並且當未使用時,第二個欄位則是這個屬性的預設值。

  1. 建立 main.tf
resource "cloudflare_record" "dns_records" {
for_each = { for idx, rec in var.records : idx => rec }
zone_id = var.zone_id
name = var.name
type = var.type
comment = var.comment
allow_overwrite = var.allow_overwrite
value = each.value.value
ttl = each.value.ttl
proxied = each.value.proxied
}
  1. 建立 outputs.tf 

這裡的用意主要是看想輸出 resource 的哪些值,並將這個 output 的資料結構取名為 dns_records_details

output "dns_records_details" {
value = [for r in cloudflare_record.dns_records : {
address = r.value
name = r.name
type = r.type
ttl = r.ttl
proxied = r.proxied
}]
}
  1. 建立 provider.tf
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.28.0"
}
}
}

provider "cloudflare" {
api_token = var.cloudflare_api_token
}

接著在主目錄建立自己的設定檔

  1. 建立 main.tf
module "cloudflare_dns_records" {
source = "./modules"
zone_id = "your-zone-id"
cloudflare_api_token = "your-api-token"
name = "terraform"
type = "A"
comment = "Managed by Terraform"
allow_overwrite = false
records = [{
value = data.terraform_remote_state.global_ip.outputs.global_ip_info.address
proxied = false
ttl = null
}
]
}

如果有需要新增多筆 records,可以在根目錄

  1. 建立 data.tf
data "terraform_remote_state" "global_ip" {
backend = "gcs"
config = {
bucket = "alan-test-terraform"
prefix = "gcp/global-ip"
}
}

這裡因為有使用到 gcp 的 global ip,因此需要定義 data.tf

  1. 建立 outputs.tf
output "dns_records_list" {
value = module.cloudflare_dns_records.dns_records_details
}

這裡的 output 用意是將 modules 裡的 output 拿來用,因為我們執行的環境是在根目錄下執行,而 modules 裡的 output 只能在內部被定義與訪問,如果要將 modules 的 output 拿來外部使用,必須在要引用的地方定義好 output 值,這樣就能讓你在根目錄下執行 Terraform 時能夠使用 modules 的 output 值。

  1. 建立 provider.tf
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.28.0"
}
}
}

這樣就已經完成簡單的模組化了。 完整代碼在這裡

📚Reference

留言
avatar-img
Alan的開發者天地
19會員
83內容數
golang
你可能也想看
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
Thumbnail
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
本文介紹如何在GCP上使用Terraform建立CloudFlare DNS解析和模組化。通過閱讀本文,可以瞭解如何設置Terraform建立CloudFlare DNS解析以及取得GCS上的Terraform state file並透過Terraform建立CloudFlare DNS解析的步驟。
Thumbnail
本文介紹如何在GCP上使用Terraform建立CloudFlare DNS解析和模組化。通過閱讀本文,可以瞭解如何設置Terraform建立CloudFlare DNS解析以及取得GCS上的Terraform state file並透過Terraform建立CloudFlare DNS解析的步驟。
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News