實現 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

17會員
83內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
起源 人生中每個人都渴望能夠活得有意義,產生價值。這不僅是對自己的期許,也是對生活的追求。然而,要實現這一目標並不總是容易的。要讓自己產生價值,需要我們經過深思熟慮,探索自己的本質和生命意義。就像大文豪居里夫所言,「為了自己的夢想而活著」,明確的目標和意義是實現價值的第一步。接下來,讓我們深入探討
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
什麼是黑馬思維? 簡單定義什麼是黑馬,黑馬一詞指的是原本不被看好的一件事情或是一個人,最後竟然成功的從逆境中成功。
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
起源 人生中每個人都渴望能夠活得有意義,產生價值。這不僅是對自己的期許,也是對生活的追求。然而,要實現這一目標並不總是容易的。要讓自己產生價值,需要我們經過深思熟慮,探索自己的本質和生命意義。就像大文豪居里夫所言,「為了自己的夢想而活著」,明確的目標和意義是實現價值的第一步。接下來,讓我們深入探討
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
什麼是黑馬思維? 簡單定義什麼是黑馬,黑馬一詞指的是原本不被看好的一件事情或是一個人,最後竟然成功的從逆境中成功。
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我