今天主要要時做的是透過流量來進行 Auto Scaling Group,而流量我們以每一台實例的請求數量 (RequestCountPerTarget) 為警示的標準,擴展策略就使用 Step scaling policies ,下圖為我們要實作的環境,為安全考量我們將 Auto Scaling Group 放到私有子網,而 ELB 則是需要對外開放所以放在公有子網,考慮容錯,所以跨兩個可用區。
圖 01、具有自動擴展功能的應用程式架構
接下來的操作其實跟 ASG 步驟縮放政策 Step scaling policies - Day15 類似,可以參照該網址,但為方便起見我們還是操作一遍
根據以上所建立的 EC2 實例,我們必須在該實例上進行一些雛型系統配置,作為將來檢驗之用
系統設定
# 安裝套件 httpd php
sudo yum -y install httpd php
# 啟動 Web Server
sudo systemctl start httpd
# 設定 Web Server 為系統服務,可在下次重開機時自動啟動
sudo systemctl enable httpd
應用程式設定
首頁程式 index.php
<center>
<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>";
?>
</table>
</center>
透過瀏覽器確認功能無誤,確認首頁正常運行
到 EC2 主控台,選擇左邊選單中的 執行個體,再選擇剛剛建立的 EC2 實例,按滑鼠右建,選擇 Image > Create Image,接著輸入以下內容建可以建立一個 AMI Image
Image name : ithomeAMI
Image description : ithome Web Server AMI
圖 02、新增 AMI
圖 03、輸入 AMI 資訊
進入 EC2 主控台,在左手選單下方選擇負載平衡器,並在右邊按下 Create Load Balancer
圖 04、新增負載平衡器
我們選擇 Application Load Balancer (ALB)
圖 05、選擇 Application Load Balancer
接下來需要六個步驟來設定 ALB
步驟 1. Configure Load Balancer : 建議先看一下圖一,可以發現負載平衡器會跨越兩個可用區,因為唯有如此才能完成高可用性的設定,所以除了設定名字外,記得選擇 VPC (PS:一個區域可以有多個 VPC )以及可用區
Name : ithomeALB
Availability Zones
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
Availability Zones
ap-southeast-1a: subnet-0f1df807467b642f6 (ithome public subnet 1)
ap-southeast-1b: subnet-06f56dccb2a9cfcf0 (ithome public subnet 2)
圖 06、設定負載平衡器的涵蓋範圍
步驟 2. Configure Security Settings : 沒有設定
步驟 3. Configure Security Groups : 設定安全組,選擇先前設定的安全組,跟原來的 EC2 實例一樣
Assign a security group: Select an existing security group
_ithome_web_SG _
圖 07、設定負載平衡器安全組
步驟 4. Configure Routing : 設定要將收到的流量轉給哪個對象,因為 AWS 會將這些對象設定成一個目標群 (Traget Group) ,所以我們先指定一個目標群,到後面再來設定這個目標群的內容
Target group : New target group
Name : ithomeTargetGroup
圖 08、指定負載平衡器目標群
步驟 5. Register Targets : 不要指定目標群的內容,因為目標群的實例將會由 Auto Scaling Group 靜態或動態產生,如下圖
圖 09、負載平衡器目標群內容不指定
步驟 6. Review
完成設定後,記得在回到負載平衡器得主畫面,這時候就可以看到剛剛建立的負載平衡器,這時候就可以直接複製 DNS Name 的欄位,如下圖,當作是網址,直接讀取網頁,但請注意,要等一段時間,因為 DNS 註冊需要一段時間,所以可能要等五分鐘後, DNS 的 TTL 到期後會再去抓取的時候,這時候網頁才會正常。
圖 10、負載平衡器的內容
到 EC2 主控台,選擇左邊選單中的 Launch Configuration,按下右邊的建立啟動組態按鈕
圖 11、建立啟動組態
完成啟動組態設定
名稱 : ithomeLC
AMI : ithomeAMI
執行個體類型 : t2.micro (1 vCPU, 1 GiB, 僅 EBS)
監控 (Monitoring) : 在 CloudWatch 中啟用 EC2 執行個體詳細監控 #重要!!!啟用詳細監控之後,當您使用此啟動組態時,Auto Scaling 群組可以具備相關擴展政策,以 1 分鐘的頻率在 Amazon EC2 執行個體指標上擴展。
指派安全群組 :
選取現有的安全群組
ithome_web_SG
金鑰對選項 :
選擇現有的金鑰對
ithome
圖 12、啟動組態設定畫面
到 EC2 主控台,選擇左邊選單中的 Auto Scaling 群組,按下右邊的建立 Auto Scaling 群組按鈕,接下來需要完成七個步驟來完成Auto Scaling 群組的設定
步驟 1. 選擇啟動範本或組態
Auto Scaling 群組名稱 : ithomeACG
啟動組態 : ithomeLC (記得一定要先按下轉換至啟動組態,才會切換到選擇啟動組態)
圖 13、選擇啟動組態
步驟 2. 進行設定
選擇私有子網
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
子網路 :
ap-southeast-1a | subnet-0c60019adc4bec5f6 (ithome private subnet 1) 172.16.1.0/24
ap-southeast-1b | subnet-0b047b309432d952c (ithome private subnet 2) 172.16.2.0/24
圖 14、網路組態設定
步驟 3 (選用) 設定進階選項
負載平衡
勾選 啟用負載平衡
_Application Load Balancer _
為您的負載平衡器選擇目標群組 : ithomeTargetGroup
運作狀態檢查 - 選用
運作狀態檢查類型 : 勾選 EC2 和 ELB
運作狀態檢查寬限期 : 150 秒
其他設定 - 選用
監控 : 勾選 在 CloudWatch 中啟用群組指標集合
圖 15、負載平衡設定
步驟 4 (選用) 設定群組大小和擴展政策
群組大小 - 選用
變更所需的容量,以指定 Auto Scaling 群組的大小。您也可以指定最小和最大容量限制。所需的容量必須在限制範圍內。
所需容量 : 2 # 指的是一開始啟動 Auto Scaling Group 會啟動的 EC2 實例數量
容量下限 : 1 # 指的是 Auto Scaling Group 最少正在執行的 EC2 實例數量
容量上限 : 10 # 指的是 Auto Scaling Group 最多正在正常執行的 EC2 實例數量
擴展政策 - 選用
選擇 無
等一下自行設定步驟縮放政策 Step scaling policies,所以現在先選無
圖 16、設定群組大小和暫不設定擴展政策
步驟 5 (選用) 新增通知
沒有設定
步驟 6 (選用) 新增標籤
標籤
金鑰 : Name # 注意大小寫是不同的
數值 : itHomeWebServer
圖 17、設定新啟動的 EC2 實例的名稱
步驟 7. 檢閱
再次確認上述資料有無錯誤後,確認新增
請參考 如何產生流量與監控流量 - Day17 建立一個測試計畫,底下簡單描述操作步驟。
測試目標: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com
模擬使用者: 10 個使用者
請求頻率: 1,000/minute
步驟 1. 新建 Thread Group
jmeter 的所有任務都由執行緒來進行,所有任務都必須在執行緒組下面創建,在 AWS Test Plan 按左鍵。
圖 8、 新建 Thread Group
執行緒數量 Number of Threads: 一個用戶占一個執行緒, 10 個執行緒就是模擬 10 個用戶
準備時長 Ramp-Up Period(in seconds): 設置執行緒需要多長時間全部啟動。如果執行緒數為 10 ,準備時長為 10 ,那麼需要1秒鐘啟動 1 個執行緒。
Loop Count: 每個執行緒發送請求的次數。如果執行緒數為 10 ,迴圈次數為 10 ,那麼每個執行緒發送10次請求。總請求數為 10*10 = 100 。如果勾選了“永遠”,那麼所有執行緒會一直發送請求,直到選擇停止運行腳本。
圖 9、 設定 Thread Group
步驟 2. 新增 HTTP Request
我們是測試網頁所以要建立 HTTP Request,在 執行緒群組1000 按左鍵,新增 > 取樣 > HTTP要求。
圖 10、 新增 HTTP Request
協定: HTTP
主機: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com
圖 11、 設定 HTTP Request
步驟 3. 新增計時器
設定在固定時間內發出特定數量的請求,在 執行緒群組1000 按左鍵,新增 > 計時器 > 固定時隔。
圖 12、 新增計時器
固定處理量計時器 Constant Throughput Timer:通過計算使總處理量(以每分鐘計)盡可能接近給定的數字。當然,如果伺服器不能處理它,或者如果其他計時器或耗時的測試原件阻止它,那麼處理量將更低。作用在於控制輸送量,要注意把計時器放在執行緒群組,並在請求的上面。
目標處理量 Target throughput(in samples per minute): 1000
Calculate Throughput based on : all active threads in current thread group
圖 13、 設定計時器
可以直接按下開始後就會執行測試計畫。
在 CloudWatch 主控台,按下右方功能選單警示,按下建立警示後,我們建立兩個警示一個是新增實例 (Scale out),閾值是 RequestCountPerTarget >= 500,一個是減少實例 (Scale In),閾值是 RequestCountPerTarget <= 300。建立指標有四個步驟,分別如下:
步驟 1. 指定指標和條件
指標值設定為 Singapore > 全部 > ApplicationELB > 每個 AppELB、每個 TG 指標 > RequestCountPerTarget
,要注意要確定看到上面的圖型有資料才能確定已經正確找到指標值,因為有時候會有很多個 AppELB 實體,所以需要去找一下ALB ID確認一下
圖14、設定 RequestCountPerTarget 指標值
因為需要知道 1 分鐘內有多少個請求,所以需要把_統計資料_從平均數改成總和,期間 5 分鐘改成 1 分鐘。
圖 15、設定 RequestCountPerTarget 圖形化指標
圖 16、CloudWatch Alarm 指定指標
條件
閾值類型 : 靜態
每當 RequestCountPerTarget 為 : 大於 >= 閾值
定義閾值 : 500
要發出警示的資料點 : 1 出於 1 # 這個意思是第一個 1 是得到的資料數,第二個 1 是採樣資料的次數,舉例來說,如果設定 1 出於 2,表示採樣 2 次,只要有一次的 RequestCountPerTarget >= 500,就會發出警示
圖 17、CloudWatch Alarm 指定條件
步驟 2. 設定動作
記得移除預設的通知動作,不移除的話也可以,要指定 email 以及到 指定的 email 去訂閱 SNS (Simple Notification Service) 主題。
圖 18、移除 CloudWatch Alarm 預設通知動作
步驟 3. 新增名稱和描述
警示名稱: ithomeRequestPerTargetOutAlarm
警示描述 - 選用: ithome Step ScalingOut policy Alarm
步驟 4. 預覽並建立
再次確認資料是否正確
相同方法在建立另一個警示
閾值是每當 RequestCountPerTarget < 300
警示名稱: ithomeRequestPerTargetInAlarm
警示描述 - 選用: ithome Step ScalingIn policy Alarm
圖 19、新增Auto Scaling Group的擴展政策
建立擴展政策
a. 擴展設定
政策類型: 步進擴展
擴展政策名稱: ithomeRequestPerTargetOutPolicy
CloudWatch 警示: ithomeRequestPerTargetOutAlarm
採取行動: 新增
200 群組百分比
執行個體需求: 150 納入指標之前的暖機秒數
b. 縮減設定
政策類型: 步進擴展
擴展政策名稱: ithomeRequestPerTargetInPolicy
CloudWatch 警示: ithomeRequestPerTargetInAlarm
採取行動: 移除
50 群組百分比
圖 20、步進擴展政策擴展與縮減設定
透過 Jmeter 發出 1000 /每分及 3000 /每分的請求
圖 21、CloudWatch CloudWatch 擴展警示
因為請求數拉的很快,所以啟用的是步進擴展的第二個條件, RequestCountPerTarget >= 800 增加300%的目前群組百分比,從 2 -> 6
圖 22、Auto Scaling Group 活動歷史記錄-擴展
關閉 Jmeter 的請求
圖 23、CloudWatch CloudWatch 縮減警示