🐈🐈🐈
還記得我們在第八天嘗試建立了第一台 VM 時,我們是這樣寫的:
resource "google_compute_instance" "vm" {
boot_disk {
initialize_params {
image = "debian-cloud/debian-11" # 寫死的映像檔
}
}
network_interface {
network = "default" # 寫死的網路名稱
}
}
這樣寫會有幾個問題:
Data Sources 就是來解決這些問題的!
下面我會舉幾個實際運用到的例子:
與其寫死網路名稱,我們不如動態查詢:
data "google_compute_network" "default" {
name = "default"
}
resource "google_compute_instance" "vm" {
name = "demo-vm"
machine_type = "e2-micro"
zone = "asia-east1-b"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = data.google_compute_network.default.id *# 動態取得 VPC ID*
}
}
這樣的好處是即使在不同專案,只要有名為 "default" 的 VPC,這份配置就能正常運作!以 GCP 來說在每次創建一個專案時,GCP 會自動生成一個名為 default 的 VPC~
映像檔經常更新,寫死版本號很容易會過期:
data "google_compute_image" "ubuntu" {
family = "ubuntu-2004-lts"
project = "ubuntu-os-cloud"
}
resource "google_compute_instance" "vm" {
name = "demo-vm-latest"
machine_type = "e2-micro"
zone = "asia-east1-b"
boot_disk {
initialize_params {
image = data.google_compute_image.ubuntu.self_link # 自動使用最新版本
}
}
network_interface {
network = "default"
}
這樣的好處是可以永遠使用 Ubuntu 20.04 LTS 系列的最新映像檔,也不需要手動更新版本號。
如果有想知道某個地區有哪些可用區域時,不用花時間去查,可以使用 data sources,像這樣:
data "google_compute_zones" "available" {
region = "asia-east1"
}
output "available_zones" {
value = data.google_compute_zones.available.names
}
然後執行結果以後:
available_zones = [
"asia-east1-a",
"asia-east1-b",
"asia-east1-c",
]
登愣!可以直接知道有哪些可用的區域,當然也可以運用在搭配迴圈在多個區域部署資源(之後文章裡會再更深入探討)
概念 | 用途 | 資料來源 | 使用時機 |
---|---|---|---|
Variables | 從外部傳入參數,讓配置更彈性 | .tfvars 檔案、CLI、環境變數 |
在不同環境需要使用不同值時使用 |
Data Sources | 查詢雲端現有資訊,避免硬編碼 | 雲端平台 API | 需要引用現有資源或取得最新資訊時使用 |
Data Sources 在實務上特別有用,它讓 Terraform 能更靈活地適應不同情境:
今天我們更了解 Data Sources 要怎麼具體實現:
透過這些運用我們的基礎設施程式碼就能在不同環境下自動適應變化,同時保持一致性與可靠性!
🐈🐈🐈
明天我們要聊聊 Outputs,了解如何把建立或查詢到的資源資訊輸出,作為後續資源串接或跨模組整合的重要基礎!