CI/CD з Elastic Beanstalk, CodePipeline та ECR

Тепер цей проект використовує Elastic Beanstalk, ECR та CodePipeline

У попередній статті я описував, як розгорнути Flask API за допомогою AWS Cloud Development Kit (CDK). CDK та інші інструменти для інфраструктури як коду (IaC) дозволяють створювати практично будь-яку архітектуру в AWS. Однак вони вимагають певних навичок програмування (зокрема використання об’єктно-орієнтованих бібліотек) і глибшого знання екосистеми AWS, зокрема базових мереж VPC, ролей безпеки, політик і залежних сервісів.

У цій статті я розгляну Elastic Beanstalk (EB) — сервіс, який надає більш керовану основу для впровадження двох поширених архітектурних патернів:

  1. Балансовані навантаженням EC2 веб-сервери з автомасштабуванням
  2. EC2 веб-робітники в групі автомасштабування, що обробляють повідомлення з SQS

Завантажте свій код додатка, і Elastic Beanstalk подбає про забезпечення, масштабування, балансування навантаження та моніторинг здоров’я. Ви платите лише за ресурси AWS, які використовує ваш додаток.

У цій статті надано посібник для впровадження першого варіанту на платформі Docker з образом з ECR. Крім того, до CI/CD буде додано CodePipeline для автоматичного оновлення додатка Elastic Beanstalk, коли змінюється вихідний код додатка на GitHub.

Створення середовища Elastic Beanstalk

Перейдіть до консолі Elastic Beanstalk і натисніть Create application

Налаштування середовища

Тип середовища: Web server environment

Введіть ім’я додатка

У розділі Platform виберіть Docker

Натисніть Next

Налаштування доступу до сервісу

Для service role виберіть Use an existing service role, якщо ви раніше використовували Elastic Beanstalk, або Create and use new service role, якщо це перший раз.

Так само, EC2 instance profile має бути автоматично заповнений, якщо відповідний профіль існує. Якщо ні, ознайомтесь з інструкціями за цим посиланням і розгорніть розділ Create IAM Role for EC2 instance profile.

Крім того, нам потрібно надати нашим EC2 інстанціям дозвіл на доступ до образів в Amazon ECR, додавши відповідні дозволи до профілю інстанції середовища. Відкрийте консоль IAM для ролі профілю EC2 інстанції і додайте таку політику: AmazonEC2ContainerRegistryReadOnly.

Налаштування мережі, бази даних і тегів

Пропустіть цей розділ. Тут ви можете вибрати VPC / Subnet для запуску та налаштувати базу даних.

Налаштування трафіку інстанцій і масштабування

У розділі Capacity виберіть Load balanced

Встановіть min та max instances на бажану кількість, наприклад, 2 і 3 для ілюстрації.

Налаштування оновлень, моніторингу та журналювання

Пропустіть цей розділ. Тут ви можете налаштувати звітність здоров’я CloudWatch, вікно оновлення платформи, сповіщення по електронній пошті, а також правила для планових оновлень і розгортань.

Огляд

Натисніть Submit. Elastic Beanstalk тепер розгорне ваше середовище, що займе кілька хвилин. Ви можете переглянути хід процесу в таблиці Events консолі. Коли завершиться, у розділі Environment overview підтвердіть, що Health позначено як Ok.

Підготовка додатка для платформи Docker

Ці інструкції припускають, що ви використовуєте Dockerfile без docker-compose.
Якщо ви використовуєте docker-compose, подивіться тут.

Створіть файл з іменем Dockerrun.aws.json у кореневій папці вашого проєкту:

{  
 "AWSEBDockerrunVersion": "1",  
 "Image": {  
 "Name": ":latest",  
 "Update": "true"  
 },  
 "Ports": [  
 {  
 "ContainerPort": "80",  
 "HostPort": "80"  
 }  
 ]  
}

Підготовка додатка для CodePipeline

Додайте наступний buildspec.yml до кореневої папки вашого проєкту.

Цей файл буде використовуватися CodeBuild на етапі збірки в CodePipeline для створення Docker контейнера та передачі артефакту Dockerrun.aws.json в Elastic Beanstalk, щоб він знав, як запустити контейнер.

version: 0.2  

phases:  
 install:  
 runtime-versions:  
 python: 3.9  
 pre_build:  
 commands:  
 - echo Authenticating with Amazon ECR…  
 - aws ecr get-login-password --region $ECR_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY_URI  
 build:  
 commands:  
 - echo Building the Docker image…  
 - docker build -t $PROJECT_NAME .  
 - docker tag $PROJECT_NAME:latest $ECR_REGISTRY_URI/$PROJECT_NAME:latest  
 post_build:  
 commands:  
 - echo Pushing the Docker image…  
 - docker push $ECR_REGISTRY_URI/$PROJECT_NAME:latest  
artifacts:  
 files:  
 - 'Dockerrun.aws.json'

Створення проєкту CodePipeline

Перейдіть до консолі CodePipeline і натисніть Create pipeline.

Налаштування конвеєра

Виберіть Pipeline name

Для service role виберіть new або existing service role

Додати етап джерела

Source provider: GitHub (Version 2)

Дотримуйтесь інструкцій, щоб підключити GitHub через GitHub Apps. Виберіть ваш репозиторій.

Pipeline trigger: Push in a branch

Branch name: main

Output artifact format: Full clone

Додати етап збірки

Створіть новий проєкт CodeBuild.

Джерело

Налаштування проєкту:

додайте ім’я проєкту

Оточення:

Managed image, UbuntuStandard5.0

поставте галочку в полі Privileged

Для Service role: новий або існуючий, переконайтеся, що до нього прикріплена політика AmazonEC2ContainerRegistryFullAccess.

Додаткові налаштування:

Додайте змінні середовища з buildspec.yml (ECR_REGION, ECRREGISTRYURI, PROJECT_NAME)

Buildspec

Використовуйте файл buildspec

Натисніть Continue to CodePipeline

Додати етап розгортання

Deploy provider: AWS Elastic Beanstalk

Ім’я додатка: ім’я вашого додатка в Beanstalk

Ім’я середовища: середовище вашого додатка в Beanstalk

Огляд

Натисніть Create pipeline

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

У консолі Elastic Beanstalk натисніть Applications, а потім виберіть середовище, підключене до вашого конвеєра.

Натисніть Go to environment з лівої навігації, щоб відкрити публічну URL-адресу вашого EB додатка в новій вкладці браузера. Якщо це веб-сторінка, ви повинні побачити її — якщо це API, спробуйте виконати запит curl до цієї URL-адреси, щоб протестувати її.

PlainEnglish.io 🚀

Дякуємо, що стали частиною спільноти In Plain English! Перш ніж йти:

Перекладено з: CI/CD with Elastic Beanstalk, CodePipeline, & ECR

Leave a Reply

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