IaC with Terraform 26

Remote State in Terraform(S3 Bucket)

ZONGRU Li
Oct 27, 2023

Remote State — Introduction

當在一個團隊中使用Terraform或是透過PIPELINE工具使用Terraform

會有許多處會產出Terraform state檔案

前一篇筆記是在Jenkins上執行Terraform,相關的state檔案也存在於該機台上

但是我們在本機就因為沒有相同的State

無法透過本機執行plan或是apply一些變更

去異動到Jenkins驅動Terraform建立的機台資源

所以該如何分享同一份的Terraform state?

答:BP也是最簡單的方法是 →Remote State

Remote State:

  • TF write the data to this remote data store
  • Different remote storage options possible

透過Remote State機制將有以下好處:

  • data Backup
  • can be shared
  • keep sensitive data off disk

Configure Remote Storage

延續前一篇Jenkins PIPELINE寫的繼續編輯:

但是目前還沒建立名稱為"myapp-bucket"的AWS S3的bucket,後面跟著建立

Create AWS S3 Bucket

當進到S3服務時候會發現region變成global,因為S3是global的服務

這時候建立bucket:

畫面中有之前研究AWS S3建的舊的bucket

剩下就用預設:

不過已經有相同名稱存在了:

所以我改成:

對應到上面設定,其實Terraform還要增加region的設定:

另外注意:

透過以上設定

之後Terraform執行後產出的state檔案就會儲存到S3的Bucket去

但是在上面設定完成後,記得先移除前一篇執行後產出的AWS機台資源

以上設定好後,一樣commit push到github存放

Execute Jenkins Pipeline

再次執行PIPELINE:

在init階段就會先建立空的state檔案到bucket去

所以若執行Terraform的機台上本身有local的state檔案

然後想要升級儲存到S3 Bucket的時候

就可能需要手動重做init指令

後面PIPELINE log就正常

回到S3畫面重新整理後看到:

點進去看到:

但是點進去URL看不到內容

因為我們設定是有block公開進入的權限

只能透過AWS cli或是terraform才能閱覽到

但是現在這時候state是可以被分享的狀態

我本機理當也可以看到

記得現在Jenkins機台是在EC2上面

所以這時候我在本機同一份推上去的Code中的terraform目錄執行

#執行初始化:
terraform init
忘了要切到terraform目錄那層了

重跑:

#接著執行查看state指令:
terraform state list

而state內容就源自S3 Bucket內查閱而來

也就是目前我跟AWS遠端建立的Jenkins機台上跟我本機電腦分享了同一份

state檔案!!!

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet