AWS ECS Blue / Green CodePipeline: исключение при попытке чтения артефакта изображения - PullRequest
0 голосов
/ 26 мая 2020

Я хотел создать CodePipeline, который строит образ контейнера из исходного кода CodeCommit, а затем развертывает новый образ в синем / зеленом стиле в моей службе ECS (тип запуска EC2).

  • На этапе сборки создается новый контейнер и успешно отправляется его в ECR, определение образа файла. json - это BuildArtifact, созданный на этом этапе, содержащий контейнер и недавно созданное изображение с его тегом, соответствующим идентификатору фиксации CodeCommit.
  • Этап развертывания состоит из действия «Amazon ECS (синий / зеленый)» с использованием SourceArtifact и BuildArtifact в качестве InputArtifacts, чтобы взять apppe c и taskdef из SourceArtifact и описание изображения из BuildArtifact, чтобы окончательно развернуть новый контейнер в синем / зеленом стиле.

Проблема связана с определением образа из BuildArtifact. Конвейер не работает на этапе развертывания с ошибкой:

"" Недопустимая конфигурация действия Исключение при попытке прочитать файл артефакта изображения из артефакта: BuildArtifact. ""

Как правильно настроить фазу развертывания Amazon ECS (синий / зеленый), чтобы он мог использовать недавно созданный образ и развернуть его .... путем замены заполнителя IMAGE_NAME внутри taskdef. json?

Любая подсказка приветствуется: D

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Amazon ECS Blue / Green (или CodeDeployToECS) Действие CodePipeline требует параметра TaskDefinitionTemplateArtifact (см. [1]).

В дополнение к указанному выше файлу обратите внимание на imageDetail. json требуется для развертываний ECS Blue / Green (не 'imagedefinition. json'). Структура файла и подробности доступны здесь [2]. Добавьте этот файл в root вашего артефакта развертывания / контроля версий. Если вы не хотите добавлять этот файл вручную, вы можете использовать действие источника ECR в CodePipeline и настроить его с помощью образа, который вы используете в службе ECS / taskdef. json. Все это обсуждается в [2] для ясности.

Чтобы увидеть, как все это собрано вместе, вы также можете следовать пошаговым инструкциям по развертыванию ECS Blue / Green здесь [3].

Ссылки:

[1] https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action -requirements : Ссылка на структуру конвейера CodePipeline - Требования к структуре действий в CodePipeline [2] https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html#file -reference-ecs-bluegreen : Ссылка на файл определений изображений - imageDetail. json Файл для действий по развертыванию Amazon ECS, синий / зеленый [3] https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html: Учебное пособие: создание конвейера с источником Amazon ECR и переходом от ECS к Развертывание CodeDeploy

0 голосов
/ 27 мая 2020

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

  1. определение образа файла. json не подходит для действия развертывания «Amazon ECS Blue / Green». Для этого вам нужно создать файл imageDetail. json на этапе сборки и предоставить его как артефакт на этапе развертывания. Как ? Вот так выглядит нижняя часть моего buildspe c .yaml:
      - printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
  files: 
    - 'image*.json'
    - 'appspec.yaml'
    - 'taskdef.json'
  secondary-artifacts:
    DefinitionArtifact:
      files:
        - appspec.yaml
        - taskdef.json
    ImageArtifact:
      files:
        - imageDetail.json
На этапе развертывания CodePipeline используйте DefinitionArtifact и ImageArtifact в качестве входных артефактов и настройте их в соответствующем разделе « определение задачи Amazon ECS » и «AWS CodeDeploy AppSpe c file.".

Убедитесь, что ваш apppe c .yaml содержит заполнитель для определения задачи. Вот мой apppe c .yaml:

version: 0.0

Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "my-test-container"
          ContainerPort: 8000

Также убедитесь, что ваш taskdef. json содержит заполнитель для окончательного изображения, например

...
"image": <IMAGE1_NAME>,
...
используйте этот заполнитель в конфигурации codepipeline вашей сине-зеленой фазы развертывания в разделе « Динамическое обновление образа определения задачи - необязательно », выбрав входной артефакт как «ImageArtifact» и заполнитель <IMAGE1_NAME>
...