Dec 09 2020
如何讓AWS EC2開機後就能上線
寫在前面
在雲端服務一定會遇到的是機器的擴展(scale out)與縮編(scale in)的問題,如果一個AutoScaling Group觸發了機器的成長時肯定是無法靠手動 的方式來安裝機器,所以必須要透過全資動畫的方式進行,這時候我一開始的想法是在AutoScaling發生的時候觸法Jenkins的Job來安裝系統, 但這有個問題是我整個aws的服務都必須依賴在Jenkins上,後來同事指導了一個做法只需要透過AWS的設定就可以自動裝機了!
User Data
一直以來都沒從還沒注意過AWS在建立EC2或是在Launch template介面上的user data,user data中的指令AWS會在我們EC2開機的過程中為我們執行 如此一來就可以不需要依賴任何一個工具就可以完成茲動畫的作業了。
在我同事的指點中,他建議在user data中不要放置帶多的指令碼而是用來下載入口指令碼與執行入口指令碼的內容就好
main.sh
在入口腳本中一個很重要的事情是辨識機器需要安裝哪些東西以及要做哪些事情,但不太想讓user data有太多的版本避免團隊成員中複製時出錯, 所以在EC2的Tag中做了一些手腳,依照EC2 Tag的設定安裝不同的軟體
在取得EC2 Tag時其實需要先做很多事情,首先要先取得EC2 instance Id...但取的EC2 Instance Id前要先取得Region.... 然後發現有個的API endpoint,這API endpoint 主要是取得主機的相關資料,然侯回傳的是一個Json的資料格式
在shell 操作Json的資料格式,不外乎就是jq這個套件了...所以我的入口腳本第一件事就是安裝jq,接下來才是去取得EC2 instance的資料
當有了instance id與region時就可以取得Tag資訊了
EC2的Tag
install.sh
user data只負責下載與執行入口腳本在入口腳本中還要執行服務腳本,服務腳本是用來安裝application的! 在入口腳本中會用EC2的Service Tag到S3 Bucket下載對應的install.sh來安裝與設定application所需要的設定
ECS的安裝腳本
總結
使用user data可以做到系統自動化而且還不需要依賴任何的工具,不過在使用這樣的方式時需要對整個OS, shell script(如果用windows就得對powershell熟悉) 以及對aws cli有足夠的能力才有機會做出這樣的腳本,有了這樣的腳本才能做到100%的自動化。 在目前已經做到完整的自動化的部署模式,我們團隊的CI server, Staging環境每天下班後自動關機上班前會自動開機並且安裝整個application 在production的環境裡,自動化擴展時Windows的機器約莫15分鐘,Linux的機器約莫5~7分鐘就能設定完成並且服務
在AWS的Image中只設定了預先裝好IIS的Windows機器,此目的是為了節省安裝IIS的時間成本讓機器可以更快的上線服務減少支出 其他Linux的機器都只有選擇AWS Linux2的image,並沒有特別做任何設定
windows的機器在AWS開機使用T3.Medium的速度一般來說都在15分鐘左右完成
EC2 instance 的相關時間估算
Target | Script | 請求機器 | 移交機器 | Provisioned | Health check | 上線時間 |
---|---|---|---|---|---|---|
Windows Server | 3~5 min | 1.5 min | 7~9 min | 5 min | 1.5min | 15~22 min |
Linux Server | 3~5 min | 1.5 min | 5~7 min | 3 min | 1.5min | 9~13 min |