дещо схожий pipeline на той, що ми використовуємо
У цій статті я проведу через процес створення шаблонного веб-додатку, який контейнеризований за допомогою Docker і розгорнутий на Elastic Beanstalk.
Додаток складається з трьох контейнерів: клієнт, що працює на React, бекенд, що працює на Node.js, і сервер Nginx, який проксить запити до кожного з них. Проект використовує систему контролю версій Github і має CI/CD pipeline, де пуш в основну гілку (master) автоматично призведе до повторного розгортання додатку на Elastic Beanstalk.
Це НЕ є посібником по Docker. Я коротко розгляну, як працює процес побудови і docker-compose, але основна мета — це пояснити, як здійснити багатоконтейнерне розгортання на Elastic Beanstalk.
Шаблонний код можна знайти в моєму репозиторії на Github: https://github.com/ashwin9798/node-react-nginx-docker-boilerplate. Цей посібник проведе через кроки налаштування проекту та створення необхідних сервісів AWS через консоль, щоб все працювало з вашим акаунтом AWS.
Створення репозиторію на Github
Завантажте архівовану версію репозиторію за цим посиланням: https://github.com/ashwin9798/node-react-nginx-docker-boilerplate
Переконайтесь, що ви завантажуєте архів, а не клонуватимете репозиторій, тому що згодом вам доведеться завантажити вашу версію коду на власний акаунт Github (для CI/CD).
Розпакуйте папку і створіть git репозиторій всередині.
cd
git init
git add -A
Створіть новий репозиторій на вашому акаунті Github для вашого додатку.
Тепер, у вашому терміналі, створіть початковий коміт і запуште зміни в новий репозиторій, використовуючи наступні команди (замініть <URL>
на URL вашого репозиторію):
git commit -m "first commit"
git remote add origin <URL>
git push origin master
Чудово! Тепер, коли код знаходиться у вашому репозиторії, можемо перейти до створення необхідних сервісів AWS через консоль.
Налаштування AWS
Увійдіть у свій AWS акаунт за посиланням http://console.aws.amazon.com/
ECR
Після того, як ви увійшли, натисніть на випадаючий список "Services" і виберіть “ECR” у розділі Containers.
ECR — це сервіс, схожий на Docker Hub, що дозволяє зберігати ваші Docker-образи в хмарі.
Після того, як ви потрапили в ECR, натискайте на “Create Repository”. Ми створимо три окремі репозиторії ECR: по одному для кожного контейнера, який будемо розгортати.
Введіть бажану назву і створіть репозиторій. Переконайтесь, що ви зробили це три рази. У моєму випадку я назвав їх test-client, test-api і test-nginx.
Поверніться до вкладки репозиторіїв ECR і переконайтесь, що були створені три репозиторії для контейнерів.
Зверніть увагу, що кожен репозиторій має URI — нам потрібно додати ці URI в файли Dockerrun.aws.json
та docker-compose-prod.yml
.
Відкрийте кожен файл і замініть відповідні плейсхолдери ECR_URL на фактичні URI з консолі ECR.
Зробіть коміт і запуште зміни на Github.
Elastic Beanstalk
Натискайте на випадаючий список "Services" і перейдіть до Elastic Beanstalk у розділі Compute.
Крок 1: Натискайте на ‘Create a new environment’, і виберіть ‘Web server environment’.
Крок 2: Створіть назву для вашого додатку та середовища (і опис, якщо хочете).
Крок 3: Для платформи оберіть ‘Docker’, а для платформи підгілки оберіть ‘Multi-container Docker running on 64bit Amazon Linux’ як показано нижче:
Створіть середовище і перейдіть до наступного кроку.
CodeBuild
Тепер, коли середовище Elastic Beanstalk та ECR налаштовані, можна переходити до CI/CD.
Власне, поведінка, яку ми хочемо, виглядає так: кожного разу, коли ми вносимо зміни в один з наших додатків, ми хочемо перебудувати ці Docker-контейнери і запушити їх в наші репозиторії ECR. Після того, як нові образи будуть запушені в ECR, Elastic Beanstalk буде повторно розгорнуто для використання останньої версії кожного контейнера.
Де визначені ці кроки?
- Файл buildspec.yml визначає етапи, які AWS CodeBuild проходитиме при побудові Docker-контейнерів і розгортанні їх на Elastic Beanstalk.
- Файл Dockerrun.aws.json використовується Elastic Beanstalk, коли він має отримати дані з ECR і підготувати необхідні EC2 екземпляри для запуску всіх контейнерів.
Крок 1: Перейдіть до ‘CodeBuild’ у розділі Developer Tools випадаючого списку "Services". Потім натискайте на ‘Create build project’. Дайте проекту ім’я та, за бажанням, опис.
Крок 2: Виберіть GitHub як джерело і підключіть репозиторій, який ви щойно створили. Це дозволить CodeBuild переглядати buildspec у нашому репозиторії і виконувати кроки побудови.
Інші налаштування:
- Image середовища — Managed Image
- Операційна система — Ubuntu
- Режим виконання — Standard
- Образ — aws/codebuild/standard:4.0
- Версія образу — Always use the latest image
- Тип середовища — Linux
- Привілейований (Увімкніть цей прапорець, якщо ви хочете будувати Docker образи або дати вашому побудові підвищені привілеї) — Так (відмічено прапорцем)
- Роль сервісу — Нова роль сервісу
- Специфікації збірки — Використовувати buildspec файл
Після створення проекту в CodeBuild, потрібно додати політику, яка дозволить CodeBuild доступ до ECR.
Крок 3: Перейдіть до консолі ‘IAM’ (знову ж таки через випадаючий список "Services") і натискайте на Roles. Шукайте роль сервісу CodeBuild, яку ви щойно створили. Вона має таку назву:
codebuild-YourCodeBuildProjectName-service-role
Натискайте на роль сервісу, а потім натискайте на ‘Attach policies’, щоб потрапити на наступний екран:
Крок 4: Натискайте на ‘Create Policy’.
Коли вам запропонують список сервісів, для яких потрібно створити політику, виберіть Elastic Container Registry. Після вибору ECR перейдіть до секції ‘Actions’, що знаходиться прямо під вибором сервісу. Ви можете побачити всі рівні доступу, натиснувши на посилання ‘Expand all’ праворуч від цієї секції.
Ми надамо наступні дозволи нашій політиці:
- BatchCheckLayerAvailability (Читання) — надає дозвіл перевірити доступність кількох шарів зображень в заданому реєстрі та репозиторії
- GetAuthorizationToken (Читання) — надає дозвіл отримати токен, що діє для заданого реєстру протягом 12 годин
- InitiateLayerUpload (Запис) — надає дозвіл повідомити Amazon ECR, що ви маєте намір завантажити шар зображення
- PutImage (Запис) — надає дозвіл створювати або оновлювати маніфест зображення, що пов'язаний із зображенням
- CompleteLayerUpload (Запис) — надає дозвіл повідомити Amazon ECR, що завантаження шару зображення для заданого реєстру, назви репозиторію та ідентифікатора завантаження завершено
- UploadLayerPart (Запис) — надає дозвіл завантажити частину шару зображення в Amazon ECR
Крок 5: Потім перейдіть до розділу "Resources", що знаходиться безпосередньо нижче, і виберіть "All Resources". Після цього натискайте кнопку ‘Review Policy’ в правому нижньому кутку екрану, і це повинно перенаправити вас до останнього кроку — надання імені вашій політиці. Я назвав свою політику SampleCodeBuildToECR.
CodePipeline
Перейдіть до ‘CodePipeline’ у розділі Developer Tools випадаючого списку "Services". CodePipeline буде слухати за пушами до репозиторію на GitHub, запускати CodeBuild, розгортати контейнери на Elastic Beanstalk і також показувати прогрес збірок у зручному GUI.
Крок 1 — Налаштування: Натискайте на ‘Create new pipeline’ і використовуйте стандартні налаштування для пайплайна
Крок 2 — Джерело: Додайте GitHub як стадію джерела і натискайте на ‘Connect to GitHub’. Потім виберіть репозиторій, який ви створили, і виберіть ‘master’ як гілку.
Крок 3 — Збірка: Додайте ваш проект CodeBuild там, де потрібно вказати ім’я проекту. Створіть змінну середовища AWSACCOUNTID, і для значення додайте префікс URL-ів ECR (число перед dkr.ecr.us-west-2…).
Крок 4 — Розгортання: Тут ми будемо використовувати наше середовище Elastic Beanstalk. Не забудьте вибрати відповідний додаток і середовище.
Крок 5 — Додати політику ECR Service Role: Ми створили політику SampleCodeBuildToECR раніше, і тепер її потрібно прикріпити до ролі сервісу пайплайна. Знайдіть роль сервісу в IAM — вона повинна мати формат codebuild-NameOfCodeBuildProject-service-role
. Додайте політику SampleCodeBuildToECR, яку ми створили раніше.
І все!
Збірка повинна автоматично запускатися, коли ви пушите зміни на GitHub. Ви можете переглядати статус пайплайна тут:
Коли стадія розгортання стане зеленою, додаток працює на Elastic Beanstalk, і ви можете відвідати його, натиснувши на посилання ‘AWS Elastic Beanstalk’ в блоці стадії Deploy, а потім натискаючи на URL (див. нижче)
клієнт: elasticbeanstalkURL/
Це проект-стартівка React, створений за допомогою create-react-app
api: elasticbeanstalkURL/api/
Найпростіший сервер express, що виводить Hello World на кореневому URL
Локальна розробка
Тепер, коли ви можете вносити зміни до клієнта та API локально, ви можете тестувати їх, використовуючи команду docker-compose up --build
.
Це запускає контейнери на вашому локальному комп'ютері (переконайтесь, що у вас встановлений Docker Desktop).
Ви можете переглянути клієнтську частину за адресою http://localhost:80/ і API за адресою http://localhost:80/api/
Коли ви будете готові до розгортання в продакшн, просто зробіть пуш в ваш репозиторій на GitHub, і пайплайн CI/CD подбає про решту.
Сподіваюсь, це було корисно!
Перекладено з: Deploy multi-container Docker app with CI/CD to Elastic Beanstalk with AWS ECR, CodeBuild and CodeDeploy