DevOps課程-IaC with Terraform 17
Modularize our Project
首先先還原到沒有使用常常有問題的provisioner的Code如下:
main.tf:
terraform.tfvars:
可以看到當前的main.tf單一檔案內定義了許多的resources
首先先將git branch做個切換:
#執行切換branch:
git checkout -b feature/modules
並且一般普遍的Terraform專案架構上,會將上述main.tf內的Code大致分為:
- main.tf(主要放resources的部分)
- variable.tf(放變數宣告)
- outputs.tf(放output)
- providers.tf(宣告providers)
所以依據上述定義,開始在專案內額外擴增這幾個檔案:
因為provider只有單一個aws不另外額外擴檔存放,只先做
outputs.tf:
variable.tf:
此時maim.tf剩下:
建立Module:
先在專案目錄內建立一個目錄叫 →modules
緊接著在這個目錄下再建出我們自訂義的module目錄 →webserver
然後在modules目錄下定義另一個module目錄叫 →subnet
Module目錄的劃分主要是將類似的resources做歸類
通常一個Module會包含三或四個resources
然後透過VScode的terminal的功能
分別在這兩個目錄(webserver 與 subnet)內分別定義:
- main.tf
- outputs.tf
- variables.tf
首先先開個Git Bash(才能用一個bash指令操作,預設PowerShell有點難用...)
完成webserver目錄的部分:
完成subnet目錄的部分:
再來將目前main.tf內跟網路有關的三個resources
歸類到subnet module內(放到subnet module內的main.tf)
aws_subnet
aws_internet_gateway
aws_default_route_table
但是需要額外修改以下幾處:
上面額外定義的兩個變數:
- var.vpc_id
- var.default_route_table_id
就要額外宣告到subnet module內的變數檔去:
另外原本有用到的變數宣告也要轉移過來:
接著再把剛剛額外定義的變數加上去:
所以此時subnet modules內的main.tf內使用到的變數
在該modules的變數檔都有宣告
Use the Module
要主要的main.tf內要使用到上面定義的subnet module
則要宣告這個module:
為了方便,再把subnet_cidr_block變數加回去:
所以在改回:
意思就是
1.在主層的.tfvars檔內的變數值:
2.設定給到主層的變數檔(variables.tf):
3.主層變數檔變成主層main.tf引用child modul的args
4.上述的args值變成該module的變數檔的值
5.最終提供給這個module內的main.tf使用:
然後上面弄老半天少傳入一個:
另外主層main.tf引用child module還要特別改一樣地方是相對路徑:
接著還要關心主層main.tf中,原本取用轉移到module內的resource
如下解說
Module Output:
所以主層main.tf取用module內的resource正確方式為何?
其實就是定義在module內的outputs.tf裡面
例如如上原本主層的main.tf要拿到:
這邊要先到該module內的outputs.tf定義:
主層main.tf的Code則改成:
Apply Configuration Changes:
在執行之前,因為有做Modularize(或說只要有變動到module的時候)
所以首先要先重做init
上面看起來沒問題,就執行plan指令:
上面看起來也沒問題,就可以apply:
terraform apply --auto-approve
然後在AWS看到:
並且:
然後這邊當前的Code分太多檔案,就不用gist記錄了
就將目前的Code推上github並執行destroy