本文同步刊登於個人技術部落格,有興趣關注更多 Kubernetes、DevOps 相關資源的讀者,請務必追蹤從零開始的軟體工程師之旅,喜歡的話幫我按讚分享、歡迎留言、或是許願想要看的文章。
如果有技術問題也可透過粉絲專頁 討論,技術方面諮詢免錢、需要動手做另計 XD。
剛開始使用 terraform 的時候,大家的第一個範例應該都是 local backend 吧,就是直接在本地 terraform apply,在目前的工作目錄下產生 state 檔案。這個 state 檔案直接 cat 打開來看後,可以發現裡面一切都是明碼的。初學時筆者感覺所謂的 Terraform backend 只是一個存放中繼的 state 資料的 workspace,後來發現完全不是這麼回事,便立刻棄用了 local backend。
之後依照官方推薦就使用了 Terraform Cloud,後來便出現許多問題,等等會分析。
最後團隊選用了自家公有雲的 backend,例如
完整 terraform backend 支援清單可以見官方網站。
這篇文章要來仔細探討所謂的 terraform backend,backend 的重要性,與如選擇適合自己團隊的 backend。
如果使用 tf random 產生亂數密碼,直接去 cat state 檔案就可以看到明碼的 random 數值。
多人協作 lock
另外一個解法是,根本不使用 backend,terraform 也支援這樣的做法。雖然官方也明講 backend are completely optional,但依照筆者的經驗,強烈建議多人團隊務必去啟用,並找尋適合自己的 Backend。
預設的 backend 是 loal backend,也就是執行 terraform apply 後,本地會出現一個 JSON 格式的 state 檔案。然而 local state 會立刻遇到的問題,就是
所以筆者強烈推薦使用外部的 backend 來取代 local backend。多半 backend 會多做許多事,透過控制 state 來確保 infrastrure 的完整性,例如對 state 存取有以下的限制:
這些限制,如果使用 local backend 才會容易遇到,使用外部的 backend 其實不容易會發生。Terraform 基於 Infrastructure as Code 實現,可以將整個 terraform repo 視為 code 一部分,這樣就可以想像為何這些 state 限制是重要的。
在很特殊的狀況下,你也可以手動更改 state file,然後 push 上傳,但這點非常不建議,terraform 會自動維護 state 的完整性,手動更改可能會直接破壞正常的 state。什麼情形會用到?就是你的 state 因為某個原因被玩壞,大部分是人為弄壞的。這時候才被迫要手動更改 state。手動更改 state ,講白了不做死就不會死。
vault state pull
vim your-local-state-file
# Increment Serial if needed
vault state push
# vault state push -force
Terraform Cloud,是官方提供的解決方案,有提供較多功能,例如在 terraform cloud 的網站上遠端 plan。有提供免費版,提供最多 5 人團隊使用。也有提供進階的方案 $20/user 或是 $70/user,以及 enterprise 版本,可以本地安裝。
使用很簡單,我在前幾篇提供的範例 repository全部都是使用 terraform cloud 作為 Backend。提供
託管的 Terraform Cloud 作為 backend 他有幾個問題
如果是重視安全性的團隊,則至少要使用可以 self-hosted 的 Terraform Enterprise,而不要使用公有的 Terraform Cloud。然而 Enterprise 我是沒用過,請不要問我價錢。
Consul 嚴格來說不是單純的儲存庫,他是 Service Networking 設定與服務發現的解決方案,只是本身帶有 key value 的儲存功能,就被自家整合。換句話說,他不是專門拿來做 terraform backend 的,比較像是如果團隊本來就有使用 consul,可以考慮公用儲存庫,作為 terraform backend。
這是相同公司 Hashicorp 提供的自家的 backend,整合的很完整。但就只是單純的儲存庫,沒有 terraform cloud 的遠端執行啊,或是線上檢視 state 檔案的功能。
可以在公司內部自行架設一組 cluster,然後就可以作為 backend。
問題是
Etcd 跟 consul 類似,雖然是專業的儲存庫,但是使用這麼複雜的分散式儲存庫,只作為 terraform 的 backend,顯然很不經濟。
可以在公司內部自行架設一組 cluster,然後就可以作為 backend。
一樣只建議已經有在使用 etcd ,且熟悉維運 etcd 的團隊,才考慮使用 etcd 兼作為 terraform backend。
這些分散式的儲存庫,不太容易死,然而萬一死了可能不太好救。
AWS S3 + DynamoDB
GCP gcs + pg
Azurerm + pg
只有單純的 state storage 與 lock 的功能,沒有什麼花俏的線上執行或是快速 review。
好處是
Terraform 並不會帶來大量的資料庫負擔,所以可能會把 terraform 與附載較低的應用,共用資料庫。
使用上作為 state storage 與 lock 很單純沒什麼問題
如果 Kubernetes 還有做其他事情的話,請不要用 Kubernetes secret 作為 terraform 的 backend