原簡體中文教程連結: Introduction.《Terraform入門教程》
資料來源允許查詢或計算一些資料以供其他地方使用。使用資料來源可以讓 Terraform 程式碼使用在 Terraform 管理範圍之外的一些信息,或是讀取其他 Terraform 程式碼保存的狀態。
每一種 Provider 都可以在定義一些資源類型的同時定義一些資料來源。
資料來源透過一種特殊的資源存取:data 資源。資料來源透過 data 塊聲明:
data "aws_ami" "example" {
most_recent = true
owners = ["self"]
tags = {
Name = "app-server"
Tested = "true"
}
}
一個 data 區塊請求 Terraform 從一個指定的資料來源 aws_ami
讀取指定資料並且把結果輸出到 Local Name 為的 example
實例中。我們可以在同一模組內的程式碼中透過資料來源名稱來引用資料來源,但無法從模組外部直接存取資料來源。
同資源類似,一個資料來源類型以及它的名稱一同構成了該資料來源的識別符,所以資料來源類型加名稱的組合在同一模組內必須是唯一的。
在 data 塊體(花括號中間的內容)是傳給資料來源的查詢條件。查詢條件參數的種類取決於資料來源的類型,在上述範例中,most_recent
、owners
和 tags
都是定義查詢 aws_ami
資料來源時所使用的查詢條件。
與資料來源這種特殊資源不同的是,我們在上一節介紹的主要資源(使用 resource 區塊定義的)是一種「託管資源」。這兩種資源都可以接收參數並對外輸出屬性,但託管資源會觸發 Terraform 對基礎設施物件進行增刪改操作,而資料來源只會觸發讀取操作。簡單來說,我們一般說的「資源」就是特別指託管資源。
每一種資料來源資源都關聯到一個外部資料來源,資料來源類型決定了它接收的查詢參數以及輸出的資料。每一種資料來源類型都屬於一個 Provider。大部分 data 區塊內的資料來源參數都是由對應的資料來源類型定義的,這些參數的賦值可以使用完整的 Terraform 表達式能力或其他 Terraform 語言的功能。
然而類似資源,Terraform 也為所有類型的資料來源定義了一些元參數。這些元參數的限制和功能我們將在後續節當中敘述。
如果資料來源的查詢參數涉及到的表達式只引用了字面量或是在執行時 terraform plan
就已知的資料(例如輸入變數),那麼資料來源會在執行 Terraform 的 "refersh" 階段時被讀取,然後 Terraform 會建置變更計劃。這保證了在製定變更計畫時 Terraform 可以使用這些資料來源的回傳資料。
如果查詢參數的表達式引用了那些只有執行部分執行變更計劃以後才能知曉的數據,例如另一個還未被創建的託管資源的輸出,那麼數據源的讀取操作會被推遲到 "apply" 階段,任何引用該資料來源輸出的表達式的值在執行到資料來源被讀取完之前都是未知的。
雖然絕大多數資料來源都對應了一個透過遠端基礎設施 API 存取的外部資料來源,但也有一些特殊的資料來源僅存在於T erraform 進程內部,計算並對外輸出一些資料。
比如說,本地資料來源有 template_file
、local_file
、aws_iam_policy_document
等。
本機資料來源的行為與其他資料來源完全一致,但他們輸出的結果資料只是暫時存在於 Terraform 執行時,每次計算一個新的變更計畫時這些值都會被重新計算。
資料來源有著與資源一樣的依賴機制,我們也可以在 data 區塊內設定 depends_on
元參數來明確聲明依賴關係,在此不再贅述。
與資源一樣,資料來源也可以透過設定 count
、for_each
元參數來建立一組多個資料來源實例,而 Terraform 也會把每個資料來源實例單獨建立並讀取對應的外部數據,對 count.index
與 each
的使用也是一樣的, 在count
與 for_each
之間選擇的原則也是一樣的。
同資源一樣,資料來源也可以透過 provider 元參數指定使用特定 Provider實 例,在此不再贅述。
同資源不一樣,資料來源目前不可以透過設定 lifecycle
區塊來客製化生命週期,但資料來源內部 lifecycle
被設定為保留關鍵字以備將來可以支援該功能。
一個資料來源定義範例如下:
# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:Component"
values = ["web"]
}
most_recent = true
}
引用資料來源資料的語法是 data.<TYPE>.<NAME>.<ATTRIBUTE>
:
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
原簡體中文教程連結: Introduction.《Terraform入門教程》