IaC with Terraform 26
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:
剩下就用預設:
不過已經有相同名稱存在了:
所以我改成:
對應到上面設定,其實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
重跑:
#接著執行查看state指令:
terraform state list
而state內容就源自S3 Bucket內查閱而來
也就是目前我跟AWS遠端建立的Jenkins機台上跟我本機電腦分享了同一份
state檔案!!!