要讓 Terraform 能有複用性,我們需要加入一些參數化變數來增加彈性,也就是為 module 的 parameter,而且在 root module 中定義好的 variable,可以根據需求來覆蓋。 Terraform Input Variables 的功能,讓我們可以宣告變數,並有幾種方式可以傳入自訂義 variable values:
- command line
.tfvars
- Environment 讀取
以下會簡單介紹這些方式和優缺點。

要讓 Terraform 能有複用性,我們需要加入一些參數化變數來增加彈性,也就是為 module 的 parameter,而且在 root module 中定義好的 variable,可以根據需求來覆蓋。 Terraform Input Variables 的功能,讓我們可以宣告變數,並有幾種方式可以傳入自訂義 variable values:
- command line
.tfvars
- Environment 讀取
以下會簡單介紹這些方式和優缺點。
templatefile 是 Terraform 的一個內置函數,可讓 Terraform 在運行時,根據變量動態生成文件內容 。 templatefile 函數的基本用法是:
- 定義一個模板文件,其中包含要插入變量的佔位符。
- 在 Terraform code 中,您可以使用 templatefile 函數來讀取模板文件,並提供要插入的變量。
最後 Terraform 會動態生成文件內容,並將其輸出。
terraform archive 是一個 HashiCorp 公司提供的一個 Provider,可以讓使用者在 Terraform 中,將指定的目錄或檔案打包(例如 zip )。
雲端上運行的無伺服器計算服務非常熱門,著名的如 AWS Lambda 、 Azure Functions、GCP Cloud Functions,也常使用 terraform 工具來進行部屬。這時再使用 terraform archive ,方便地把例如 python code 打包成 zip,簡便地部署到服務上。
在 Cloud Firestore 中,存儲單位是 document 。document 是一個 lightweight record ,可包含 data 欄位 (稱: fields),也可以嵌套另一個 collection。 因為 terraform 的 google_firestore_document,要求 fields 的 format 要是 json string ,比想像中的難寫,在這邊簡單紀錄一下範例。
隨著系統的擴充, Terraform 配置也會變得越來越複雜,這時可能會需要做一些 Refactor,例如 :
- 將某些 terraform resource 移動到其他 module
- change resource ID
這時候用 terraform plan 檢查一下,會發現 terraform 打算把原本的 resource 移除,然後重新建立一個新的 resource。但 resource 中間被刪掉,之後再造回來是會影響服務的。我們必須讓 Terraform 知道我只是重新命名,這就是 Terraform move 想做的事情。
最近很常寫 Terraform ,知道一些 terraform cli 指令可以幫助自己寫的更好,也在學習 Terraform 的過程中,把覺得值得記錄的一些注意事項 & 小技巧留在這裡。
目前使用 AWS 和 GCP terraform module 的感想,其實我覺得都還可以。但這邊特別覺得 GCP load-balancer module,我個人感覺寫得真的不好,有很多地方應該可以寫得更好,讓使用者體驗更棒的,但他們並沒做到…,也讓我思考了其實一昧 module 化是否有必要呢 ? 讓我列出來一些我簡單比較和缺點吧。
基本上 terragrunt 的使用和 terraform 都一樣,所以才說 terragrunt 是一層 wrapper。
terragrunt init terragrunt plan terragrunt apply
和 terraform 都一樣對吧 !
變數管理也是一個讓 code 更加 DRY 的方式之一, terragrunt 有蠻多傳遞變數的方式,這邊舉例 inputs
Provide 是整個 terraform 最重要的元件,是決定要對哪一個平台操作 (e.g. AWS, Azure, gcp),負責和雲端 API 的接口交互,可以在不了解 API 細節的情況下,通過 terraform 來編排資源。