實現 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
留言分享你的想法!
avatar-img
Alan的開發者天地
19會員
83內容數
golang
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
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 解決方式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News