當需要在伸縮組中的ECS執行個體上持續部署業務應用(Continuous Deployment)時,可以使用Auto Scaling整合的應用發布功能。它能協助您自動化發布應用,並結合Auto Scaling生命週期掛鈎實現應用的自動發布和優雅下線。
概述
Auto Scaling(ESS)的應用發布功能將應用源檔案和啟動/停止指令碼封裝為部署物,並通過標準化的發布流程將其部署到伸縮組執行個體中。
支援的部署物類型
根據應用源檔案的儲存位置,可以選擇不同的部署物類型:
類型 | 說明 | 適用情境 |
OSS檔案 | 應用檔案(如JAR/ZIP包)儲存在OSS中。發布時自動下載並執行指令碼。 | 傳統應用部署,如Java應用。 |
ECS鏡像 | 應用預裝在ECS鏡像中。發布時直接替換執行個體系統硬碟。 | 需要快速啟動或環境複雜的應用。 |
Docker鏡像 | 應用鏡像儲存在Container RegistryACR中。發布時自動拉取並啟動容器。 | 容器化應用部署。 |
僅執行命令 | 不指定源檔案,僅執行Shell指令碼。 | 靈活的指令碼化部署,或使用第三方源。 |
發布能力
發布模式:支援全量發布(所有執行個體)和灰階發布(手動選擇部分執行個體驗證)。
分批控制:支援設定發布批次,並可配置批次間暫停,降低發布風險。
彈性整合:
擴容自動發布:新擴容的執行個體會自動部署最新版本的應用,確保版本一致性。
縮容優雅下線:縮容前先執行停止指令碼,確保業務處理完畢後再釋放執行個體。
使用限制
執行個體系統:僅支援 Linux 系統的 ECS 執行個體。
指令碼語言:啟動和停止指令碼僅支援 Shell 指令碼。
部署流程:遵循先停後啟原則,每次部署都會先執行停止指令碼,確保上一次部署的應用版本被正常停止,再執行啟動指令碼。
資料風險:使用ECS鏡像類型部署時,會替換執行個體的系統硬碟,請務必提前備份重要資料。
建立部署物
- 在左側導覽列中,單擊伸縮組管理。
- 在頂部功能表列處,選擇地區。
單擊伸縮組ID進入伸縮組詳情頁,單擊。
根據應用情境選擇合適的部署物類型進行配置。
OSS檔案
適用於將應用程式套件(如 JAR、WAR、ZIP)儲存在 OSS 的情境。發布時,系統會自動下載檔案到指定工作目錄,然後先執行應用停止指令碼停止上一版本的應用(如有),再執行應用啟動指令碼啟動當前應用。
配置項:
OSS資訊:選擇OSS地區、OSS Bucket,並在OSS檔案配置項填寫檔案在Bucket中的路徑(如
apps/sample-spring-1.0-SNAPSHOT.jar)。內網下載:如果 ECS 執行個體與OSS在同一地區,建議開啟此選項以提升下載速度。
啟動/停止指令碼樣本:
應用啟動指令碼:
start_application() { set -e yum install -y maven-3.5.4 java -jar ./sample-spring-1.0-SNAPSHOT.jar & } start_application應用停止指令碼:
重要如不需要停止應用相關操作,可將停止指令碼置空,部署時會跳過。
### Stop the application (if any) stop_application() { PID=$(ps -ef | grep "sample-spring-1.0-SNAPSHOT.jar" | grep -v "grep" | awk '{print $2}') if [ -n "$PID" ]; then kill -9 $PID fi } stop_application
ECS鏡像
適用於應用環境複雜或啟動時間要求極高的情境。發布時,系統會將伸縮組內執行個體的系統硬碟替換為指定的鏡像。
選擇ECS鏡像部署物時,需單擊新增按鈕後,選擇伸縮組所在地區下的鏡像。
配置項:
地區:選擇與伸縮組相同的地區。
鏡像ID:選擇與伸縮組所在地區一致的自訂鏡像(包含已部署好的應用)。
重要ECS鏡像部署物不支援配置應用啟動/停止指令碼,如需應用自動啟動,請配置應用的開機自啟動或手動設定生命週期掛鈎實現。
Docker鏡像
適用於容器化應用。發布時,系統會自動從 ACR 拉取鏡像,然後先執行應用停止指令碼停止上一版本的容器(如有),再執行應用啟動指令碼啟動當前容器。
重要僅支援選擇Container RegistryACR企業版中的Docker鏡像,對於個人版ACR或第三方鏡像倉庫,通過僅執行命令部署物進行部署。
配置項:
Docker鏡像資訊:設定Container Registry地區、Container Registry執行個體ID、命名空間、倉庫名稱、鏡像版本等資訊。
內網拉取:如果要使用內網連結拉取鏡像,請確保您的鏡像倉庫和ECS執行個體在同一個VPC內,具體請參考配置專用網路的存取控制。
啟動/停止指令碼:
應用啟動指令碼:
重要請確保待發布機器上已安裝Docker。
發布時,Docker鏡像會在指令碼執行前被自動拉取到ECS執行個體上,指令碼中無需做拉取鏡像相關操作。
### 發布時,Docker鏡像會被自動拉取到ECS上,可直接進行容器啟動操作。 ### 啟動目前的版本的容器 ### 使用時,需將<image_name>替換為實際鏡像地址 start_application() { image_name="<image_name>" container_name="my-container" docker run -d -p 8080:8080 --name ${container_name} ${image_name} } start_application應用停止指令碼:
重要如果不需要停止應用相關操作,可將停止指令碼置空,部署時會跳過。
stop_application() { # 通過容器名查詢容器是否存在,如存在則刪除容器 container_name="my-container" container_id=$(docker ps -aq -f name=${container_name}) if [ -n "$container_id" ]; then docker rm -f $container_id fi } stop_application
僅執行命令
適用於無需特定源檔案,僅通過 Shell 指令碼進行部署的情境(如從第三方源下載代碼)。發布時,系統會先執行應用停止指令碼停止上一版本的應用(如有),再執行應用啟動指令碼啟動當前應用。
配置項:無需配置部署物源,僅需指定工作目錄。
啟動/停止指令碼樣本(以拉取公用鏡像為例):
應用啟動指令碼:
### 啟動目前的版本的應用 start_application() { repo="<repo>" image="<image>" container_name="my-container" docker login --username=${username} --password=${password} $repo docker pull $image docker run -d -p 8080:8080 --name $container_name $image } start_application應用停止指令碼:
重要如果不需要停止應用相關操作,可將停止指令碼置空,部署時會跳過。
### 停止容器(如果有) ### Stop the container (if any) stop_application() { # 通過容器名查詢容器是否存在,如存在則刪除容器 # Query whether the container exists by the container name, and delete the container if it exists container_name="my-container" container_id=$(docker ps -aq -f name=${container_name}) if [ -n "$container_id" ]; then docker rm -f $container_id fi } stop_application
完成配置後,單擊建立並發布或僅建立。
單擊建立並發布後,會繼續進入部署物發布配置。
部署物發布
應用於生產環境
為了保障生產環境的穩定性,建議遵循以下最佳實務:
降低發布風險:
優先使用灰階發布在少量執行個體上驗證新版本。
全量發布時,建議開啟分批發布並選擇第一批暫停。待第一批執行個體發布成功並驗證無誤後,再繼續後續批次。
保障商務持續性:可開啟縮容時優雅下線,並在部署物中編寫完善的停止指令碼(如等待請求處理完畢、關閉串連),避免縮容導致業務中斷。
確保版本一致性:可開啟擴容時自動發布,防止伸縮組自動擴容出的新執行個體運行舊版本應用。
常見問題
應用發布功能支援 Windows 執行個體嗎?
不支援。目前僅支援 Linux 系統的 ECS 執行個體。
發布過程中,伸縮組還會觸發擴縮容嗎?
會。應用發布過程不會阻斷伸縮活動。
如何查看應用發布的日誌和結果?
發布任務開始後,您可以在部署物發布列表中點擊執行ID,查看每台執行個體的執行狀態和詳細的指令碼輸出日誌。
如果部署失敗了,會對現有執行個體有什麼影響?
如果指令碼執行失敗,該執行個體的發布狀態會顯示為失敗。對於分批發布且開啟了每批暫停或第一批暫停的情境,後續批次將不會繼續執行,從而控制影響範圍。建議在發布前先通過灰階發布在少量執行個體上驗證。
應用啟動/停止指令碼的執行目錄在哪裡?
指令碼會在建立部署物時指定的工作目錄執行。