CodePipeline: источник ECR + конфигурация развертывания ECS - PullRequest
5 голосов
/ 25 марта 2019

По сути, мне нужно настроить CI / CD с исходным кодом bitbucket для контейнеров ECS. Я хочу использовать CodePipline для развертывания нового образа ECR в ECS.

В настоящее время в AWS CodePipline нет возможности указать битовую корзину в качестве источника. Однако мне удалось настроить CodeBuild с помощью webhooks, чтобы он создавал файл Docker и отправлял его в ECR при каждом переходе push-to-release.

Я хочу настроить ECR в качестве этапа «источника» в CodePipline и развернуть его в существующем кластере / службе ECS, чтобы развертывание было автоматизировано.

  • Я указал "Amazon ECR" в качестве поставщика действий с выходным артефактом "image_details" на этапе исходного кода.
  • Я указал «Amazon ECS» (не «Amazon ECS (синий / зеленый)») в качестве поставщика действий для этапа развертывания с «image_details» в качестве входного артефакта

codepipeline_settings

К сожалению, базовая конфигурация и цепочка артефактов приводят к появлению следующей ошибки на этапе развертывания:

Invalid action configuration
The image definition file imageDetail.json contains invalid JSON format

Хотя этап «Amazon ECR» предоставляет imageDetail.json в качестве выходного артефакта, он не ожидается для поставщика развертывания «Amazon ECS». Есть ли рациональный способ обойти эту проблему?

Я знаю, что можно настроить CI / CD с помощью bitbucket + API Gateway / Lambda + CodePipeline, я также рассматриваю возможность использования CodeCommit вместо bitbucket в качестве исходного репозитория - тем не менее, надеюсь, что существует элегантное решение для используйте bitbucket непосредственно с CodePipeline.

UPD: Я закончил с довольно хорошей конфигурацией, описанной в этом блоге: общая идея состоит в том, чтобы позволить CodeBuild загружать исходный код из bitbucket в S3, а затем использовать CodePipeline с S3 в качестве источника для развертывания нового образа докера. ECR и опубликовать новую редакцию определения задачи в кластере ECS. S3 все еще стоит над головой, и я ищу более элегантное решение для этой задачи.

1 Ответ

1 голос
/ 13 июля 2019

Мне только что пришлось решить аналогичную проблему, когда я хотел использовать ECR в качестве источника моего конвейера и заставить его развернуть образ в ECS.Решение, которое я нашел, заключалось в создании 3 этапов:

  • Источник : ECR
  • Сборка : пользовательский код для преобразования артефакта ECR вартефакт, который будет понимать этап развертывания
  • развертывание : в ECS

Вот файл buildspec.yml, который я использую в качестве этапа сборки:

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.7
  build:
    commands:
      - PHP_REPOSITORY_URI=$(cat imageDetail.json | python -c "import sys, json; print(json.load(sys.stdin)['ImageURI'].split('@')[0])")
      - IMAGE_TAG=$(cat imageDetail.json | python -c "import sys, json; print(json.load(sys.stdin)['ImageTags'][0])")
      - echo $PHP_REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Writing image definitions file...
      - printf '[{"name":"container","imageUri":"%s"}]' $PHP_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

По сути, это чтение файла imageDetail.json, извлечение URL-адреса репозитория ECR и TAG, а также вывод файла json, отформатированного для этапа развертывания ECS, который является стандартным этапом без настройки.

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