DevOps課程-IaC with Terraform 13
前一篇完成了
- VPC
- Subnet(在上述VPC內)
- InternetGateway
- default的RouteTable的設置
- default的SecurityGroup的設置
等以上的建置Code
接著在建置EC2之前還需要建置哪些東西呢?
接著就來嘗試建立看看EC2 instance的resource code:
而第一個要定義在這個resource內的就是 — ami
也就是作業系統OS的image代碼
這個可以在創建EC2的選擇作業系統處可以看到(如下圖紅底線):
並且小心,這個ami代碼可能會依據region不同而有不同,即便是相同OS
所以初步可以如下這樣寫:
但是一般來說會希望ami是動態選用的,所以會用一個data物件注入:
這邊就要對AWS的ami要有一些理解
首先預設是想要拿到的是"Amazon Linux 2"的最後版本
所以先給定data的名稱為如下:
接著這個data還要定義一個attribute是"owners"
其中例如在建立EC2 instance的頁面,可以到以下畫面去查看:
另外在EC2控制介面下:
會看到:
另外,若是基於某個現有的OS image再加裝自己所需工具軟體等等
再定義成的image,則是自己定義而成的image則是放在:
接著這個data還需要經過過濾(filter)條件,比如說名稱:
另外再加一個過濾條件:
也就是過濾條件可以很多個,可以參照:
就會看到N個過濾條件:
包含我們用的"virtualization-type":
此時Terraform的Code上剛剛定義的aws_instance需要指定的ami可改為:
但是在實際執行之前,建議先註解掉,並且做output來查看是否拿到正確的ami
然後執行Terrafomr plan:
attribute資訊像是描述:
而我們有興趣的其實只有id部分,所以在改寫為:
所以這時候就確認data物件拿到的ami的id是正常的
當前的Code就可以如下(剛剛aws_instance的註解就打開了):
接著aws_instance這個resource還要定義的屬性是type:
相當於以下畫面:
通常會放到變數區去:
以上aws_instance的resource必要的兩個attribute就設置完畢了
接著是選擇性的attribute
比如前面part 1建立的subnet選用
還有part 1建立的sg(security group)
如果沒給,就會給成預設的VPC其中的AZ,subnet等等
所以這邊進一步改寫為:
接著還要再定義一個attribute是綁定的key-pair
先回到EC2儀表板:
這個key-pairs就是要拿來ssh到該EC2機台用的金鑰對(講師是重新建立)
記得putty是要ppk格式,ssh用的是pem格式
(不過有puttygen可以轉pem為ppk)
如果沒有的話,可能選擇pem再轉成ppk可能比較好(這樣兩個格式都有!)
重建的話,會自動下載,記得把該檔案放到~/.ssh/底下,並且改權限
#只有當下使用者可以讀取使用:
chmod 400 ~/.ssh/{key-pair檔案}
最後免不了再加個tags:
以上大致就定義完成了,然後執行plan指令確認,大概會看到很長的EC2:
以上看起來沒啥問題,就可以apply:
執行後這個會比較久,畢竟是建立Server:
最後看到:
然後在Web介面看到:
等等正常執行後,就可以透過ssh/putty去連線:
我這邊隨便取名:
記得Auth要給到key-pair(畫面我就不貼了)
若是用ssh指令則是要:
#ssh連線:
ssh -i ~/.ssh/{key-pair的pem檔} ec2-user@{IP位置}
此時完成的Terraform Code如下(main.tf):
terraform.tfvars內容如下(記得個人電腦IP要改才能用):
以上就完成基本EC2機台建置!
Automate ssh key pair
前面講師是重新建立key pair,所以會有建立,下載,搬移,開權限等等步驟
為了省去這些麻煩,可以再建立新的resource — aws_key_pair
裡面要包含兩個attribute:
如上public_key的部分,可以沿用之前DigtialOcean建的public key
可參考建置步驟(在DigitalOcean建立Droplets(LinuxVM) 1)
有以下的pub key:
把上述檔案裡面的文字內容cat出來貼上去:
然後記得這東西絕對不能check in到Git Repo上
然後記得這東西絕對不能check in到Git Repo上
然後記得這東西絕對不能check in到Git Repo上
比較好的做法是做成變數
只在執行機台儲存這些變數
然後在前面宣告變數,並定義到變數檔 — terraform.tfvars裡面
另外也可以用檔案方式讀取,寫法如下:
最終Code改寫為:
接著OK沒問題就可以執行plan指令確認:
這邊就真的要小心了,如上既有機台會被重建
然後講師畫面還有警告訊息,可以進一步改寫:
我改完後再次執行plan指令還是很正常:
所以接著就可以執行apply指令重建:
然後web介面看到:
此時我們還可以做output公開IP位置:
下次再執行就可以看到可以連線的IP位置!
這邊對應到的連線key(ppk檔案)我是放在:
依樣可以putty登入到:
如果是ssh連線則要帶:
#用ssh連線方式
ssh -i ~/.ssh/id_rsa ec2-user@{公開IP位置}#然而.ssh目錄是預設目錄,所以可以簡化為:
ssh ec2-user@{公開IP位置}
這到這邊,若前面步驟是跟著講師額外有建立的pem key就可以移除了
然後AWS介面上的key-pair介面也可以做移除的動作
此時的Code如下(main.tf):
terraform.tfvars內容如下:
並且也完成了:
Automade as much as possible
總結一下好處:
- 1.當執行destroy就不會漏掉某些不常用的Component
- 2.環境複製就很容易用一樣的Terraform Code重建
- 3.且不同環境的建置步驟不用再寫文件(Terraform知道背後步驟就好)