Як розгорнути багатоконтейнерний додаток з Docker Compose з Gitlab на AWS Elastic Beanstalk

Вступ

Після багатьох годин розчарувань, мені вдалося розгорнути багатоконтейнерний репозиторій на AWS Elastic Beanstalk. Як вихідний код, так і Docker образи зберігаються в Gitlab. Я хочу поділитися своїм досвідом, щоб інші з подібними потребами могли скористатися цим посібником. Можливо, я робив деякі непотрібні додаткові кроки; ви можете зазначити це в коментарях, і я буду вдячний.

Попередні умови

  • Обліковий запис AWS
  • Репозиторій Gitlab
  • Docker образи, вже опубліковані в Container Registry Gitlab
  • Робочий багатоконтейнерний додаток, що використовує docker-compose.yml

Кроки

  1. Створити додаток Elastic Beanstalk в AWS.
  2. Додати змінні середовища до додатку Elastic Beanstalk.
  3. Створити користувача IAM з кастомними політиками.
  4. Додати змінні середовища до CI/CD вашого репозиторію.
  5. Додати config.json до вашого AWS S3 бакету.
  6. Додати .gitlab-ci.yml до проєкту.
  7. Поштовх.

Створення додатку Elastic Beanstalk в AWS

  1. Перейдіть на AWS.
  2. Знайдіть Elastic Beanstalk.
  3. Натисніть кнопку “Create Application”.
  4. Введіть ім'я вашого додатку.
  5. Виберіть платформу Docker і Sample application, як на зображенні нижче.
  6. Готово.

pic

pic

Додавання змінних середовища до додатку Elastic Beanstalk

Тепер давайте налаштуємо змінні середовища для нашого додатку, щоб вони були доступні під час розгортання.

pic

  1. Зліва ви повинні побачити ваш {ім'я додатку}-env.
  2. Натисніть на конфігурацію.
  3. У категорії "Software" натисніть кнопку “Edit”.
  4. Тут ви побачите розділ "Environment properties".
  5. Додайте ваші змінні середовища.
  6. Натисніть кнопку "Apply".
  7. Готово.

Тепер сервіс перезавантажиться, і все має працювати правильно.

Створення користувача IAM з кастомними політиками

Створимо користувача IAM для Gitlab, який має доступ до AWS.

pic

  1. Знайдіть IAM і відкрийте сервіс IAM.
  2. Зліва натисніть на "Users".
  3. Додайте ваше ім'я користувача (я назвав свого “{app-name}-ci”). Наприклад, “example-app-ci”.
  4. Поставте галочку на "Access Key — Programmatic access" і натискайте next.
  5. Натисніть "Attach existing policies".
  6. Знайдіть "Beanstalk" і виберіть політику, яку вам потрібно. Для цього посібника вибираємо “AdministratorAccess-AWSElasticBeanstalk”.

І натискайте next.

  1. Пропустіть Tags, натискаючи “next”.
  2. Натискайте “create user” і збережіть ключ доступу та секретний ключ. Ми будемо використовувати їх у Gitlab.

Додавання внутрішньої політики до нашого користувача IAM

  1. В тому ж сервісі IAM натисніть на "Roles".
  2. Виберіть “aws-elasticbeanstalk-ec2-role”.
  3. Додайте нову внутрішню політику.
  4. Додайте нижченаведений код.
  5. Натискайте next або перегляньте політику.
  6. Збережіть.
{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Sid": "VisualEditor0",  
 "Effect": "Allow",  
 "Action": "s3:GetObject",  
 "Resource": "arn:aws:s3:::"  
 }  
 ]  
}

Тепер переходимо до Gitlab.

Додавання змінних середовища до CI/CD вашого репозиторію

  1. Перейдіть до вашого репозиторію в Gitlab.

  2. Зліва натисніть на "settings" -> "Repository".

  3. Розгорніть секцію "Deploy tokens".

Створіть новий токен для розгортання з доступом "readrepository" і "readregistry". Цей токен ми збережемо у нашому S3 бакеті. Коли ми створювали додаток Elastic Beanstalk, AWS створив для нас S3 бакет.

  1. Збережіть облікові дані кудись (ми використовуватимемо їх незабаром).
  2. Тепер давайте додамо змінні. Зліва натисніть на "settings" -> "CI/CD".
  3. Я додав наступні змінні:
  4. AWSACCESSKEY_ID = (IAM користувач)
  5. AWSDEFAULTREGION = (ваш AWS регіон)
  6. AWSSECRETACCESS_KEY = (IAM секрет)
  7. GITLABDEPLOYUSER
  8. GITLABDEPLOYTOKEN
  9. S3BUCKETNAME

Додавання файлу config.json до вашого AWS S3 бакету

Оскільки я опублікував свої Docker образи в приватному реєстрі Gitlab, AWS не може їх отримати.
Отже, ми додаємо цей файл config.json, і AWS використовує ці облікові дані під час отримання образів з реєстру контейнерів.

Спочатку давайте створимо файл під назвою "config.json". Його можна зберегти будь-де, але його вміст повинен виглядати так:

{  
 "auths": {  
 "registry.gitlab.com": {  
 "auth": ""  
 }  
 }  
}

Замініть <credentials> на ваші облікові дані для токена розгортання Gitlab. Я перетворив ці облікові дані в base64 за допомогою наступної команди в терміналі.

echo ":"| tr -d "\n" | base64

Нарешті, завантажте цей файл в корінь вашого S3 бакету, який використовується вашим додатком Elastic Beanstalk.

Додавання файлу Dockerrun.aws.json

Нам потрібно додати файл dockerrun.aws.json, щоб AWS знав, як використовувати config.json, який ми створили раніше.

Я створив цей документ в корені мого проєкту. Його вміст виглядає так:

{  
 "AWSEBDockerrunVersion": "3",  
 "Authentication": {  
 "bucket": "",  
 "key": "config.json"  
 }  
 }

Замініть <bucket-name> на ім'я вашого AWS S3 бакету.

Примітка: Ви можете створити нову версію вашого додатку на Elastic Beanstalk, використовуючи "Dockerrun.aws.json" і ваш файл "docker-compose.yml" і розгорнути його, щоб перевірити, чи все працює правильно.

Автоматизація розгортання за допомогою Gitlab CI

Тепер ми можемо автоматизувати наш процес за допомогою GitLab CI.

Спочатку створимо файл "gitlab-ci.yml" в корені нашого проєкту. Він повинен виглядати так:

deploy:  
 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest  
 stage: deploy  
 services:  
 - docker:dind  
 before_script:  
 - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" --password-stdin  
 script:  
 - |  
 if [["$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH"]]; then  
 tag=""  
 echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"  
 else  
 tag=":$CI_COMMIT_REF_SLUG"  
 echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"  
 fi  
 - apt-get install zip  
 - export NEW_VERSION="v0.0.$CI_PIPELINE_IID"  
 - zip -r deploy-$NEW_VERSION.zip docker-compose.yml Dockerrun.aws.json  
 - aws configure set region $AWS_DEFAULT_REGION  
 - aws s3 cp deploy-$NEW_VERSION.zip s3://$S3_BUCKET_NAME/deploy-$NEW_VERSION.zip  
 - aws elasticbeanstalk create-application-version --application-name $APP_NAME --version-label $NEW_VERSION --source-bundle S3Bucket="$S3_BUCKET_NAME",S3Key="deploy-$NEW_VERSION.zip"  
 - aws elasticbeanstalk update-environment --application-name $APP_NAME --environment-name $ENV_NAME --version-label $NEW_VERSION  
 only:  
 - main

Цей скрипт використовує образ, вже наданий Gitlab з AWS CLI, встановленим всередині.
Він виконує наступні дії:

· Встановлює zip, щоб ми могли запакувати все необхідне в один zip файл.

· Створює нову мітку версії, використовуючи ID конвеєра.

· Стискає всі необхідні файли (Dockerrun.aws.json та docker-compose.yml) у zip файл.

· Копіює цей zip файл в наш S3 бакет.

· Створює нову версію додатку Elastic Beanstalk, використовуючи файл, завантажений в S3.

· Оновлює середовище Elastic Beanstalk, використовуючи новостворену версію.

· Готово.

Останній крок

Тепер запуште ваші зміни до GitLab, і все повинно працювати.

Шаблон репозиторію

Для довідки, я додав цей репозиторій.

Посилання:

Як розгорнути з Gitlab на Elastic Beanstalk (AWS) — Tobias Meixner

AWS Elastic Beanstalk з використанням Docker образів з приватного репозиторію

GitLab CI: Як розгорнути Docker образ на AWS Elastic Beanstalk з приватного Docker реєстру — Valentin Despa

Як розгорнути Java додаток на AWS Elastic Beanstalk за допомогою GitLab CI Pipeline | GitLab CI — DevOps Hint

Docker і Kubernetes: Повний посібник — Stephen Grider

Перекладено з: How to deploy multi-container with Docker Compose from Gitlab to AWS Elastic Beanstalk

Leave a Reply

Your email address will not be published. Required fields are marked *