Как мне управлять объемом памяти и ЦП развертывания ECS при использовании CodePipeline - PullRequest
0 голосов
/ 31 января 2019

TL; DR: Как изменить требования к памяти и процессору (или указать какие-либо подробности определения задачи ECS) после развертывания CodePipeline, нацеленного на 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 голосов
/ 13 августа 2019

Действие AWS CodePipeline ECS Deploy, похоже, рассматривает самое последнее определение задачи, связанное с развертываемой службой.Это основано на следующем эксперименте:

  • Определение задачи TDv1

    • Память 128 МБ
  • Развертываниечерез конвейер кода

    • Создает определение задачи TDv2
    • Память 128 МБ
  • Обновление определения задачи вручную TDv3

    • Память 256 МБ
  • Развертывание через конвейер кода

    • Создает определение задачи TDv4
      • Память128 МБ ЗДЕСЬ GOTCHA, КОПИРОВАНИЕ ИЗ TDv2
  • Обновление определения задачи вручную TDv5

    • Память 1024 МБ
  • Служба обновлений для использования TDv5

  • Развертывание через Code Pipeline

    • Создает определение задачи TDv6
      • Память 1024 МБ БИНГО, КОПИИ ИЗ TDv6
0 голосов
/ 31 января 2019

Я довольно часто использовал развертывание Codepipeline ECS с кластерами ECS с несколькими учетными записями.Отличие от вашей настройки в том, что я создаю кластер ECS (и определения задач, сервисы, репозитории ECR, ELB и т. Д.) Перед конвейером кода, либо через Terraform, либо через Cloudformation.

Как только определение кластера и задачи присутствует, codepipeline просто обновляет URL-адрес «образа» в определении задачи, создает новую версию и развертывает новые задачи, используя это определение.

Работал отдельно созданный кластердля меня, поскольку мне не нужно создавать кластер / сервис / балансировщик нагрузки / политики / правила автоматического масштабирования и т. д. каждый раз, когда запускается мой конвейер.Вот шаблоны, которые я использовал для создания моего кластера ECS (и других необходимых ему вещей) и конвейер кода , если это помогает!

0 голосов
/ 12 февраля 2019

Для меня единственным способом было создать новое определение задачи, так как конвейер развертывания будет использовать его в качестве базы.

0 голосов
/ 31 января 2019

В своем процессе CodePipeline попробуйте подключить этап для развертывания стека Cloudformation, в котором объявлена ​​ваша задача ECS.Таким образом, ваш конвейер будет выглядеть как

Source -> Codebuild (сборка и вставка образа докера) -> Развертывание 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
          # ...
...