【问题标题】: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


【解决方案1】:

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

部署流程大致如下:

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

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

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

【讨论】:

    【解决方案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} \
    ;
    

    【讨论】:

      【解决方案3】:

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

      您可以构建自己的管道

      1. 构建步骤
      2. 推送到注册表
      3. 部署到 ECS

      就这么简单

      【讨论】:

        【解决方案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 服务集成:

          1. 将提交推送到 CodeCommit 存储库,触发管道执行。
          2. (可选)配置需要您在构建之前执行操作的手动批准步骤。
          3. 运行 CodeBuild 项目以构建您的 Dockerfile 并将映像推送到 ECR 存储库。
          4. 运行部署到特定 ECS 服务的“部署”步骤。它使用指向新 ECR 映像的新任务定义更新服务。

          我也将此流程与 BitBucket 一起使用,只需配置一个 BitBucket 管道,将所有新代码推送到 CodeCommit 存储库作为上一步。

          【讨论】:

            【解决方案6】:

            正如@minamiyojo 和@astav 所回答的那样,我们最终将 ecs-deploy 与模板引擎结合起来,通过一些可重用的组件来增强我们的 CD 管道,我们也刚刚开源:

            https://github.com/GuccioGucci/yoke

            请参阅 README 中的动机部分,希望这对您的方案也有帮助。

            【讨论】:

              猜你喜欢
              • 2018-04-13
              • 2020-11-22
              • 2020-10-08
              • 2023-03-15
              • 1970-01-01
              • 1970-01-01
              • 2021-01-24
              • 2023-01-22
              • 2017-12-30
              相关资源
              最近更新 更多