当需要在伸缩组中的ECS实例上持续部署业务应用(Continuous Deployment)时,可以使用弹性伸缩集成的应用发布功能。它能帮助您自动化发布应用,并结合弹性伸缩生命周期挂钩实现应用的自动发布和优雅下线。
概述
弹性伸缩(ESS)的应用发布功能将应用源文件和启动/停止脚本封装为部署物,并通过标准化的发布流程将其部署到伸缩组实例中。
支持的部署物类型
根据应用源文件的存储位置,可以选择不同的部署物类型:
类型 | 说明 | 适用场景 |
OSS文件 | 应用文件(如JAR/ZIP包)存储在OSS中。发布时自动下载并执行脚本。 | 传统应用部署,如Java应用。 |
ECS镜像 | 应用预装在ECS镜像中。发布时直接替换实例系统盘。 | 需要快速启动或环境复杂的应用。 |
Docker镜像 | 应用镜像存储在容器镜像服务ACR中。发布时自动拉取并启动容器。 | 容器化应用部署。 |
仅执行命令 | 不指定源文件,仅执行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 拉取镜像,然后先执行应用停止脚本停止上一版本的容器(如有),再执行应用启动脚本启动当前容器。
配置项:
Docker镜像信息:设置容器镜像服务地域、容器镜像服务实例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,查看每台实例的执行状态和详细的脚本输出日志。
如果部署失败了,会对现有实例有什么影响?
如果脚本执行失败,该实例的发布状态会显示为失败。对于分批发布且开启了每批暂停或第一批暂停的场景,后续批次将不会继续执行,从而控制影响范围。建议在发布前先通过灰度发布在少量实例上验证。
应用启动/停止脚本的执行目录在哪里?
脚本会在创建部署物时指定的工作目录执行。