實現 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
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 這篇文章將會說明如何快速在 Google Cloud Platform 上使用 Terraform 建立外部與內部的全球 IP 。 前提條件 Google Cloud Platform (GCP) 帳號: 確保有一個有效的 GCP 帳號。 安裝Terraform: 還沒安裝可
👨‍💻 簡介 這篇文章將會說明如何快速在 Google Cloud Platform 上使用 Terraform 建立外部和內部的區域 IP 。
👨‍💻簡介 這篇文章將會說明如何快速在 Google Cloud Platform 上使用 Terraform 建立外部與內部的全球 IP 。 前提條件 Google Cloud Platform (GCP) 帳號: 確保有一個有效的 GCP 帳號。 安裝Terraform: 還沒安裝可
👨‍💻 簡介 這篇文章將會說明如何快速在 Google Cloud Platform 上使用 Terraform 建立外部和內部的區域 IP 。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
起源 人生中每個人都渴望能夠活得有意義,產生價值。這不僅是對自己的期許,也是對生活的追求。然而,要實現這一目標並不總是容易的。要讓自己產生價值,需要我們經過深思熟慮,探索自己的本質和生命意義。就像大文豪居里夫所言,「為了自己的夢想而活著」,明確的目標和意義是實現價值的第一步。接下來,讓我們深入探討
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
什麼是黑馬思維? 簡單定義什麼是黑馬,黑馬一詞指的是原本不被看好的一件事情或是一個人,最後竟然成功的從逆境中成功。
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
起源 人生中每個人都渴望能夠活得有意義,產生價值。這不僅是對自己的期許,也是對生活的追求。然而,要實現這一目標並不總是容易的。要讓自己產生價值,需要我們經過深思熟慮,探索自己的本質和生命意義。就像大文豪居里夫所言,「為了自己的夢想而活著」,明確的目標和意義是實現價值的第一步。接下來,讓我們深入探討
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
什麼是黑馬思維? 簡單定義什麼是黑馬,黑馬一詞指的是原本不被看好的一件事情或是一個人,最後竟然成功的從逆境中成功。
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我