【问题标题】:AWS ECS - Ways to deploy containersAWS ECS - 部署容器的方法
【发布时间】:2017-07-30 11:49:09
【问题描述】:
用例就像 - 开发人员进行了一些代码更改,以下事情会自动发生 -
构建运行、创建应用程序工件、使用工件生成 Docker 映像、推送到 Docker 注册表的映像、更新 AWS ECS 任务和 ECS 服务。
我想知道实现上述AWS ECS服务更新自动化的方法有哪些。到目前为止,我已经使用 -
从 Jenkins 构建中实现了 AWS ECS 更新
1>从 Jenkins 运行构建后 AWS CLi 脚本以更新 ECS
2>发布构建操作或管道步骤以调用 AWS Lambda 函数。我在 Java 中创建了一个 Lambda 函数来实现它。
请告诉我我们可以实现上述目标的其他方法。谢谢。
【问题讨论】:
标签:
amazon-web-services
amazon-ec2
aws-lambda
aws-cli
amazon-ecs
【解决方案2】:
您可以使用调用 aws cli 命令的 shell 脚本来创建 cloudformation 堆栈,或者直接在 aws cli 中为 ECR 存储库、任务定义、事件规则和目标调用创建命令(用于调度)。
然后您只需在终端上使用以下命令调用此脚本:./setup.sh,它应该会立即执行您的所有命令。
aws ecr create-repository \
--repository-name tasks-${TASK_NAME}-${TASK_ENV} \
;
或者如果您想通过 cloudformation 模板设置资源,只要模板存在于 file://name.yml,您就可以使用此命令启动它们:
aws cloudformation create-stack \
--stack-name stack-name \
--capabilities CAPABILITY_IAM \
--template-body file://name.yml \
--parameters
ParameterKey=ParamName,ParameterValue=${PARAM_NAME} \
;
【解决方案4】:
虽然市面上有大量 CI/CD 工具,但由于我处于部署初期,所以我决定编写一个小脚本,而不是让 CI/CD 管道来完成。
这是我编写的一键部署脚本,使用ecs-deploy script作为依赖项来实现将docker镜像滚动部署到ECS。
您可以从您的开发或构建/部署框本地运行它,或者使用 Jenkins 或一些本地构建工具。
#!/bin/bash
# automatically login to AWS
eval $(aws ecr get-login)
# build local docker image and push repo to AWS
docker build -t <yourlocaldockerimagetag> .
docker tag <yourlocaldockerimagetag>:latest <yourECSRepoURL>:latest
docker -D -l debug push <yourECSRepoURL>:latest
# deploy to ECS
ecs-deploy/ecs-deploy -m 50 -k <access-key> -s <secret-key> -r <aws-region> -c <cluster-name> -n <service-name> -i <yourECSRepoURL>:latest
参数:
-
cluster-name:您在 ECS 中的集群名称
-
service-name:您在 ECS 中创建的服务名称
-
yourECSRepoURL:ECS 存储库 URL
-
yourlocaldockerimagetag:任何本地镜像标签名称
-
access-key:您的 AWS 部署访问密钥
-
secret-key:您的 AWS 密钥
确保在此脚本之前安装ecs-deploy。
-m 50 告诉它即使节点数量下降到 50% 也可以部署。理想情况下,您应该有一个额外的节点来进行部署,但如果您负担不起该设置,这将确保部署继续进行。
如果您还使用 ELB(负载均衡器),则目标组的默认注销延迟为 5 分钟,这有点过长。注销延迟是在 ECS 向您的 docker 容器发送 SIGTERM 或 SIGINT 之前等待现有请求完成的时间。您应该通过转到 EC2 仪表板中的 Target Groups 来降低此值,然后单击 Edit Attributes 进行编辑。否则您的部署可能需要很长时间。
【解决方案5】:
我想没有人提到过 AWS 的 CodePipeline,它真的很容易与包括 ECS 和 CodeCommit 在内的许多 AWS 服务集成:
- 将提交推送到 CodeCommit 存储库,触发管道执行。
- (可选)配置需要您在构建之前执行操作的手动批准步骤。
- 运行 CodeBuild 项目以构建您的 Dockerfile 并将映像推送到 ECR 存储库。
- 运行部署到特定 ECS 服务的“部署”步骤。它使用指向新 ECR 映像的新任务定义更新服务。
我也将此流程与 BitBucket 一起使用,只需配置一个 BitBucket 管道,将所有新代码推送到 CodeCommit 存储库作为上一步。