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

更新 發佈閱讀 11 分鐘
vocus|新世代的創作平台

👨‍💻 簡介

之前透過 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

vocus|新世代的創作平台
vocus|新世代的創作平台

接下來開始撰寫 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 頁面上查看是否建立成功。

vocus|新世代的創作平台

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

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

vocus|新世代的創作平台

狀態檔如下

vocus|新世代的創作平台

接著修改 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"
}
}
vocus|新世代的創作平台

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
學習如何使用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
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
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
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News