如何使用AWS CodePipeline更新ECS上的容器服务

时间:2017-12-02 23:31:46

标签: amazon-web-services amazon-ec2 amazon-ecs

我在ECS上有一个集装箱服务集群。我已经设置了CodePipeline以在更新上构建新容器并将其推送到ECR。如何触发对群集的更新以使用新更新的容器?

4 个答案:

答案 0 :(得分:1)

AWS CodePipeline现在支持直接部署到ECS。您可以使用新的ECS部署操作来更新ECS服务以使用您创建的新容器映像。您需要修改构建步骤以输出包含您构建的新映像的映像URL的配置文件。更多细节可以在https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cd-pipeline.html

找到

答案 1 :(得分:0)

由于您使用CodePipeline,因此在构建新映像后可能会触发CloudFromation堆栈。然后,CloudFormation堆栈将创建新的任务定义并更新您的ECS服务。这是一个参考架构。

enter image description here

您可以使用this参考架构进行持续部署。 CloudFormation模板附加在上面的Github仓库中。

答案 2 :(得分:0)

我以为我将使用bitbucket-pipelines添加我的解决方案,从技术上讲,我不知道该问题不会直接回答问题,但是bitbucket管道步骤中的命令实际上与buildspec.yml相同(不过请检查docs以获取buildspec.yml)用于代码管道。

我觉得我应该补充一点,aws在aws控制面板中的GUI上为代码行做了出色的工作,现在确实很简单,可以为您处理部署和任务定义的创建。

希望将JIRA及其部署功能等工具与JIRA任务相集成的人们,将需要使用位桶管道!

options:
  docker: true
  size: 2x

pipelines:
  tags:
    build-*:
      - step: 
          name: build app
          image: node:10.15.0
          script:
            - npm i
            - npm run build
          artifacts:
            - node_modules/** 
            - dist/**



     - step:
       name: push to aws staging
       # integrate with JIRA <3
       deployment: staging
       image: atlassian/pipelines-awscli:latest
       services:
         - docker
       script:
         # command line JSON processor plugin (important)
         - apk add jq          

         # standard docker login and build
         - eval $(aws ecr get-login --no-include-email)
         - docker build --build-arg notProduction=true -t app:staging .
         - docker tag app:staging ${secretUrl}.amazonaws.com/app:staging
         - docker push ${secretUrl}.amazonaws.com/app:staging

         # gets the latest task definition
         - export TASK_DEF=$(aws ecs describe-task-definition --task-definition "app-staging")

         # gets the specific containerDefinitions array and exports to a json format which is needed for the register-task-definition function
         - export CONTAINER_DEFS=$(echo $TASK_DEF | jq '.taskDefinition.containerDefinitions' | awk -v ORS= -v OFS= '{$1=$1}1')

         # creates a new task definition from the previous definition details
         - aws ecs register-task-definition --family "app-staging" --container-definitions $CONTAINER_DEFS

         # updates ecs
         - aws ecs update-service --cluster "toolkit" --service "app-staging" --task-definition "app-staging"
       artifacts:
         - node_modules/**
         - dist/**

答案 3 :(得分:0)

如果可以将容器更新为新的:latest映像,则在部署之前停止ECS群集的任务就可以了。

在AWS CodeBuild阶段的buildspec.yml中添加

aws ecs list-tasks --cluster "ECS_CLUSTER_NAME" --output text | awk '{print $2}' | while read line ; do aws ecs stop-task --task "$line" --cluster "ECS_CLUSTER_NAME" ; done

在您的post_build命令之后的commands docker push...部分中,以ECS群集的名称代替ECS_CLUSTER_NAME。

容器将被停止。 ECS将使用您新创建的docker映像来完成所需的任务。

P.S。不要忘记检查IAM,以便您的CodeBuild用户角色有权执行ecs:*命令。