Day 21 以 Gitlab 作為 Terraform backend
Day 13 講到 Terraform 會把 resource 狀態 state 存在 backend 裡,到目前為止我們的 backend 都是 local 檔案:
terraform.tfstate
:記錄 remote resource state 的檔案terraform.tfstate.backup
:上述檔案的備份檔,有時候非正常中斷 apply 操作會導致 state file 整個被清空,可以用備份檔救回來
看過 terraform.tfstate
檔案內容的朋友應該知道它就是個文字檔、記錄著所有 terraform 管理的 resource 的資訊,其中包含 credential,例如 IAM user 的 access key id 及 secret。沒錯,它是明碼。所以前面有說 state 檔案不建議 commit 進 git repository,不然就所有 credential 永存 git history 了……安捏母湯~
另外就算 state 檔案裡沒有 credential,以多人協作來說,也不適合使用 local 檔案存放 state。跟程式碼一樣,多人共同改同一個檔案可能會造成 conflict,state 的 conflict 跟 code 不一樣,它會對應 cloud 上真實的 resource,這 conflict 很難解啊~
基於上述原因,我們要改用 remote 且對 state 有所保護的 backend,Gitlab 有提供管理 terraform state 的功能,我們把 state 轉移到 Gitlab 上吧~
Gitlab Terraform State 透過 Terraform 的 http backend 來保存 state file。Gitlab 裡的 terraform state 有 version,我們可以用 api 取得先前版本的 state。重要的是 Gitlab 會加密 state 檔案後才保存,透過 Gitlab API 存取 state 時會自動加解密。