Resources:
一般來說Resource名稱格式都是:
#一般來說Resource名稱格式都是:
<provider>_<resourceType>
例如:
實際取用時的Code格式大略如下:
#以aws_vpc為例:
resource "aws_vpc" "{給這個resource的名稱}" {<可能一個或多個infraStructure Object>}
aws_vpc的Resource的doc在:
右邊就有這個Resource內有哪些可以定義的物件像是cide_block(如下圖)
(並且上下查找會有範例):
並且我們知道AWS的vpc內包含了"subnet"
所以我們可以另外定義aws_subnet這個Resource
並reference給aws_vpc,初步定義如下:
尚有許多Resource內的Object在區塊內沒有定義,通常就會有default值
以上即完成一個簡單Resource建立的Terraform專案的程式tf檔撰寫
在執行前先看到當前既有的vpc有:
並確認當前現有的subnet:
接著嘗試執行剛剛完成的Terraform
打開該目錄開啟cmd:
執行以下指令以執行Terraform建立Resource:
#執行指令建立Resource:
terraform apply
實際到web介面去refresh看:
並且由於剛剛建立的subnet依存於我們建立的vpc,所以可以看到:
經由以上的操作得以確認到真的有建立Resources(vpc & subnet)出來
但是其實Terraform本身也可以Query所建立的Resources →Data Sources
Data Sources:
在Doc頁面也能看到:
並也有對應範例:
而我們要Query到剛剛建立的Resources則要用到一些條件式:
比如我只想拿到上圖default為true的vpc, i.e. AWS本身預設給的vpc的id
並且在預設vpc中再建立另一個subnet,則可以在家如下的Code
並且要注意,這個subnet的IP範圍要屬於這個default vpc
並且這個subnet的IP範圍跟既有的subnet不可以衝突
所以參照到舊的default vpc對應的既有subnet的IP範圍有:
所以可以寫成:
再次執行:
#執行指令建立Resource:
terraform apply
以上只是基於AWS的EC2的範例
但是其他provider的tf Code架構也是雷同
對應一般程式對應:
provider = import libraryresource/data = function call of libraryarguments = parameters of function
並且如果此時重複執行Terraform的執行指令,會看到:
上面結果又再一次說明了Terraform是Declare的
我Declare了end result
在執行terraform apply指令時,Terraform就要知道:
current AWS state v.s. configuration (desired) state
例如當有發現跟Code定義一樣的vpc,就知道不用在重複建立
並且這有一個很大的好處,其中一個是 — idempotent(等冪)
這邊使用idempotent這個單字表示
不管我執行terraform apply N百遍同樣的一份tf Code
我仍會得到一樣的infraStruture結果
若有更改到Code,也僅異動有變動的Resource