AWS: создание Elastic Container Registry и деплой из Jenkins

Автор: | 23/09/2019

Задача: создать AWS ECR репозиторий для образов проекта, и добавить джобу в Jenkins, которая будет собирать образы, и загружать их в этот репозиторий.

Продолжение – в посте Jenkins: деплой Docker Compose из Ansible и ECR авторизация.

AWS ECR

Переходим в ECR, жмём Get Started, выбираем имя нового репозитория:

Оставляем по умолчанию Mutable, т.е. можно будет залить образ с тем же тегом, если он уже есть в репозитории.

Репозиторий готов:

IAM

Переходим в IAM, создаём пользователя:

Подключаем ему политику AmazonEC2ContainerRegistryFullAccess:

Сохраняем его ключи доступа:

Настраиваем профиль в AWS CLI:

[simterm]

$ aws configure --profile bttrm-backend-ecr
AWS Access Key ID [None]: AKI***6EZ
AWS Secret Access Key [None]: PpN***GNr
Default region name [None]: us-east-2
Default output format [None]: json

[/simterm]

Получаем токен доступа:

[simterm]

$ aws --profile bttrm-backend-ecr ecr get-login --no-include-email --region us-east-2
docker login -u AWS -p eyJ***M30= https://534***385.dkr.ecr.us-east-2.amazonaws.com

[/simterm]

Логинимся:

[simterm]

$ docker login -u AWS -p eyJ***M30= https://534***385.dkr.ecr.us-east-2.amazonaws.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/setevoy/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[/simterm]

Находим любой имеющийся локально образ:

[simterm]

$ docker images | grep nginx
nginx                               alpine              031c45582fce        5 months ago        16.1MB
nginx                               latest              06144b287844        12 months ago       109MB

[/simterm]

Тегаем его с новым именем и именем репозитория:

[simterm]

$ docker tag nginx:latest 534***385.dkr.ecr.us-east-2.amazonaws.com/test:latest

[/simterm]

Пушим в репозиторий:

[simterm]

$ docker push 534***385.dkr.ecr.us-east-2.amazonaws.com/test:latest
The push refers to repository [534***385.dkr.ecr.us-east-2.amazonaws.com/test]
579c75bb43c0: Pushed 
67d3ae5dfa34: Pushed 
8b15606a9e3e: Pushed 
latest: digest: sha256:c0b69559d28fb325a64c6c8f47d14c26b95aa047312b29c699da10380e90b4d7 size: 948

[/simterm]

Окей, тут всё работает.

Jenkins

Следующим шагом – надо добавить джобу в Jenkins, которая будет по вебхуку собирать образ, тегать его, и пушить в репозиторий.

Amazon ECR authentication

Для авторизации в ECR потребуется выполнить aws ecr get-login для получения токена, который потом используется для docker login.

Что бы не выполнять aws ecr get-login – используем плагин Amazon ECR. устанавливаем его:

Добавляем данные доступа к новому репозиторию – переходим в Credentials – Add credentials, тип AWS Credentials:

Build && push job

Создаём новую Pipeline-джобу:

И скрипт:

node {
    def app

    stage('Clone repository') {
        git branch: "master", url: "[email protected]:example-dev/go-queue-consumer.git", credentialsId: "jenkins-example-github"
    }

    stage('Build image') {
        sh "docker build --build-arg APP_NAME=receipts -t 534***385.dkr.ecr.us-east-2.amazonaws.com/bttrm-receipt-consumer:latest -f docker/prod/Dockerfile ."
    }

    stage('Push image') {
        docker.withRegistry('https://534***385.dkr.ecr.us-east-2.amazonaws.com', 'ecr:us-east-2:bttrm-backend-ecr') {
            sh "docker push 534***385.dkr.ecr.us-east-2.amazonaws.com/bttrm-receipt-consumer:latest"
        }
    }
}

В ‘ecr:us-east-2:bttrm-backend-ecr‘ задаём получение токена ECR в регионе us-east-2, используя ACCESS и SECRET ключи, добавленные в Credentials.

Запускаем билд:

Готово.