AWS ECS - 部署容器的方法

时间:2017-03-09 13:08:40

标签: amazon-web-services amazon-ec2 aws-lambda aws-cli amazon-ecs

用例就像 - 开发人员进行一些代码更改,以下事情自动发生 - 构建运行,创建应用程序工件,使用工件生成docker镜像,将图像推送到Docker注册表,更新AWS ECS任务和ECS服务。

我想知道实现上述AWS ECS服务更新自动化的方法是什么。到目前为止,我已使用 -
实现了Jenkins构建的AWS ECS更新 1>从Jenkins运行后构建AWS CLi脚本以更新ECS
2>发布构建操作或管道步骤以调用AWS Lambda函数。我用Java创建了一个Lambda函数来实现它。

请让我以其他方式实现上述目标。谢谢。

4 个答案:

答案 0 :(得分:2)

我不断将Docker容器从CircleCI部署到AWS ECS。

部署流程概述如下:

  1. 构建并标记新的Docker镜像
  2. 登录AWS ECR并推送图片
  3. 使用ecs-deploy
  4. 更新ECS的任务定义和服务

    ecs-deploy是一个有用的脚本,用于更新ECS中的Docker镜像。

    https://github.com/silinternational/ecs-deploy

答案 1 :(得分:0)

看看Codefresh - https://docs.codefresh.io/docs/amazon-ecs

您可以构建管道

  1. 构建步骤
  2. 推送到注册表
  3. 深入ECS
  4. 那很容易

答案 2 :(得分:0)

虽然有大量的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

参数:

  • 群集名称:您在ECS中的群集名称
  • 服务名称:您在ECS中创建的服务名称
  • yourECSRepoURL :ECS存储库网址
  • yourlocaldockerimagetag :任何本地图片标记名称
  • access-key :您的部署AWS访问密钥
  • 密钥:您的AWS密钥

确保在此脚本之前安装ecs-deploy

-m 50告诉它即使节点数下降到50%也可以部署。理想情况下,您可以使用额外的节点进行部署,但如果您无法承担此设置,则可确保部署继续进行。

如果您还使用ELB(负载均衡器),则目标组的默认注销延迟为5分钟,这有点过分。注销延迟是在ECS向您的docker容器发送SIGTERM或SIGINT之前等待现有请求完成的时间。您应该通过转到EC2仪表板中的目标组并单击编辑属性进行编辑来降低此值。否则,您的部署可能需要永远。

答案 3 :(得分:0)

您可以使用Shell脚本来调用aws cli命令来创建cloudformation堆栈,也可以直接在aws cli中调用ECR存储库,任务定义,事件规则和target(用于计划)的create命令。

如果您随后仅使用以下命令在终端上调用此脚本:./setup.sh,它将立即执行所有命令。

aws ecr create-repository \
    --repository-name tasks-${TASK_NAME}-${TASK_ENV} \
;

或cloudformation:

aws cloudformation create-stack \
    --stack-name stack-name \
    --capabilities CAPABILITY_IAM \
    --template-body file://name.yml \
    --parameters
        ParameterKey=ParamName,ParameterValue=${PARAM_NAME} \
;