Вступ
Після багатьох годин розчарувань, мені вдалося розгорнути багатоконтейнерний репозиторій на AWS Elastic Beanstalk. Як вихідний код, так і Docker образи зберігаються в Gitlab. Я хочу поділитися своїм досвідом, щоб інші з подібними потребами могли скористатися цим посібником. Можливо, я робив деякі непотрібні додаткові кроки; ви можете зазначити це в коментарях, і я буду вдячний.
Попередні умови
- Обліковий запис AWS
- Репозиторій Gitlab
- Docker образи, вже опубліковані в Container Registry Gitlab
- Робочий багатоконтейнерний додаток, що використовує docker-compose.yml
Кроки
- Створити додаток Elastic Beanstalk в AWS.
- Додати змінні середовища до додатку Elastic Beanstalk.
- Створити користувача IAM з кастомними політиками.
- Додати змінні середовища до CI/CD вашого репозиторію.
- Додати config.json до вашого AWS S3 бакету.
- Додати .gitlab-ci.yml до проєкту.
- Поштовх.
Створення додатку Elastic Beanstalk в AWS
- Перейдіть на AWS.
- Знайдіть Elastic Beanstalk.
- Натисніть кнопку “Create Application”.
- Введіть ім'я вашого додатку.
- Виберіть платформу Docker і Sample application, як на зображенні нижче.
- Готово.
Додавання змінних середовища до додатку Elastic Beanstalk
Тепер давайте налаштуємо змінні середовища для нашого додатку, щоб вони були доступні під час розгортання.
- Зліва ви повинні побачити ваш {ім'я додатку}-env.
- Натисніть на конфігурацію.
- У категорії "Software" натисніть кнопку “Edit”.
- Тут ви побачите розділ "Environment properties".
- Додайте ваші змінні середовища.
- Натисніть кнопку "Apply".
- Готово.
Тепер сервіс перезавантажиться, і все має працювати правильно.
Створення користувача IAM з кастомними політиками
Створимо користувача IAM для Gitlab, який має доступ до AWS.
- Знайдіть IAM і відкрийте сервіс IAM.
- Зліва натисніть на "Users".
- Додайте ваше ім'я користувача (я назвав свого “{app-name}-ci”). Наприклад, “example-app-ci”.
- Поставте галочку на "Access Key — Programmatic access" і натискайте next.
- Натисніть "Attach existing policies".
- Знайдіть "Beanstalk" і виберіть політику, яку вам потрібно. Для цього посібника вибираємо “AdministratorAccess-AWSElasticBeanstalk”.
І натискайте next.
- Пропустіть Tags, натискаючи “next”.
- Натискайте “create user” і збережіть ключ доступу та секретний ключ. Ми будемо використовувати їх у Gitlab.
Додавання внутрішньої політики до нашого користувача IAM
- В тому ж сервісі IAM натисніть на "Roles".
- Виберіть “aws-elasticbeanstalk-ec2-role”.
- Додайте нову внутрішню політику.
- Додайте нижченаведений код.
- Натискайте next або перегляньте політику.
- Збережіть.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::"
}
]
}
Тепер переходимо до Gitlab.
Додавання змінних середовища до CI/CD вашого репозиторію
-
Перейдіть до вашого репозиторію в Gitlab.
-
Зліва натисніть на "settings" -> "Repository".
-
Розгорніть секцію "Deploy tokens".
Створіть новий токен для розгортання з доступом "readrepository" і "readregistry". Цей токен ми збережемо у нашому S3 бакеті. Коли ми створювали додаток Elastic Beanstalk, AWS створив для нас S3 бакет.
- Збережіть облікові дані кудись (ми використовуватимемо їх незабаром).
- Тепер давайте додамо змінні. Зліва натисніть на "settings" -> "CI/CD".
- Я додав наступні змінні:
- AWSACCESSKEY_ID = (IAM користувач)
- AWSDEFAULTREGION = (ваш AWS регіон)
- AWSSECRETACCESS_KEY = (IAM секрет)
- GITLABDEPLOYUSER
- GITLABDEPLOYTOKEN
- 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 образів з приватного репозиторію
● Docker і Kubernetes: Повний посібник — Stephen Grider
Перекладено з: How to deploy multi-container with Docker Compose from Gitlab to AWS Elastic Beanstalk