silintl/ecs-deployecs-deploy是一个用于在Amazon EC2容器服务(ECS)上实现自动蓝绿部署的脚本。它通过操作ECS的任务定义(Task Definition)和服务(Service)实体,实现零停机部署,确保新任务正常运行后再替换旧任务。
以下参数为部署所必需,部分可通过环境变量设置:
| 参数 | 描述 |
|---|---|
-k | --aws-access-key | AWS访问密钥ID,也可通过环境变量AWS_ACCESS_KEY_ID设置 |
-s | --aws-secret-key | AWS密钥,也可通过环境变量AWS_SECRET_ACCESS_KEY设置 |
-r | --region | AWS区域名称,也可通过环境变量AWS_DEFAULT_REGION设置 |
-p | --profile | AWS配置文件名称,设置后无需单独提供访问密钥和区域 |
--aws-instance-profile | 使用当前AWS实例关联的IAM角色,仅在AWS实例内部使用,设置后无需提供访问密钥 |
-c | --cluster | ECS集群名称 |
-n | --service-name | 要部署的服务名称(与-d二选一) |
-d | --task-definition | 要部署的任务定义名称(与-n二选一) |
-i | --image | 要运行的Docker镜像名称,格式:[域名][:端口][/仓库][/][镜像][:标签],例如:mariadb:latest、private.registry.com/repo/image:tag |
| 参数 | 描述 |
|---|---|
-a | --aws-assume-role | 用于ecs-deploy操作的AWS角色ARN |
-D | --desired-count | 服务中要保持运行的任务实例数量 |
-m | --min | 部署期间运行中任务的最小健康百分比(默认:100) |
-M | --max | 部署期间运行中任务的最大百分比(默认:200) |
-t | --timeout | 部署超时时间(默认:90秒) |
-e | --tag-env-var | 从环境变量获取镜像标签,覆盖-i中指定的标签 |
-to | --tag-only | 应用于任务中所有镜像的新标签,覆盖-i中指定的标签(适用于多容器任务) |
--max-definitions | 保留的任务定义修订版数量,超过则注销最旧版本(需≥1,仅在部署成功后执行) |
--task-definition-file | 用作部署任务定义的文件路径 |
--enable-rollback | 若超时前新版本未运行,则回滚任务定义 |
--use-latest-task-def | 使用最新创建的任务定义作为基础,而非最后使用的版本 |
--force-new-deployment | 强制服务进行新部署(默认:false) |
--skip-deployments-check | 跳过部署检查,适用于需要长时间终止旧任务的服务 |
--run-task | 立即运行创建的任务,设置后无需提供服务名称 |
--wait-for-success | 等待任务执行完成并返回退出码0 |
--launch-type | 任务启动类型(参考AWS ECS文档) |
--platform-version | Fargate平台版本(参考AWS ECS文档) |
--network-configuration | 任务网络配置(awsvpc网络模式必需,参考AWS ECS文档) |
--copy-task-definition-tags | 将现有任务定义标签复制到新修订版 |
-v | --verbose | 详细输出模式 |
--version | 显示版本信息 |
bashecs-deploy -c production1 -n doorman-service -i docker.repo.com/doorman:latest
bashecs-deploy -k ABC123 -s SECRETKEY -r us-east-1 -c production1 -n doorman-service -i docker.repo.com/doorman -m 50 -M 100 -t 240 -D 2 -e CI_TIMESTAMP -v
bashecs-deploy -d open-door-task -i docker.repo.com/doorman:17
bashecs-deploy -p PROFILE -c production1 -n doorman-service -i docker.repo.com/doorman -t 240 -e CI_TIMESTAMP -v
bashecs-deploy -c staging -n core-service -to 0.1.899 -i ignore
--use-latest-task-def获取最新创建的任务定义)即使任务定义内容未变更,ECS服务仍会执行蓝绿部署。脚本通过更新容器镜像标签确保部署的差异性,支持静态标签(如
latest)或动态标签(如CI构建时间戳)。
以下是适用于ecs-deploy的IAM策略示例:
json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DeregisterTaskDefinition", "ecs:DescribeServices", "ecs:DescribeTaskDefinition", "ecs:DescribeTasks", "ecs:ListTasks", "ecs:ListTaskDefinitions", "ecs:RegisterTaskDefinition", "ecs:StartTask", "ecs:StopTask", "ecs:UpdateService", "iam:PassRole" ], "Resource": "*" } ] }
"You must specify a region"的错误,需检查环境变量或参数是否正确设置AWS访问密钥、密钥和区域。-t(超时时间)参数值,或使用--skip-deployments-check跳过部署检查。使用bats进行自动化测试,主要验证本地数据解析和处理逻辑。新功能或PR应尽可能提供测试用例。
可集成到Github Actions工作流中,示例配置如下:
yamldeploy_to_ecs: name: '通过蓝绿部署将更新的容器镜像部署到ECS服务' runs-on: ubuntu-18.04 steps: - uses: silinternational/ecs-deploy@master env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: 'us-east-1' with: aws_access_key_cmd: '--aws-access-key' aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} aws_secret_key_cmd: '--aws-secret-key' aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} cluster_cmd: '--cluster' cluster: 'cluster-name' image_cmd: '--image' image: '{amazon_id}.dkr.ecr.us-east-1.amazonaws.com/cluster-name/image_name:latest' region_cmd: '--region' region: 'us-east-1' service_name_cmd: '--service-name' service_name: 'aws-service-name' timeout_cmd: '--timeout' timeout: '360'




manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务