IaC with Terraform 27
Terraform Best Practices
許多Terraform的BP將圍繞在Terraform state與state file
Terraform主要工作在於:
- Create Infrastucture
- Maintaining Infrastucture
With state file, Terraform keep track of resources in the real world
當我們異動了Terraform腳本程式內容,Terraform會比對
Desired State(也就是當前程式內容)跟實際Infrastructure State兩者
然後規劃出一個plan,來達成Desired State所要的變更
Terraform state檔案是一個簡單的json檔案
大概長這樣(講師畫面範例):
裡面描述了Terraform管理的資源
1st Best Practice
因為state檔案是一個簡單的json檔案,所以很容易地被人為異動
所以第一個BP就是:
只透過terraform command來異動state檔案
絕對不要手動更改state檔案!!!
2nd Best Practice
至於這個State file從何而來? 誰建立的?
當執行apply指令的時候,TF就會建立state檔案
但是在團隊中要分享"最後一版"的state檔案
所以我們要能夠分享”最後一版”的state檔案給不同團隊乃至系統
這時候就要使用到Remote Storage來統一儲存State檔案
其中常見的有:
- AWS S3 Bucket
- Terraform Cloud
- Azure Blob Storage
- Google Clodu Storage
等等
然後設定Terraform去儲存state檔案到上述的Storage去
3rd Best Practice
延續2nd,若是兩個團隊成員同時執行apply等動作
我們可能就會發生類似git衝突(Conflicts),並造成state file corruption
所以第三個BP就是給state檔案做lock機制
等某A成員完成apply動作後,才能換某B執行
而這部分可以依據Storage backend的設定支援
像是AWS S3就是透過Amazon DynamoDB來處理lock
但是要記得,不是所有Storage backend都有支援lock
所以慎選!
4th Best Practice
如果不小心遺失state檔案...
例如不小心從remote storage中遺失
或不小心手動造成錯誤
甚至上面提過的state file corruption
所以第四個BP就是要記得備份state檔案
例如前篇筆記中有看到的AWS S3有支援版控,把他啟用
Enable Versioning!
甚至可以透過不同版本,還原回去過往的InfraStructure狀態
5th Best Practice
透過上面我們做到了:
- 透過Remote state分享,讓團隊合作順利
- State locking避免團隊造成衝突
- File versioning for backup
此時我們有一份state描述了infrastructure
但通常我們會有多個環境(DEV,TEST,PROD)
所以我們應當依據不同環境有各自的state檔案分開儲存
並且不同環境的state檔案也要各自進行locking,versioning等設定
以上五個都是針對Terraform state檔案的BP
接下來三個BP會針對Terraform Code本身
- 如何管理Terraform Code?
- 如何apply InfraStructure變更?
這些會被劃分到一個新的IaC趨勢名詞 →GitOps
6th Best Practice
當我們處於團隊中去編寫TF程式,這時候就應當要把TF程式納入Git版控中
就像應用程式一樣,並帶來以下好處
- 加強團隊合作效率
- 版本控制InfraStructure(IaC)定義
可以有歷史追蹤InfraStructure定義
7th Best Practice
允許誰來變更Terraform Code?
讓任何人直接地異動Git上儲存的Code嗎?
同應用程式一樣
我們應當要有re-view機制,測試機制,審核機制等等
這些可以透過CI PIPELINE形式使用Merge Request來達成
這同時可以完善團隊合作外,也能產出有品質的Code
8th Best Practice
最後的這個BP就是執行
只透過Continue Deployment PIPELINE中執行Terraform指令來完成異動
而不要透過任何人手動執行Terraform指令異動
不要只有特定人的電腦上面執行
而只能透過自動化機制的機台上執行
也就是唯一的地方來統一執行異動
同時也會有更精簡InfraStructure的異動流程可以檢閱