background image

Sep 19 2020

Terraform 做 AWS IaC

寫在前面

一直在公司使用ansible來做Cloud configuration但是ansible在cloud configuration上說真的略顯不足, 在之前的文章中我們很常使用aws cli來做相對應的處理。使用aws cli時要有更好的可讀性與維護性,通常都以JSON的格式輸入 因此在ansible中的playbook上就會有多餘的一些步驟去設定餵給aws cli的JSON。

這一篇就用terraform來建立一個aws AutoScaling Group吧!

安裝Terraform

terraform的安裝其實非常簡單,在下方的參考連結中有其他的安裝方式,我這邊主要會使用mac的安裝方式

在mac安裝terraform我是透過Homebrew來安裝terraform

安裝完成後做一個簡單的驗證,開啟你習慣的terminal執行以下的command就可以知道我們是不是有安裝成功了, 如果安裝成功就會出現跟下圖一樣的資訊出來,就可以進行下一步了!

安裝terrafrom的驗證
安裝terrafrom的驗證

如果透過Homebrew安裝不成功,可以試試看brew upgrade,更新一下homebrew

因terraform最後會產生aws cli的command,在安裝完畢後需要安裝aws cli並且設定aws的一些infomation 並且設定aws的access key跟secert key的部分

初始化terraform

這一篇的目標是要用terrafrom建立aws 的auto scaling group,在達成目標前terraform前需要先做初始化

初始化其實非常容易,先在你的terraform的資料夾下先建立一個main.tf的黨案,定義provider

執行init後會有下方的資訊出現並且在資料夾中會有一個.terraform的資料夾

terraform init訊息
terraform init訊息

透過terrafrom 建立 AWS AutoScaling Group

接下來要建立一個main.tf或是使用前一步的main.tf,撰寫resource的設定有關於aws 的resource定義資料 可以參考下方的參考連結中的terraform aws provider

Apply

在terraform要真的去建立資源的command 是apply,在真正到aws上建立資源前會有一個預覽資料等待你的確認才會真正的建立資源

如果在CI的魔是可以透過auto-approve,來略過確認輸入的情況

Plan

如果你想先看看資源變更的情況或是dry run時可以使用plan來先做預覽 預覽後可以直接變更資源如下方圖片中的的文字 terraform apply "plan"

terraform plan
terraform plan

Oops!我的Resource被修改了!

在完成第一個resource的建立後,要建立第二個autoscaling時我用了這樣的main.tf,但是出現了一些狀況...

這時候發現剛才建立的resource被刪除並重新建立了, 這個原因是因為你當下的資料夾出現了terraform.tfstate的檔案,將你剛才的資源資訊存放在此以便後續的資源管理 但...我該如何產生其他新的auto scaling group呢?

答案是使用terraform workspace的方式去建立一個新的workspace,讓每一個資源都是互相獨立的

terraform workspace
terraform workspace

接下來再重新執行一次plan指令就會發現預覽的資訊上變成了新建而不是刪除重建的狀態

Terraform的文件管理分享

隨著管理的資源的建立開始會發現有許多重複的main.tf,然後要修改某個資訊要修改多個main.tf,那要如何去共用這些main.tf呢?

在結構分享前我先介紹幾個terraform重要的檔案,詳細的設定請看參考連結中的terraform configuration language官網介紹

  • main.tf

    main.tf是要設定AWS或是其他雲端的資源設定

  • variables.tf

    variables.tf 則是預先定義變數,在main.tf中所用的變數資料都要在此先做定義

  • xxxxx.tfvars

    .tfvars 則是預先輸入好的參數設定,後續就不需要在cli中輸入大量的資訊

terraform 的資料夾結構
terraform 的資料夾結構

在資料夾結構中,我依照aws的服務去建立相關的資料夾(如:alb, auto scaling group等等)去建立資料夾 在每個資料夾下都會有main.tf, variables.tf, xxxxx.tfvars的檔案,在workspace的命名上會採用與tfvars的檔名相同 並且會把workspace的名稱打在aws 服務的tag中方便未來做管理。

Tips: 在variables.tf中的變數宣告建議都放上預設值,未來要刪除資源時會更加方便!

參考連結

Install Terraform

terraform aws provider

terraform configuration language

文章標籤