[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腳本,倘若有疏漏或錯誤之處,可在下方留言讓我知道!