Тепер цей проект використовує Elastic Beanstalk, ECR та CodePipeline
У попередній статті я описував, як розгорнути Flask API за допомогою AWS Cloud Development Kit (CDK). CDK та інші інструменти для інфраструктури як коду (IaC) дозволяють створювати практично будь-яку архітектуру в AWS. Однак вони вимагають певних навичок програмування (зокрема використання об’єктно-орієнтованих бібліотек) і глибшого знання екосистеми AWS, зокрема базових мереж VPC, ролей безпеки, політик і залежних сервісів.
У цій статті я розгляну Elastic Beanstalk (EB) — сервіс, який надає більш керовану основу для впровадження двох поширених архітектурних патернів:
- Балансовані навантаженням EC2 веб-сервери з автомасштабуванням
- 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, Ubuntu — Standard — 5.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! Перш ніж йти:
- Обов’язково клікніть та підпишіться на автора️
- Дізнайтеся, як ви також можете писати для In Plain English️
- Слідкуйте за нами: X | LinkedIn | YouTube | Discord | Newsletter
- Відвідайте наші інші платформи: Stackademic | CoFeed | Venture
Перекладено з: CI/CD with Elastic Beanstalk, CodePipeline, & ECR