目前為止已經完成將應用程式從傳統自建機房搬到 AWS 雲端的工作,這已經幫管理人員節省了要管理一大堆實體設備的問題,接下來我們就繼續發揮雲端的特色,雲計算最為人所稱道的就是它的便利性,也就是要用多少拿多少,不用就還給雲端,轉成專業術語就是 Auto Scaling Up/Down 自動擴展或縮減,所以接下來我們要進行的就是如何讓原先的架構可以達到這個目標,如下圖所示
圖一、具有自動擴展功能的應用程式架構
下圖是個很常見的網頁應用程式計算使用量的統計圖表,所有網站擁有者都有相同的困擾,他們必須為最高計算量準備好該有的硬體設備,但是當我們把整個計算量統計出來時,卻發現原來閒置的計算量可能數倍於使用所需的計算量,這對經營者而言是個很大的打擊,尤其是針對新創業者或是產品週期就短的業者而言,都是很不利的,這也說明了,為何現在的新創公司或是手遊業者會大量採用雲端技術的主要原因。
圖二、網頁應用程式容量統計圖
AWS 在自動擴展或縮減這個需求上提供了三個組件:
下圖描述了 AWS 自動擴展或縮減架構, ELB 對外提供服務,透過 Cloud Watch 來監控 ELB 目前的狀態,根據使用者是先定義好的 Auto Scaling Policy 來通知 Auto Scaling 是否要新增 EC2 實例,如果需要,則從 Launch Configuration 所定義好的 EC2 實例進行啟動,並放置到 ELB 的 target group 中。
圖三、AWS 自動擴展或縮減架構
從無到有建置 Aoto Scaling Group 要做的事情有
根據以上所建立的 EC2 實例,我們必須在該實例上進行一些雛型系統配置,作為將來檢驗之用
系統設定
# 安裝套件 httpd php mysql php-mysql
sudo yum -y install httpd php mysql php-mysql
# 啟動 Web Server
sudo systemctl start httpd
# 設定 Web Server 為系統服務,可在下次重開機時自動啟動
sudo systemctl enable httpd
應用程式設定
首頁程式 index.php,新增加可以增加主機CPU負載的鏈結
<center>
<p>
<a href="put-cpu-load.php" target="_blank">Increase CPU Load</a>
</p>
<table class='table table-bordered'>
<tr><th>Meta-Data</th><th>Value</th></tr>
<?php
#The URL root is the AWS meta data service URL where metadata
# requests regarding the running instance can be made
$urlRoot="http://169.254.169.254/latest/meta-data/";
$instanceId = file_get_contents($urlRoot . 'instance-id');
$availabilityZone = file_get_contents($urlRoot . 'placement/availability-zone');
# Get the instance ID from meta-data and print to the screen
echo "<tr><td>InstanceId</td><td><i>" . $instanceId . "</i></td><tr>";
# Availability Zone
echo "<tr><td>Availability Zone</td><td><i>" . $availabilityZone . "</i></td><tr>";
include("rds_write.php");
?>
</table>
</center>
存取 RDS 的程式 rds_write.php
<?php
//This is a simple EC2_metadata example for testing with RDS
// RDS configuration
$rdsURL = "ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com";
$rdsDB = "ithomeDB";
$rdsUser = "ithomeDbuser";
$rdsPwd = "ithome-password";
// Get remote IP
$remoteIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
// Connect to the RDS database
$mysqli = new mysqli($rdsURL, $rdsUser, $rdsPwd, $rdsDB);
// Set mysql connection character set
if (!$mysqli->set_charset('utf8')) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit;
}
// Insert data into ec2_metadata tbale in RDS
$sql = "INSERT INTO ec2_metadata (instanceId, availabilityZone, remoteIp)
VALUES ('${instanceId}', '${availabilityZone}', '${remoteIp}')";
if (!$mysqli->query( $sql))
echo "<div>Error: " . $sql . "<br>" . $mysqli->error . "</div>";
$mysqli->close();
?>
產生 CPU 負載的程式 put-cpu-load.php
<?php
# Start PHP Session to keep track of whether or not load is getting generated
session_start();
echo "<meta http-equiv=\"refresh\" content=\"5,URL=./put-cpu-load.php\" />";
$idleCpu = exec('vmstat 1 2 | awk \'{ for (i=1; i<=NF; i++) if ($i=="id") { getline; getline; print $i }}\'');
if ($idleCpu > 50) {
echo exec('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &');
echo "Generating CPU Load! (auto refresh in 5 seconds)";
}
else {
echo "Under High CPU Load! (auto refresh in 5 seconds)";
}
echo "<br /><p>Current CPU Load: <b>";
echo 100-$idleCpu;
echo "%</b></p>";
?>
透過瀏覽器確認功能無誤,確認首以及壓力測試頁均可正常運行,如下圖顯示
圖四、確認 EC2 實例的功能符合要求
到 EC2 主控台,選擇左邊選單中的 執行個體,再選擇剛剛建立的 EC2 實例,按滑鼠右建,選擇 Image > Create Image,接著輸入以下內容建可以建立一個 AMI Image
Image name : ithomeAMI
Image description : ithome Web Server AMI
圖五、新增 AMI
圖六、輸入 AMI 資訊
Register Targets: 指定目標群的內容,將先前設定的兩個 EC2 實例指定到上面新建立的目標群
圖六、指定負載平衡器目標群內容
但因為這次的目標群是不固定的,會在下一個步驟再設定,所以應該是不要指定,如下圖
圖七、負載平衡器目標群內容不指定
到 EC2 主控台,選擇左邊選單中的 Launch Configuration,按下右邊的建立啟動組態按鈕
圖八、建立啟動組態
完成啟動組態設定
名稱 : ithomeLC
AMI : ithomeAMI
執行個體類型 : t2.micro (1 vCPU, 1 GiB, 僅 EBS)
監控 (Monitoring) : 在 CloudWatch 中啟用 EC2 執行個體詳細監控
指派安全群組 :
選取現有的安全群組
ithome_web_SG
金鑰對選項 :
選擇現有的金鑰對
ithome
圖九、啟動組態設定畫面
到 EC2 主控台,選擇左邊選單中的 Auto Scaling 群組,按下右邊的建立 Auto Scaling 群組按鈕,接下來需要完成七個步驟來完成Auto Scaling 群組的設定
步驟 1. 選擇啟動範本或組態
Auto Scaling 群組名稱 : ithomeACG
啟動組態 : ithomeLC (記得一定要先按下轉換至啟動組態,才會切換到選擇啟動組態)
圖十、選擇啟動組態
步驟 2. 進行設定
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
子網路 :
ap-southeast-1a | subnet-0f1df807467b642f6 (ithome public subnet 1)
172.16.0.0/26
ap-southeast-1b | subnet-06f56dccb2a9cfcf0 (ithome public subnet 2)
172.16.0.64/26
圖十一、網路組態設定
步驟 3 (選用) 設定進階選項
負載平衡
勾選 啟用負載平衡
_Application Load Balancer _
為您的負載平衡器選擇目標群組 : ithomeTargetGroup
監控 : 勾選 在 CloudWatch 中啟用群組指標集合
圖十二、負載平衡設定
步驟 4 (選用) 設定群組大小和擴展政策
群組大小 - 選用
變更所需的容量,以指定 Auto Scaling 群組的大小。您也可以指定最小和最大容量限制。所需的容量必須在限制範圍內。
所需容量 : 2 # 指的是一開始啟動 Auto Scaling Group 會啟動的 EC2 實例數量
容量下限 : 1 # 指的是 Auto Scaling Group 最少正在執行的 EC2 實例數量
容量上限 : 10 # 指的是 Auto Scaling Group 最多正在正常執行的 EC2 實例數量
擴展政策 - 選用
選擇 目標追蹤擴展政策
選擇所需的結果,並將其保留至擴展政策中,視需要新增和移除容量,以實現該結果。
擴展政策名稱: itHomePolicy
指標類型 : 平均 CPU 使用率
目標數值 : 50
納入指標之前的暖機秒數 : 300
這個設定的意思是說當整個 Auto Scaling Group 的平均 CPU 使用率為 50% 的話,會擴展一台新的 EC2 實例來降低整個系統的負荷
納入指標之前的暖機秒數這個數字是說,當新增一台新的 EC2 實例,從啟動到可以被註冊到目標群的時間
圖十三、設定群組大小和擴展政策
步驟 5 (選用) 新增通知
沒有設定
步驟 6 (選用) 新增標籤
標籤
金鑰 : Name # 注意大小寫是不同的,
數值 : itHomeWebServer
圖十四、設定新啟動的 EC2 實例的名稱
步驟 7. 檢閱
再次確認上述資料有無錯誤
到 EC2 主控台,選擇左邊選單中的 負載平衡器,選擇負載平衡器 ithomeALB,並找到 DNS name 這個欄位,複製這個欄位並貼到瀏覽器,如果成功會出現以下畫面,按下 Increase CPU Load 來增加 CPU 使用率。
圖十五、透過ALB瀏覽網頁
幾分鐘後,到 EC2 主控台,選擇左邊選單中的 Target groups,選擇 ithomeTargetGroup,切換到 Targets 頁簽,可以觀察到下方的 EC2 實例的增加狀況。
圖十六、觀察目標群組實例的狀態
以上是沒有錯誤的狀況,但如果一直觀察不到有新的 EC2 實例生成,可以到 EC2 主控台,選擇左邊選單中的 Auto Scaling Groups,選擇 ithomeACG,切換到活動頁簽,可以觀察到活動的歷史紀錄,這是很重要的排錯功能。
圖十七、觀察Auto Scaling Groups活動的歷史紀錄
此外還可以透過監控頁簽,選擇檢視所有 CloudWatch 指標,切換到CloudWatch的主控台,選擇 EC2 > 依照 Auto Scaling 群組,選擇觀察 CPUUtilization 這個指標,就可以有圖形化的方式顯示出來
圖十八、透過 CloudWatch 觀察 CPUUtilization
再檢查RDS是否正常運作
圖十九、檢查RDS是否正常運作
最後,當整個CPU使用率下降後,確認是否會自動縮減,一樣去檢查目標群組(Target groups)中的實例的狀態就可以知道,下圖中有三個實例正在進行解註冊目標群組
圖二十、目標群組實例自動縮減