
in4it/ecs-deployecs-deploy是一个用Go编写的REST API服务器,用于从任何地方部署ECS服务,通常作为部署流水线的一部分。由于Jenkins、CircleCI、Bitbucket等持续集成(CI)软件往往缺乏与ECS的原生集成,该API服务器可部署在ECS上,提供ECS的持续部署能力,解决CI工具与ECS集成不足的问题。
适用于需要将CI/CD流水线与AWS ECS集成的场景,特别是当现有CI工具缺乏原生ECS部署能力时。可用于自动化部署流程、管理ECS服务生命周期(部署、回滚、扩缩容)、监控服务状态和日志,以及配置自动扩缩容策略,适用于开发、测试和生产环境的ECS集群管理。
可从发布页面下载ecs-deploy和ecs-client,或使用Docker Hub镜像。
使用ecs-deploy可以引导新的ECS集群,自动设置自动扩缩组、ALB、IAM角色和ECS集群:
bash./ecs-deploy --bootstrap \ --alb-security-groups sg-*** \ # ALB安全组 --cloudwatch-logs-enabled \ # 启用CloudWatch日志 --cloudwatch-logs-prefix mycompany \ # CloudWatch日志前缀 --cluster-name mycluster \ # 集群名称 --ecs-desired-size 1 \ # ECS期望实例数 --ecs-max-size 1 \ # ECS最大实例数 --ecs-min-size 1 \ # ECS最小实例数 --ecs-security-groups sg-*** \ # ECS安全组 --ecs-subnets subnet-*** \ # ECS子网 --environment staging \ # 环境(如staging、prod) --instance-type t2.micro \ # 实例类型 --key-name mykey \ # SSH密钥名称 --load***-domain cluster.in4it.io \ # ALB域名 --paramstore-enabled \ # 启用参数存储 --paramstore-kms-arn aws:arn:kms:region:accountid:key/1234 \ # KMS ARN --paramstore-prefix mycompany \ # 参数存储前缀 --profile your-aws-profile \ # AWS凭证配置文件 --region your-aws-region # AWS区域(必填)
注意:需先创建安全组和VPC/子网。ALB安全组应允许80/443端口入站,ECS安全组应允许来自ALB的32768-61000端口流量。如需删除集群,将
--bootstrap替换为--delete-cluster。
也可通过Terraform部署ECS集群,详见Terraform模块文档。
使用ecs-client部署示例服务(如nginx和echoserver):
bash./ecs-client login --url [***]
bashECS_DEPLOY_LOGIN=deploy ECS_DEPLOY_PASSWORD=password ./ecs-client login --url [***]
bash./ecs-client deploy -f examples/services/multiple-services/multiple-services.yaml
AWS_REGION=region:AWS区域(必填)JWT_SECRET=secret:JWT加密密钥(必填)DEPLOY_PASSWORD=deploy:部署用户密码(必填)DEVELOPER_PASSWORD=developer:开发用户密码(必填)AWS_ACCOUNT_ENV=dev|staging|testing|qa|prod:AWS账户环境标识PARAMSTORE_ENABLED=yes:是否启用参数存储(默认:no)PARAMSTORE_PREFIX=mycompany:参数存储前缀(如设为mycompany,参数路径为/mycompany/服务名/变量)PARAMSTORE_KMS_ARN=:用于加密/解密参数的KMS ARNCLOUDWATCH_LOGS_ENABLED=yes:是否启用CloudWatch日志(默认:no)CLOUDWATCH_LOGS_PREFIX=mycompany:CloudWatch日志前缀LOAD***_DOMAIN=mycompany.com:负载均衡器域名DYNAMODB_TABLE=Services:存储服务信息的DynamoDB表名(默认:Services)ECR_SCAN_ON_PUSH=true:是否启用ECR镜像推送时扫描(默认:false)SAML_ENABLED=yes:启用SAML认证(默认:no)SAML_ACS_URL=[***]:SAML断言消费者服务URLSAML_CERTIFICATE=证书内容:SAML证书内容SAML_PRIVATE_KEY=私钥内容:SAML私钥内容SAML_METADATA_URL=[***]:身份提供商元数据URL生成SAML密钥和证书的命令:
bashopenssl req -x509 -newkey rsa:2048 -keyout myservice.key -out myservice.cert -days 3650 -nodes -subj "/CN=myservice.mycompany.com"
通过以下步骤启用自动扩缩容:
[***])| 环境变量 | 默认值 | 描述 |
|---|---|---|
| PARAMSTORE_ENABLED | no | 是否启用参数存储(使用"yes"启用) |
| PARAMSTORE_PREFIX | "" | 参数存储前缀(如设为mycompany,参数路径为/mycompany/服务名/变量) |
| PARAMSTORE_KMS_ARN | "" | 用于加密/解密参数的KMS ARN |
| PARAMSTORE_INJECT | no | 是否将密钥注入任务定义(使用"Yes"启用) |
| AUTOSCALING_STRATEGIES | LargestContainerUp,LargestContainerDown | 应用的自动扩缩容策略列表(见下方策略类型) |
| AUTOSCALING_DOWN_STRATEGY | gracefully | 缩容策略(目前仅支持gracefully:在执行缩容前检查资源使用情况) |
| AUTOSCALING_UP_STRATEGY | immediately | 扩容策略(immediately:立即扩容;gracefully:检查后扩容) |
| AUTOSCALING_DOWN_COOLDOWN | 5 | 缩容后冷却时间(分钟) |
| AUTOSCALING_DOWN_INTERVAL | 60 | 缩容检测后,检查资源使用情况的时间间隔(秒) |
| AUTOSCALING_DOWN_PERIOD | 5 | 缩容前检查资源使用情况的周期数 |
| AUTOSCALING_UP_COOLDOWN | 5 | 扩容后冷却时间(分钟) |
| AUTOSCALING_UP_INTERVAL | 60 | 扩容检测后,检查资源使用情况的时间间隔(秒) |
| AUTOSCALING_UP_PERIOD | 5 | 扩容前检查资源使用情况的周期数 |
| SERVICE_DISCOVERY_TTL | 60 | 服务发现记录的TTL(秒) |
| SERVICE_DISCOVERY_FAILURETHRESHOLD | 3 | 服务发现记录的故障阈值 |
| AWS_RESOURCE_CREATION_ENABLED | yes | 是否允许ecs-deploy自动创建AWS IAM资源 |
| SLACK_WEBHOOKS | "" | 逗号分隔的Slack Webhook(可选指定频道,格式:url1:#channel,url2:#channel) |
| SLACK_USERNAME | ecs-deploy | Slack通知用户名 |
| ECS_TASK_ROLE_PERMISSION_BOUNDARY_ARN | "" | ECS任务角色的权限边界ARN |
| ECR_SCAN_ON_PUSH | false | 是否启用ECR镜像推送时扫描 |
| DEPLOY_MAX_WAIT_SECONDS | 900 | 部署超时等待时间(秒,默认15分钟) |
| 策略名称 | 描述 |
|---|---|
| LargestContainerUp | 当集群中最大容器(含缓冲)无法在现有节点上调度时触发扩容 |
| LargestContainerDown | 当移除一个节点后仍有足够容量容纳最大容器(含缓冲)时触发缩容 |
| Polling | 每分钟轮询所有服务,检查是否因资源不足导致任务无法调度(每秒最多1次调用,每次10个服务) |



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