您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關AWS如何配置AutoScaling來實現高可用的彈性計算服務,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
AWS 是亞馬遜云計算平臺。
EC2 是 AWS 提供的云主機,一般采用基于 CentOS 的 Amazon Linux 系統,像大多數云主機一樣使用。
ELB 是 AWS 提供的負載均衡服務,可以將請求轉發到目標組中的某個 EC2 實例,也會對目標組實例進行健康檢查,只將請求轉發到健康的實例。
AWS AutoScaling 服務允許我們設定 AutoScaling 組(ASG)。ASG 維護了一組 EC2 實例,EC2 實例可以分布在不同的可用區里以保證可用性。AutoScaling 能檢查實例健康狀況,自動替換不健康的實例,能根據特定規則增減需要的實例數量,并能在啟動、銷毀 EC2 實例時觸發事件調用其他服務。AutoScaling 服務能夠與 ELB 彈性負載均衡服務結合使用,實例不需要公網 IP,而且實例在啟動后會自動加入 ELB 的目標組,在終止實例前會先等待 ELB 連接耗盡。
我們要實現的結構如圖所示:
看上去夢寐以求,但用起來卻沒有這么舒服。
我們需要給 ASG 提供啟動配置(Launch Configuration),啟動配置里指定了 EC2 的實例類型、AMI 鏡像、存儲設備、IAM 角色、SSH Key、用戶數據(User Data)等一系列信息,用于啟動新實例。
我們主要關心 IAM 角色和啟動腳本,其他的按需配置。
用戶數據實際上是啟動腳本,當 EC2 實例啟動時,在初始化的最后以 root 身份將用戶數據作為腳本執行。你可以登錄實例,在 /var/log/cloud-init-output.log
日志尾查看其輸出。
因為每次修改啟動配置都需要重新創建 ASG,而這就需要清空實例等十分繁瑣,所以最好將用戶數據設置為從外部獲取真正的啟動腳本來運行,以便修改調試:
#!/usr/bin/env bash aws s3 cp s3://bucket/key /tmp/myscript.sh && chmod +x /tmp/myscript.sh && /tmp/myscript.sh
這需要給 EC2 的 IAM 角色允許 S3 訪問權限。
我們根據啟動配置創建 ASG,設定最低、最高、所需的實例數量,將實例連接到特定的 ELB 目標組,以 ELB 的健康檢查作為 ASG 中實例的健康依據等等。
不健康的實例在健康檢查失敗且等待超時后將被終止。具體請參考 ASG 中實例的運行狀況檢查。
ASG 中實例有生命周期的概念,也就是實例有一個狀態,并在不同的狀態間轉移。
ASG 中實例的生命周期如圖所示:
在啟動的 Pending 和終止的 Terminating 狀態均可以添加鉤子,鉤子會觸發事件,并等待事件完成再進入下一狀態(當沒有鉤子時實例會自動跳到下一狀態)。鉤子能設置超時時限、超時結果。
可以使用 aws-cli 或 AWS SDK 等主動完成生命周期事件,或延期它。事件完成需要提供結果,主動完成和超時均有“繼續”和“放棄”兩種結果可選。
可以給啟動或終止階段添加多個鉤子,他們會在上一個鉤子完成且結果為“繼續”后依次執行。在啟動階段一旦出現“放棄”的結果后,實例會跳過其他鉤子,直接開始終止過程,這也會觸發終止階段的鉤子;在終止階段出現“放棄”的結果后,實例會跳過其他鉤子,直接終止。
使用 aws autoscaling put-lifecycle-hook
命令添加溝子,有兩種可選的 transition 值:
autoscaling:EC2_INSTANCE_LAUNCHING
實例啟動時
autoscaling:EC2_INSTANCE_TERMINATING
實例終止時
下面這個命令的例子演示了添加“啟動時鉤子,超時時限 600s,超時后放棄該實例”:
aws autoscaling put-lifecycle-hook \ --auto-scaling-group-name ${ASG} \ --lifecycle-hook-name ${HOOK} \ --lifecycle-transition "autoscaling:EC2_INSTANCE_LAUNCHING" \ --heartbeat-timeout 600 \ --default-result "ABANDON"
如果使用了下文的 SNS 或 SQS 接收事件,還需要提供 role-arn
和 notification-target-arn
。AWS 提供了比較完整的文檔 添加生命周期鉤子 來講述這一過程。
使用 aws autoscaling complete-lifecycle-action
命令可以主動完成事件,使生命周期繼續(CONTINUE
)或放棄(ABANDON
),根據你獲得的信息,提供 instance-id
、lifecycle-action-token
任一即可:
下面這個命令的例子演示了“完成 ${ASG}
組的實例 ${INSTANCE_ID}
上的 ${HOOK}
事件,結果為繼續”:
aws autoscaling complete-lifecycle-action \ --auto-scaling-group-name ${ASG} \ --lifecycle-hook-name ${HOOK} \ --instance-id ${INSTANCE_ID} \ --lifecycle-action-result CONTINUE
命令 aws autoscaling record-lifecycle-action-heartbeat
可以重置超時時間,使用方法類似于上文所述的 complete-lifecycle-action
。
注意,如果希望 EC2 之上的腳本來執行上述操作,需要給 EC2 的 IAM 角色允許 autoscaling:CompleteLifecycleAction
或 autoscaling:RecordLifecycleActionHeartbeat
權限。
EC2 實例如何獲取自身的 instance-id 呢?
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) ASG=$(aws autoscaling describe-auto-scaling-instances --output text --query 'AutoScalingInstances[?InstanceId==`'${INSTANCE_ID}'`].AutoScalingGroupName')
具體請參考 檢索實例元數據 和 控制 aws-cli 的命令輸出。
AWS 允許鉤子觸發后向外傳播這一事件,有三種方式——通過 CloudWatch Events、SNS 或者 SQS。他們會攜帶足夠的信息,具體的攜帶數據請參考 AutoScaling 事件。
具體配置如果有疑問,請參考 添加生命周期鉤子 中《向 Auto Scaling 組添加生命周期掛鉤》節的前兩步。
事件被傳播后,一般使用 Amazon Lambda 或者額外的服務器來處理。同樣注意,如果希望 Lambda 報告事件完成或延期,請給 Lambda 的 IAM 角色允許相應權限。
很多時候我們需要在 EC2 實例上執行腳本,這方面的內容請參見這篇博客 AWS 使用 Simple System Manager 向 EC2 發送命令遠程執行腳本。
在實例啟動時,我們一般不把事件傳播出去交由 Lambda 處理,而是由用戶數據里的啟動腳本在執行結束后自行報告事件完成(繼續),或者通知 SQS、SNS、Lambda 等來做。
因為在實例啟動時我們需要手動安裝 SSM Agent,此時該服務對外界而言不可用。所以我們不能用這種方式來與 EC2 通信。
在實例終止時,我們一般用 Lambda 處理,并用 SSM 通知 EC2 執行回收腳本,回收腳本自行報告事件完成(繼續),如果 SSM 失敗,再由 Lambda 報告事件完成(放棄)。
AWS 提供了多種 擴展 ASG 的大小 的策略。
這里我們提供兩個簡單的手工策略來擴展 ASG 的大小:
aws autoscaling put-scaling-policy \ --auto-scaling-group-name ${ASG} \ --policy-name "inc" \ --policy-type "SimpleScaling" \ --adjustment-type "ChangeInCapacity" \ --scaling-adjustment 1 aws autoscaling put-scaling-policy \ --auto-scaling-group-name ${ASG} \ --policy-name "dec" \ --policy-type "SimpleScaling" \ --adjustment-type "ChangeInCapacity" \ --scaling-adjustment -1
現在我們獲得了高可用的彈性計算服務,配置過程很復雜,最好能夠采用 CloudFormation 來配置,或者使用 aws-cli 編寫腳本來完成。
上述就是小編為大家分享的AWS如何配置AutoScaling來實現高可用的彈性計算服務了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。