Розгортання веб-додатка з кількома контейнерами — AWS Elastic Beanstalk

Хоча існує безліч ресурсів для побудови та розгортання контейнеризованих веб-додатків на AWS Elastic Beanstalk, все ж є певні прогалини, коли мова йде про створення кінцевого робочого процесу для додатка, заснованого на архітектурі мікросервісів — від налаштування локальної розробки до остаточного складання та розгортання на AWS.

pic

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/images/aeb-multicontainer-docker-example.png

Передумови—

  1. Припускаємо, що ви маєте базові знання про Docker та веб-додатки.
  2. Працюючий додаток, який можна контейнеризувати — ви можете ознайомитися з моїм прикладом реалізації, щоб слідувати за цією інструкцією. (Назви гілок є самопояснювальними, використовуйте гілку, яка найближча до вашої точки початку)
  3. Базове розуміння CI/CD робочих процесів для загального уявлення про те, що ми намагаємось досягти.
  4. Основи роботи з AWS Elastic Beanstalk і взаємодії з EC2 інстанціями та іншими ресурсами за лаштунками. Це чудовий вебінар для отримання більшої ясності.

Що охоплюється в цій інструкції —

  1. Налаштування додатка та середовища AWS Elastic Beanstalk
  2. Створення ECS task definition (Dockerrun.aws.json) для EBS, з файлу docker-compose
  3. Налаштування та запуск додатка локально для перевірки за допомогою середовища AWS EBS та ECS task definition, за допомогою awsebcli
  4. Створення конвеєра для складання та розгортання за допомогою Travis

[ПРИМІТКА: Хоча ідеальний підхід для запуску бази даних — це використання таких ресурсів, як RDS або DynamoDB, і зв'язування їх з додатком, це не охоплює** VPC **та групи безпеки, це не є частиною цієї інструкції.
І сам** приклад додатка**призначений лише для демонстраційних цілей.]_**

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

Цей розділ просто слідує крокам з офіційної документації AWS

  • AWS Management Console — Необхідно зареєструватися та створити обліковий запис на AWS, це можна зробити легко, після чого ви зможете увійти та отримати доступ до консолі.
  • Після того, як ви потрапите сюди, в полі "Find Services" пошукайте "Elastic Beanstalk" —

pic

  • Тут є дві вкладки: "Applications" (Додатки) та "Environments" (Середовища), почнемо з того, що створимо новий додаток, а пізніше створимо нове середовище для його запуску —

pic

  • Після вибору "Create Application" (Створити додаток), дайте ім'я вашому додатку. Важливо вибрати платформу "Docker" та гілку платформи "Multi-container Docker.."

pic

  • За замовчуванням ми почнемо з попередньо налаштованого прикладу додатка, тому можна залишити його вибраним і створити додаток.
  • Це має створити середовище для вашого додатку за замовчуванням.
  • Ви можете перевірити, що у вас є записи в обох — "Environments" (Середовища) та "Applications" (Додатки) вкладках.
  • Далі використовуємо службу IAM (Identity and Access Management) для створення ключів доступу та налаштування дозволів для середовища. Ключі використовуватимуться для підключення до середовища за допомогою CLI та також будуть використовуватися Travis для розгортання.

pic

  • Тут у вкладці "Users" (Користувачі) потрібно створити нового користувача, використовуючи "Add User" (Додати користувача)

pic

  • Переконайтесь, що вибрали "Programmatic access" (Програмний доступ)
  • Далі налаштовуємо дозволи, ми надамо всі дозволи цьому користувачу, прикріпивши наявну політику, шукайте політику з назвою — "AWSElasticBeanstalkFullAccess"

pic

  • Далі → Далі → Створити користувача, після створення користувача з'явиться екран з обліковими даними, ключем доступу та секретним ключем доступу. Переконайтесь, що ви завантажили та зберегли ці ключі. (Ви можете пізніше отримати або створити нові ключі доступу для користувача)

Локальне налаштування для EBS

  • Встановлення awsebcli — хоча в офіційній документації є інструкції, вони не працювали для мене. Також була проблема з версією 3.18, тому я змушений був знизити версію та встановити 3.17.1. Дивно, але вона працювала тільки з Python 3.6, тому я явно вказав six.
$sudo -H pip3 install awsebcli==3.17.1 -upgrade -ignore-installed six
  • Перевірте версію —
$eb --version   
EB CLI 3.17.1 (Python 3.6.8)
  • Створіть конфігурацію з ключами доступу для CLI, створіть файл ~/.aws/config (він має бути там після встановлення awsebcli) і встановіть вміст, наприклад, такий —
$cat ~/.aws/config[default]  
aws_access_key_id=your_key  
aws_secret_access_key=your_secret_key  
region=us-east-2
  • Регіон можна знайти в консолі AWS, використовуйте регіон для додатка, який був створений.
  • Створення файлу ECS Task Definition — є зручна утиліта container-transform, яка допомагає перетворити файл docker-compose на файл визначення Dockerrun.aws.json. Після встановлення цієї утиліти, ви зможете створити файл визначення, який можна перевірити за допомогою eb local run.
    Наступна команда покаже вам тип файлу визначення, який буде створений, а також виведе вміст, який потрібно додати.
$cat docker-compose.yml | container-transform -v
{  
 "AWSEBDockerrunVersion": 2,  
 "containerDefinitions": [  
 {  
 "name": "mongo",  
 "image": "km2411/flask-mongo-aws:latest",  
 "essential": true,  
 "memory": 200,  
 "cpu": 1,  
 "portMappings": [  
 {  
 "hostPort": 27017,  
 "containerPort": 27017  
 }  
 ]  
 },  

 {  
 "name": "nginx",  
 "image": "km2411/flask-nginx-aws:latest",  
 "environment": [],  
 "essential": true,  
 "memory": 200,  
 "mountPoints": [],  
 "portMappings": [  
 {  
 "hostPort": 80,  
 "containerPort": 80,  
 "protocol": "tcp"  
 }  
 ],  
 "links": [  
 "service-1"  
 ]  
 },{  
 "name": "service-2",  
 "image": "km2411/flask-service2-aws:latest",  
 "essential": true,  
 "memory": 200,  
 "cpu": 1,  
 "links": [  
 "mongo"  
 ],  
 "environment": [  
 {  
 "name": "SERVICE2",  
 "value": "service-2"  
 },  
 {  
 "name": "SERVICE2_PORT",  
 "value": "9090"  
 }  
 ]  
 },{  
 "name": "service-1",  
 "image": "km2411/flask-service1-aws:latest",  
 "essential": true,  
 "memory": 200,  
 "cpu": 1,  
 "portMappings": [  
 {  
 "hostPort": 8080,  
 "containerPort": 8080  
 }  
 ],  
 "links": [  
 "service-2"  
 ],  
 "environment": [  
 {  
 "name": "MONGO_HOST",  
 "value": "mongo"  
 },  
 {  
 "name": "MONGO_PORT",  
 "value": "27017"  
 }  
 ]  
 }   
 ]  
 }

[ПРИМІТКА: Це може містити інші налаштування, наприклад, тут не створено томи для бази даних, але ви можете додавати їх відповідно до вашого робочого процесу.]

  • Як тільки файл Dockerrun.aws.json готовий, у каталозі проекту запускаємо
$eb init

pic

  • Тут ми вибираємо регіон, що підходить для нашого додатка, потім вибираємо додаток, який ми створили раніше в консолі, і відповідаємо "Ні" на запит щодо CodeCommit.
  • Каталог проекту виглядатиме приблизно так —

pic

  • Тепер важливою річчю є повністю кваліфіковане ім’я Docker-образів, зазначених у файлі Dockerrun.aws.js,
“image”: “km2411/flask-mongo-aws:latest
  • Оскільки нам потрібно, щоб AWS забрав образ перед запуском контейнера, ми можемо використовувати або AWS ECR, або запушити його на Docker Hub і вказати ці репозиторії.
  • Коли тестуємо локально, ми можемо побудувати образи та позначити їх відповідним чином, щоб вони відповідали файлу визначення, а потім запушити на Docker Hub
#спочатку будуємо образи локально   
$docker-compose build#позначаємо створені образи відповідним чином  
$docker image tag service-1 km2411/flask-service1-aws#пушимо образ на docker hub  
$docker login#docker push km2411/flask-service1-aws
  • Це потрібно зробити лише один раз вручну, коли ми тестуємо наш ECS Task Definition файл локально, щоб переконатися, що він працюватиме на сервері.
  • Як тільки всі образи для визначених контейнерів будуть запушені, ми можемо перевірити за допомогою —
$eb local run
  • Це запустить всі контейнери, сформує зв'язки, і ми зможемо отримати доступ до нашого додатка локально.
  • Тепер, коли це перевірено, ми можемо створити конвеєр для складання → тестування → розгортання за допомогою Travis.

Travis → AWS: Складання та розгортання

  • Спочатку нам потрібно надати дозволи Travis для доступу до наших репозиторіїв. Припускаємо, що це досить проста задача — увійдіть в Travis через Github і надайте доступ.
  • Після того, як ми зв'яжемо Travis з Github, він отримає інформацію про наші репозиторії, і ми зможемо активувати репозиторій для автоматичного запуску складання при кожному пуші змін.

pic
- У налаштуваннях відповідного репозиторію виберіть наступне або будь-який інший робочий процес, який вам потрібно виконати, але активуйте лише один.

pic

  • Далі визначаємо конфігураційний файл .travis.yml, щось таке —
language: pythonservices:  
 - dockerbefore_script: pip install docker-composescript:  
 # оскільки є залежність від mongo, він також побудує цей образ  
 # хоча ми не додали жодних тестів  
 - docker-compose run service-2 sh -c "pytest"after_success:  
 - if [["$TRAVIS_BRANCH" == "aws_deployment"]]; then  
 docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD ;  
 docker-compose build ;  
 docker tag service-1 $DOCKER_USERNAME/flask-service1-aws ;  
 docker tag service-2 $DOCKER_USERNAME/flask-service2-aws ;  
 docker tag mongo $DOCKER_USERNAME/flask-mongo-aws ;  
 docker tag nginx $DOCKER_USERNAME/flask-nginx-aws ;docker push $DOCKER_USERNAME/flask-service1-aws  
 docker push $DOCKER_USERNAME/flask-service2-aws ;  
 docker push $DOCKER_USERNAME/flask-mongo-aws ;  
 docker push $DOCKER_USERNAME/flask-nginx-aws ;fideploy:  
 provider: elasticbeanstalk  
 region: us-east-2  
 app: flask-app  
 env: FlaskApp-env-1  
 bucket-name: elasticbeanstalk-us-east-2-126562325494  
 bucket-path: flask-app  
 on:  
 branch: aws_deployment  
 access_key_id: $AWS_ACCESS_KEY  
 secret_access_key: $AWS_SECRET_KEY
  • Тепер ми просто запускаємо тести на наших змінах, а після успішного виконання пушимо код для розгортання на AWS.
  • Важливо звернути увагу на змінні середовища —
$DOCKER_USERNAME  
$DOCKER_PASSWORD  
$AWS_ACCESS_KEY  
$AWS_SECRET_KEY
  • Також на інформацію про наш додаток AWS та середовище в розділі "deploy" (розгортання), переконайтесь, що деталі збігаються з тим, що ви маєте в консолі.
  • Для отримання інформації про кошик потрібно шукати "S3" у розділі Служби в консолі AWS.
    Усі додатки на безкоштовному тарифі отримують певний обсяг пам'яті, і тут ви можете побачити кошик, який був створений для EBS. Шлях до кошика буде таким самим, як і ім'я додатка.

pic

  • Далі, для репозиторію нашого проекту ми додамо вище зазначені змінні середовища в Travis, в розділі “settings” (налаштування) для цього репозиторію, в секції “Environment Variables” (Змінні середовища), вкажемо деталі та додамо, щось таке —

pic

  • Коли все буде готово, ми можемо запушити нашу гілку в репозиторій, і Travis самостійно збере, протестує та розгорне на AWS.

Сподіваюсь, це було корисно 🙂

Посилання —

Перекладено з: Deploying a Multi-Container Web Application — AWS Elastic Beanstalk

Leave a Reply

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