DevOps課程-IaC with Terraform 13

Automate Provisioning EC2 with Terraform — Part2

ZONGRU Li
9 min readFeb 21, 2022

前一篇完成了

  1. VPC
  2. Subnet(在上述VPC內)
  3. InternetGateway
  4. default的RouteTable的設置
  5. default的SecurityGroup的設置

等以上的建置Code

接著在建置EC2之前還需要建置哪些東西呢?

接著就來嘗試建立看看EC2 instanceresource code:

而第一個要定義在這個resource內的就是 — ami

也就是作業系統OSimage代碼

這個可以在創建EC2的選擇作業系統處可以看到(如下圖紅底線):

並且小心,這個ami代碼可能會依據region不同而有不同,即便是相同OS

所以初步可以如下這樣寫:

但是一般來說會希望ami是動態選用的,所以會用一個data物件注入:

這邊就要對AWSami要有一些理解

首先預設是想要拿到的是"Amazon Linux 2"的最後版本

所以先給定data的名稱為如下:

接著這個data還要定義一個attribute"owners"

其中例如在建立EC2 instance的頁面,可以到以下畫面去查看:

另外在EC2控制介面下:

會看到:

另外,若是基於某個現有的OS image再加裝自己所需工具軟體等等

再定義成的image,則是自己定義而成的image則是放在:

接著這個data還需要經過過濾(filter)條件,比如說名稱:

另外再加一個過濾條件:

也就是過濾條件可以很多個,可以參照:

就會看到N個過濾條件:

包含我們用的"virtualization-type":

此時TerraformCode上剛剛定義的aws_instance需要指定的ami可改為:

但是在實際執行之前,建議先註解掉,並且做output來查看是否拿到正確的ami

然後執行Terrafomr plan:

如圖ami當中包含很多attribute資訊

attribute資訊像是描述:

而我們有興趣的其實只有id部分,所以在改寫為:

所以這時候就確認data物件拿到的amiid是正常的

當前的Code就可以如下(剛剛aws_instance的註解就打開了):

接著aws_instance這個resource還要定義的屬性是type:

相當於以下畫面:

通常會放到變數區去:

以上aws_instanceresource必要的兩個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可以轉pemppk)

如果沒有的話,可能選擇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知道背後步驟就好)

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet