Статьи

Интеграция вашего кодекса CI / CD Pipeline с AWS ECR

Amazon недавно объявила о своем  размещении EC2 Container Registry . Теперь, когда поддержка Amazon ECR  была выпущена , мы здесь, чтобы показать вам, как вы можете интегрировать ECR в ваш конвейер CI / CD в Codeship.

ECR ведет себя аналогично стандартному реестру Docker, где вы можете выдвигать и извлекать изображения и ссылаться на реестр при создании ваших изображений. При этом существуют некоторые различия между интеграцией Docker Hub или Quay и интеграцией с ECR. Давайте рассмотрим интеграцию с ECR, уделяя особое внимание инструментам Codeship.

Как это устроено

Основываясь на надежной инфраструктуре AWS, Amazon предоставляет высокодоступный контейнерный реестр, который напрямую интегрируется с основным набором инструментов AWS. Это основано на стандартной аутентификации и маршрутизации AWS и позволяет легко размещать образы контейнеров в кластере контейнеров.

Quay и Docker Hub, которые предоставляют единую конечную точку для взаимодействия, используют учетные данные для определения доступа и видимости. ECR предоставляет уникальный URL-адрес для каждого реестра, который привязан к определенной учетной записи пользователя. Это означает, что разные репозитории могут принадлежать разным реестрам и иметь разные URL-адреса в зависимости от того, под какой учетной записью они были созданы. CLI AWS позволяет указать этот идентификатор реестра при создании репозиториев.

ECR совместим с API-интерфейсом реестра V2 Docker, что означает, что вы можете запускать стандартные docker pull и  docker push команды для своего реестра. Тем не менее, это защищено уровнем безопасности.

Для этого  docker loginнеобходимо использовать интерфейс командной строки AWS, чтобы получить временный токен для входа, который можно настроить на срок до 36 часов. Это означает, что стандартная практика хранения dockercfg с постоянными учетными данными реестра локально и как часть вашей зашифрованной базы данных CI не будет работать для ECR. Мы поговорим более подробно о том, как мы решаем это для конвейера Codeship CI / CD позже.

Начиная

Чтобы начать использовать ECR, а затем интегрировать его с нашим конвейером CI / CD, нам нужно сначала настроить интерфейс командной строки AWS, создать репозиторий и определить URL-адрес нашего реестра.

Чтобы настроить AWS cli, следуйте инструкциям в документации по  AWS CLI,  а затем запустите,  aws configure чтобы предоставить инструменту свои учетные данные для доступа к AWS.

С этого момента все команды, связанные с ECR, доступны через этот  aws ecr раздел и могут быть перечислены с помощью команды  aws ecr help:

$ aws ecr help

NAME
       ecr -

DESCRIPTION
       The  Amazon EC2 Container Registry makes it easier to manage public and
       private Docker images for AWS or on-premises environments. Amazon ECR
       supports resource-level permissions to control who can create, update,
       use or delete images. Users and groups can be created individually in
       AWS Identity and Access Management (IAM) or federated with enterprise
       directories such as Microsoft Active Directory. Images are stored on
       highly durable AWS infrastructure and include built-in caching so that
       starting hundreds of containers is as fast as a single container.

AVAILABLE COMMANDS
       o batch-check-layer-availability
       o batch-delete-image
       o batch-get-image
       o complete-layer-upload
       o create-repository
       o delete-repository
       o delete-repository-policy
       o describe-repositories
       o get-authorization-token
       o get-download-url-for-layer
       o get-login
       o get-repository-policy
       o help
       o initiate-layer-upload
       o list-images
       o put-image
       o set-repository-policy
       o upload-layer-part

Давайте начнем с создания репозитория в нашем реестре для примера приложения myuser/myapp. Это позволит нам загружать и извлекать изображения с помощью Docker cli и API.

$ aws ecr create-repository --repository-name myuser/myapp
{
    "repository": {
        "registryId": "108487657846", 
        "repositoryName": "myuser/myapp", 
        "repositoryArn": "arn:aws:ecr:us-east-1:108487657846:repository/myuser/myapp"
    }
}

Теперь мы можем использовать это  registryId поле для определения URL реестра через шаблон https://${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com. Это понадобится позже при ссылках на изображения. Вы также можете получить URL-адрес реестра из сгенерированной док-станции ECR.

Генерация учетных данных

Поскольку ECR придерживается стандартной аутентификации AWS, вы должны использовать дополнительный, временный токен, а не пару ключей AWS, чтобы выдвигать или извлекать изображения. Это может быть достигнуто либо путем создания входа в Docker через AWS cli, либо путем простого создания токена авторизации Docker, который можно использовать для входа в систему.

$ aws ecr get-login
docker login -u AWS -p CiBwm0YaIyYjCVV+BAIBEICCAoo55cBYr9IBaPchhO8Ba0iPy8xRFuvIOSaw2yHVV/lE1/v5e9FZGck03lrA7q/rAFHRjvCrOdSS+/cvV2kpFv1drVEiMR9EEDRKdgLEw4ung3YrKDHqVZjXhxWaRiC2mFIKaDFNjyNYxY6Kmg5JCJTCwHRjOoWADJ0SJRDJdcqN8oKkyUvCEgW8idIWsFw5pjCLtQNtI2VX3XrnE8s5GLddQIsJOG3d1ak3a8LFzXUVb+V3eOysAuLtrCcZlPGyODZHI1nfcgcqjh16zeNitqRI2+H8G+kGAL2Xlbzwp8gVNkH+AX/vkbi0/1QFy/8KgyC7jvnn3+gedXqjNSW4sDS0yjCyp6pL+S4MVTkyq8fkrB/tdgRtJm5n1G6uqeekXuoXXPe5UFce9Rq8/14xKABgEBAgB4cJtGGiEiXkbSZuZ9RurqnnpF7qF1z3uVBXHvUavP9eMAAALXMIIC0wYsXHix4VRzWyzUbB8PANn/Qojf1oMQkQ2u15CZJ8Tol0LHgDi5/qGZ+wHTn+sz/dilpwlmrTuo+6avfZdfQy9r47+EPohNB0OquH03gt3fSjR5efU0ldE62VL/GrgHpgOH9qfSsCDvnKDuwfD5lFEIc3npcLh3djbcchTzCSqHdjAjgQgMQh54JSojL3TydS8WclKg6/W7wQIaozk+zfOoETPq90nO1UtT9QbBxbBBqL1JOs9Wu1owX1Ec9wS5oIuwXYNpHqDTA0EQTV4jZsZ335JMAijcM5GHN7MJ2ukOXOffonmHKoVdNJ7RpLBdz8moVKewhOF4jSh8GMbWu19W3uJsGHyS1oMfZz17whuWdetF77cf5cSUF7HXJEW77zDGRUVo0PWqg2CNEdCaonasScWKLQcT1AjhrQ+ctiXZcjoZGRRxFIZ8qR6t3lwn+sZIGszRkdhEI3lKW7EfZl4PfJVieip8m4sccbcetUzjLeSJeJKoZIhvcNAQcGoIICxDCCAsACAQAwggK5BgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDGyzVF8QSt9pZg9PIg== -e none https://108487657846.dkr.ecr.us-east-1.amazonaws.com

Сгенерированная команда содержит URL-адрес для реестра ECR. Эта команда может быть выполнена напрямую через подоболочку:

$ $(aws ecr get-login)
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded

В качестве альтернативы вы можете вручную сгенерировать токен с помощью AWS cli:

$ aws ecr get-authorization-token --query authorizationData[].authorizationToken --output text | base64 -d | cut -d: -f2
CiBwm0YaIyYjCVV+BAIBEICCAoo55cBYr9IBaPchhO8Ba0iPy8xRFuvIOSaw2yHVV/lE1/v5e9FZGck03lrA7q/rAFHRjvCrOdSS+/cvV2kpFv1drVEiMR9EEDRKdgLEw4ung3YrKDHqVZjXhxWaRiC2mFIKaDFNjyNYxY6Kmg5JCJTCwHRjOoWADJ0SJRDJdcqN8oKkyUvCEgW8idIWsFw5pjCLtQNtI2VX3XrnE8s5GLddQIsJOG3d1ak3a8LFzXUVb+V3eOysAuLtrCcZlPGyODZHI1nfcgcqjh16zeNitqRI2+H8G+kGAL2Xlbzwp8gVNkH+AX/vkbi0/1QFy/8KgyC7jvnn3+gedXqjNSW4sDS0yjCyp6pL+S4MVTkyq8fkrB/tdgRtJm5n1G6uqeekXuoXXPe5UFce9Rq8/14xKABgEBAgB4cJtGGiEiXkbSZuZ9RurqnnpF7qF1z3uVBXHvUavP9eMAAALXMIIC0wYsXHix4VRzWyzUbB8PANn/Qojf1oMQkQ2u15CZJ8Tol0LHgDi5/qGZ+wHTn+sz/dilpwlmrTuo+6avfZdfQy9r47+EPohNB0OquH03gt3fSjR5efU0ldE62VL/GrgHpgOH9qfSsCDvnKDuwfD5lFEIc3npcLh3djbcchTzCSqHdjAjgQgMQh54JSojL3TydS8WclKg6/W7wQIaozk+zfOoETPq90nO1UtT9QbBxbBBqL1JOs9Wu1owX1Ec9wS5oIuwXYNpHqDTA0EQTV4jZsZ335JMAijcM5GHN7MJ2ukOXOffonmHKoVdNJ7RpLBdz8moVKewhOF4jSh8GMbWu19W3uJsGHyS1oMfZz17whuWdetF77cf5cSUF7HXJEW77zDGRUVo0PWqg2CNEdCaonasScWKLQcT1AjhrQ+ctiXZcjoZGRRxFIZ8qR6t3lwn+sZIGszRkdhEI3lKW7EfZl4PfJVieip8m4sccbcetUzjLeSJeJKoZIhvcNAQcGoIICxDCCAsACAQAwggK5BgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDGyzVF8QSt9pZg9PIg==

Затем вы можете использовать возвращенный токен авторизации в той же  docker login команде aws ecr get-login .

Аутентификация с ECR в коде

Традиционно статические учетные данные Docker кодируются в пакете данных проекта и расшифровываются, чтобы выдвигать или извлекать изображения из реестра.

Из-за кратковременного характера учетных данных ECR, Codeship добавила поддержку сервисов генерации dockercfg. Теперь вы можете указать сервис, с помощью которого создается dockercfg для аутентификации определенного сервиса или шага. Вы можете узнать больше об этом в  документации Codeship . В целях поддержки ECR мы поддерживаем  образ Docker,  который вы можете расширять или использовать напрямую.

Типичная интеграция включает в себя определение службы для создания dockercfg для вашего реестра в файле служб и указание его в качестве источника аутентификации для определенных служб и / или шагов.

# codeship-services.yml
app: 
  build:
    image: 108487657846.dkr.ecr.us-east-1.amazonaws.com/myuser/myapp
    dockerfile_path: ./Dockerfile
aws_generator: 
  image: codeship/aws-dockercfg-generator
  encrypted_env: aws_creds.encrypted # contains Secret, AccessKey and Region
  add_docker: true
# codeship-steps.yml
- type: push
  service: app
  registry: https://108487657846.dkr.ecr.us-east-1.amazonaws.com
  image_name:  108487657846.dkr.ecr.us-east-1.amazonaws.com/myuser/myapp
  dockercfg_service: aws_generator

aws_generator Услуга будет работать по мере необходимости и предоставляет учетные данные , чтобы Codeship взаимодействовать с реестром ECR. В этом примере мы просто создаем образ и заставляем наш конвейер CD перевести его в ECR.

Использование базовых образов ECR и кэширование

Наряду с явной передачей изображений в ECR как часть вашего конвейера, вы можете использовать свой реестр для размещения частных базовых образов, используемых во время сборки Codeship.

В этом случае, если шаг или служба,  ссылающаяся на создаваемое изображение, ссылается на dockercfg_service, а  FROMобъявление в вашем файле Docker ссылается на полное имя образа ECR, сборка будет работать. Точно так же это позволит вам использовать ECR для заполнения локального  кэша образов Docker  во время сборок, указав  cached: true соответствующие службы.

# Dockerfile
FROM 108487657846.dkr.ecr.us-east-1.amazonaws.com/myuser/myapp

ADD ./ /opt/app
# codeship-services.yml
app: 
  build:
    image: myuser/myapp
    dockerfile_path: ./Dockerfile
  dockercfg_service: aws_generator
  cached: true
aws_generator: 
  image: codeship/aws-dockercfg-generator
  encrypted_env: aws_creds.encrypted # contains Secret, AccessKey and Region

Вывод

Использование сервисов генератора dockercfg от Codeship и интеграция существующего конвейера CI / CD с ECR — простая задача. Добавив службу генератора, обновив имена ваших образов и заменив любые существующие ссылки на dockercfg ссылками на новую службу генератора dockercfg, вы можете отправить свои изображения в ECR, не внося сложных изменений в свой конвейер.

Благодаря возможности совместного размещения реестра изображений с вашими контейнерами ECR является мощным инструментом, помогающим ускорить развертывание и масштабирование инфраструктуры AWS.