IaC with Terraform 27

Terraform Best Practices

ZONGRU Li
5 min readOct 27, 2023

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的異動流程可以檢閱

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet