實現 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
想開始學塔羅卻不知道要準備哪些工具?這篇整理塔羅新手必備好物清單,從塔羅牌、塔羅布到收納袋與香氛噴霧一次入手。趁蝦皮雙11優惠打造專屬占卜空間,還能加入蝦皮分潤計畫,用分享創造收入。
Thumbnail
想開始學塔羅卻不知道要準備哪些工具?這篇整理塔羅新手必備好物清單,從塔羅牌、塔羅布到收納袋與香氛噴霧一次入手。趁蝦皮雙11優惠打造專屬占卜空間,還能加入蝦皮分潤計畫,用分享創造收入。
Thumbnail
今天不只要分享蝦皮分潤計畫,也想分享最近到貨的魔法少年賈修扭蛋開箱,還有我的雙11購物清單,漫畫、文具、Switch2、後背包......雙11優惠真的超多,如果有什麼一直想買卻遲遲還沒下手的東西,最適合趁這個購物季趕緊下單!
Thumbnail
今天不只要分享蝦皮分潤計畫,也想分享最近到貨的魔法少年賈修扭蛋開箱,還有我的雙11購物清單,漫畫、文具、Switch2、後背包......雙11優惠真的超多,如果有什麼一直想買卻遲遲還沒下手的東西,最適合趁這個購物季趕緊下單!
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