使用CodePipeline时如何控制ECS部署的内存和CPU占用空间

时间:2019-01-30 21:43:35

标签: amazon-ecs aws-codepipeline

TL; DR:在部署针对ECS的CodePipeline之后,如何更改内存和CPU要求(或指定ECS任务定义的任何详细信息)?

我创建了一个CodePipeline,用于部署ECS容器。为此,我的构建步骤生成了一个名为imagedefinitions.json的文件:

[
  {
    "name": "idws",
    "imageUri": "xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/xxx/idws-dev:latest"
  }
]

(XXX是为了保护隐私,但您知道了)。

但是,此图像定义文件不支持在ECS任务定义中找到的所有详细信息。它仅允许指定容器URI。任务配置来自哪里?

我发现特别奇怪的是,直到我在ECS中手动创建一个任务定义(该容器的名称与图像定义文件中显示的名称相同)之前,该管道根本无法工作。这种未记录的要求使我假设CodePipeline以某种方式从服务继承了任务定义详细信息,这很烦人,但并非不可能解决:除非您尝试更改任务定义,否则下次管道运行所有任务定义详细信息时,到创建管道时配置的任务定义。对于CodePipeline或ECS的说明,这些都无法解释。

4 个答案:

答案 0 :(得分:0)

在您的CodePipeline流程中,尝试插入一个阶段以部署声明ECS任务的Cloudformation堆栈。这样您的管道看起来就像

源->代码构建(构建并推送docker映像)->部署Cloudformation->部署ECS

这是一个不完整的模板:

    - Name: Build
      Actions:
        - Name: Build
          ActionTypeId:
            Category: Build
            Owner: AWS
            Version: 1
            Provider: CodeBuild
          Configuration:
            ProjectName: !Ref CodeBuildProject
          InputArtifacts:
            - Name: App
          OutputArtifacts:
            - Name: BuildOutput
          RunOrder: 1

    - Name: DeployCFN
      Actions:
        - Name: Deploy
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Provider: CloudFormation
            Version: '1'
          Configuration:
            ActionMode: CREATE_UPDATE
            Capabilities: CAPABILITY_IAM
            RoleArn: !GetAtt CloudformationRole.Arn
            StackName: 'ecs-task'
            TemplatePath: SourceOutput::ecs_template.yml
            ParameterOverrides: !Sub '{"Cpu": 512, "Memory: "2GB"}'
          InputArtifacts:
            - Name: SourceOutput
          RunOrder: 1

    - Name: DeployECS
      Actions:
        - Name: Deploy
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Version: 1
            Provider: ECS
          Configuration:
            ClusterName: !Ref Cluster
            ServiceName: !Ref Service
            FileName: images.json
          InputArtifacts:
            - Name: BuildOutput
          RunOrder: 1

ecs_template.yml看起来像这样:

Parameters:
  Cpu:
    Default: 1024
  Memory:
    Default: 1GB

Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ContainerDefinitions:
        - Cpu: !Ref Cpu
          Memory: !Ref Memory
          # ...

答案 1 :(得分:0)

我已经使用Codepipeline ECS在交叉帐户ECS集群中进行了大量部署。与您的设置不同的是,我在代码管道之前通过Terraform或Cloudformation创建了ECS集群(以及任务定义,服务,ECR存储库,ELB等)。

存在集群和任务定义后,代码管道仅更新任务定义中的“图像” URL,使用该定义创建新版本并部署新任务。

分别创建集群对我来说很有效,因为我不需要每次运行管道时都创建集群/服务/负载均衡器/自动扩展策略/规则等。这是我用来创建ECS cluster (& other things it needs)code pipeline的模板,如果有帮助的话!

答案 2 :(得分:0)

对我来说,唯一的方法是创建一个新的任务定义,因为部署管道将以该任务为基础。

答案 3 :(得分:0)

AWS CodePipeline ECS Deploy操作似乎正在查看与要部署到的服务相关的最新任务定义。这是基于以下实验:

  • 任务定义TDv1

    • 内存128mb
  • 通过代码管道部署

    • 创建任务定义TDv2
    • 内存128mb
  • 手动更新任务定义TDv3

    • 内存 256mb
  • 通过代码管道部署

    • 创建任务定义TDv4
      • 内存128mb 这是GOTCHA,它是从TDv2复制的
  • 手动更新任务定义TDv5

    • 内存 1024mb
  • 更新服务以使用TDv5

  • 通过代码管道部署

    • 创建任务定义TDv6
      • 内存1024mb 宾果,从TDv6复制