[Terraform] Terraform入門(1)
鼠年全馬鐵人挑戰 - WEEK 08

前言
因目前實習公司代理許多雲服務,有使用Terraform撰寫腳本來管理雲平台,藉此機會筆記一下學習Terraform這項工具。本篇會紀錄如何實際撰寫Terraform腳本來操作AWS S3、IAM這兩項服務。
什麼是Terraform?
Terraform是由HashiCorp這家公司所開發,是一個基礎架構即程式碼(Infrastructure as Code;簡稱IaC)的開源工具,關於IaC架構的細節可參考這篇,而且它支持多種雲環境,還可以進行版本控制。
可以想像一種情況,如果今天有多個雲要進行管理,可能架構會隨時需要調整,或是要配置資料庫、網路安全等設定時Terraform變成是很好的工具去管理這些雲端的基礎架構。以AWS為例,有了Terraform後,我們便不再需要透過手動操作滑鼠點擊console介面,只要撰寫好 Terraform 腳本,一鍵就能完成想要做的事情,透過程式碼去管理擁有的雲端資源。
簡單歸納一下Terraform的優點及特色
- 針對擁有的雲端服務做版本控管
- 自動化測試雲端架構
- 容易閱讀,一起開發的人可閱讀腳本理解目前使用的雲服務相關設定
- 在不同的環境下(如: 開發、測試、實際上線),雲服務的配置都會相同
- Terraform的檔案副檔名是
*.tf - 用HCL語言撰寫
- 跨平台(支援哪些平台可看官方文件)
Hands On Lab
安裝
官方載點
如果是Mac的話可以使用Homebrew
1 | |
當然也可以手動下載壓縮檔,解壓縮到/usr/bin、/usr/local/bin 目錄,解壓縮得到編譯好的執行檔。
查看版本
檢查是否可執行terraform,開啟終端機,輸入terraform -version,會顯示當前terraform版本訊息
初始化Provider
先來個範例吧!
在專案資料夾建立一個名為main.tf的檔案
1 | |
下指令進行初始化
1 | |
terraform 會根據在當前的目錄下產生一些本地端設定,並根據上面的設定下載相對應的二進位檔,放到.terraform目錄中。
上述的程式碼中,provider用於決定對哪一個平台操作 region是AWS需要的屬性,表示地區。
配置Provider
將終端機出現的version = "~> 2.55" 這段資訊加入main.tf內。
1 | |
查看當前目錄結構

下載並匯出 Access Key
開啟終端機,輸入下方指令,並替換成自從AWS download下來的Access Key
1 | |
建立S3
配置resource
resource是表示決定用指定雲平台中的哪個服務(資源),採類似JSON的結構,結構大概會是
1 | |
以AWS S3作為範例:
1 | |
上述程式碼表示以aws_s3_bucket為雲端資源(AWS有S3這項儲存靜態資源的服務),並自定義一個my_s3_bucket名稱
查看Terraform異動
在實際執行之前觀察 Terraform 將做哪些哪些改變,這是為了防止我們修改到我們不應該修改的東西,或是有不是我們預期的結果
1 | |

執行/創建
1 | |

這裡 Terraform 一樣會輸出相關的資訊內容,告訴你會有哪些改變,並讓你輸入去確認是否真的要執行,只要輸入 yes,就會實際開啟S3服務了。
建立成功!
成功後回到S3 管理介面就會看到剛剛建立好的bucket囉!
查看狀態(state)
terraform在執行完後,會在當前目錄下產生一個terraform.tfstate檔,此檔案包含了透過terraform 產生出來resource的詳細資訊,而terraform依據這個檔案來追蹤及維護resource。
輸入下方指令可秀出當前resource狀態的相關資訊
1 | |

異動
假設今天我們把bucket = "my-s3-bucket-terraform-01"改成bucket = "my-s3-bucket-terraform-02"並執行terraform apply,會看到如下圖所示的異動資訊
回到S3管理介面會看到名稱已經做更動
因為
terraform.tfstate保留所有resource的狀態,執行terraform命令時,這個檔案必須要存在,確保 terraform可以正確的監聽resource的狀況。
另外,透過terraform plan指令,可以讓你在實際執行之前觀察Terraform將做哪些哪些改變
啟動Versioning
S3有個Versioning的功能,現在我們要透過撰寫.tf黨的方式來開啟這個功能,於resource內添加versioning {enabled = true}這段程式碼
1 | |
添加完畢之後執行terraform apply,terraform會自動幫我們變更S3的設定,執行後會看到下方這段訊息:
表示versioning功能已被開啟,接著回到aws S3的console介面點選my-s3-bucket-terraform-02,找到Properties
上圖可檢視此功能成功被開啟!
刪除
執行terraform destroy就可以清除所有的資源,會要你輸入yes做為確認。
terraform console
terraform也提供console的方式來遠端操作
實作
執行下方指令進入console
1 | |

如果要查看剛剛建立的S3 bucket,依照resource中的type.name的方式輸入指令,如:
1 | |
表示從aws_s3_bucket這個resource中選擇剛剛建立的my_s3_bucket
執行指令後會秀出該Bucket內含的相關資訊。
當然我們也可以往下找更詳細的資訊,如剛剛新增的versioning指令
1 | |

回傳值為一個list資料結構的資訊,所以可以近一步取得list內的物件。
1 | |

退出console
1 | |
Output 查看輸出訊息
除了利用console查看.tf配置的訊息外,也可以撰寫output語法來輸出我們想要的訊息,例如印出剛剛在console內看到的訊息,可以把aws_s3_bucket.my_s3_bucket.versioning[0].enabled放入output中,如:
1 | |
my_s3_bucket_versioning為自己定義的名稱,接著執行terraform apply -refresh=false查看訊息
或是可以印出完整的訊息
1 | |
操作IAM
接著用terraform腳本來建立AWS IAM User
1 | |
在終端機輸入指令
1 | |

畫面會提示輸入terraform apply "iam.tfplan"的指令
印出上圖訊息表示成功建立IAM User
如上圖,進入IAM User Console介面就會看見剛剛建立好的User哦!
當然我們也可以印出output來做檢查
1 | |

更新IAM User name
假設要更改User名my_iam_user001為my_iam_user001_update
1 | |
更改完畢後,輸入下方指令
1 | |
建立多個IAM User
本篇只有先記錄最基礎的用法,更多相關用法可參考官方文件。假設今天要一次建立兩個User,做法是給予IAM User這個Resource次數(count),並透過物件的方式assign,如:
1 | |
其中index編號是從0開始,執行terraform apply後打開console介面會看到新建立的兩個User,分別為my_iam_user_0、my_iam_user_1
補充一些較常用的指令
terraform fmt: 將指令進行統一格式,改善因多人共同開發,各自風格差異過大的問題。terraform graph: 圖形化所有資源的相異性。terraform import: 導入目前已經在雲端上手動建立資源到Terraform中。terraform validate: 用於驗證是否存在語法錯誤。
以上透過AWS兩個服務範例來實作Terraform腳本,倘若有疏漏或錯誤之處,可在下方留言讓我知道!