AWS Elastic Beanstalk Ft. Docker для развертывания простого веб-приложения

16 июня, то есть два дня назад, я заметил, что AWS Elastic Beanstalk доступен в регионе Индонезии (Джакарта). Поскольку я никогда не пользовался этим сервисом, я решил изучить его. Самой интересной частью (для меня) является EB CLI. Инструмент командной строки для управления средами, но он используется отдельно от AWS CLI.

Что такое AWS Elastic Beanstalk?

По сути, это простой в использовании сервис для развертывания и управления приложениями без забот об инфраструктуре. Да, это просто! Почему? Потому что все, что нам нужно сделать, это загрузить код, а Beanstalk сделает все остальное для развертывания и обеспечения инфраструктуры. Пропускная способность, балансировка нагрузки, масштабирование и мониторинг состояния? Пусть Beanstalk сделает все это за вас.
Подробнее об AWS Elastic Beanstalk.

Подготовка

  • Установите EB CLI
  • Docker-код (Docker Compose, Dockerrun (JSON), Dockerfile)
  • Образ Docker (вы можете использовать мой пользовательский образ здесь)

Как установить EB CLI

  • Клонируйте репозиторий здесь
  • Установите предварительные условия (Git, Python, virtualenv). В данном случае я установил Git и Python. Поэтому здесь я покажу вам, как установить virtualenv с помощью pipx, если у вас уже есть Python 3.5+.
$ sudo apt install python3.8-venv
$ sudo apt install pipx
$ pipx install virtualenv
  installed package virtualenv 20.14.1, Python 3.8.10
  These binaries are now globally available
    - virtualenv
done! ✨ 🌟 ✨
$ git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git
$ python3 ./aws-elastic-beanstalk-cli-setup/scripts/ebcli_installer.py
Success!
Вход в полноэкранный режим Выйти из полноэкранного режима

Выполните приведенную ниже команду, чтобы завершить установку:
(замените /home/nurulramadhona на свой собственный)

$ echo 'export PATH="/home/nurulramadhona/.ebcli-virtual-env/executables:$PATH"' >> ~/.bash_profile && source ~/.bash_profile
Войти в полноэкранный режим Выйти из полноэкранного режима

После того, как вы запустили ее один раз, вам просто нужно убрать последнюю часть в любое время, когда вы хотите запустить команду eb, иначе она будет выведена как не найденная.

$ source ~/.bash_profile
Вход в полноэкранный режим Выход из полноэкранного режима

Код Docker

Здесь я буду использовать все три вида файлов, которые могут быть использованы для развертывания Docker на Beanstalk.

  • Docker Compose (docker-compose.yml)
version: '3.8'
services:
  docker-httpd:
    image: "nurulramadhona/httpd:eb"
    ports:
      - "80:80"
Войти в полноэкранный режим Выйти из полноэкранного режима
  • JSON-файл AWS (Dockerrun.aws.json)
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "nurulramadhona/httpd:eb",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "80"
    }
  ]
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Dockerfile
FROM nurulramadhona/httpd:eb
EXPOSE 80
Войти в полноэкранный режим Выход из полноэкранного режима

Сценарий развертывания

  1. Создайте приложение с именем docker-httpd.
  2. Создайте среду по умолчанию (первую) под названием docker-httpd-1 с помощью Docker Compose
  3. Создайте второе окружение с именем docker-httpd-2 с помощью файла JSON
  4. Обновите версию приложения в среде по умолчанию с помощью Dockerfile
  5. Очистка

1. Создайте приложение с именем docker-httpd.
Не забудьте указать регион (по умолчанию us-west-2)!

docker-httpd$ ls
docker-compose.yml
docker-httpd$ eb init -p docker docker-httpd --region ap-southeast-3
Application docker-httpd has been created.
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Поскольку мы еще не создали никакого окружения, оно будет показано ниже (окружение по умолчанию отсутствует):

docker-httpd$ cat .elasticbeanstalk/config.yml
branch-defaults:
  default:
    environment: null
    group_suffix: null
global:
  application_name: docker-httpd
  branch: null
  default_ec2_keyname: null
  default_platform: Docker
  default_region: ap-southeast-3
  include_git_submodules: true
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: null
  repository: null
  sc: null
  workspace_type: Application
Вход в полноэкранный режим Выход из полноэкранного режима

2. Создайте окружение по умолчанию (первое) с именем docker-httpd-1 с помощью Docker Compose

docker-httpd$ eb create docker-httpd-1
Creating application version archive "app-220617_211333370958".
Uploading docker-httpd/app-220617_211333370958.zip to S3. This may take a while.
Upload Complete.
Environment details for: docker-httpd-1
  Application name: docker-httpd
  Region: ap-southeast-3
  Deployed Version: app-220617_211333370958
  Environment ID: e-z63ppcgfaz
  Platform: arn:aws:elasticbeanstalk:ap-southeast-3::platform/Docker running on 64bit Amazon Linux 2/3.4.16
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2022-06-17 14:13:35.987000+00:00
Printing Status:
2022-06-17 14:13:34    INFO    createEnvironment is starting.
2022-06-17 14:13:36    INFO    Using elasticbeanstalk-ap-southeast-3-0123456789 as Amazon S3 storage bucket for environment data.
2022-06-17 14:14:01    INFO    Created security group named: sg-0f99f2ab062ebe5c9
2022-06-17 14:14:01    INFO    Created load balancer named: awseb-e-z-AWSEBLoa-1E4YND1PICBNS
2022-06-17 14:14:01    INFO    Created security group named: awseb-e-z63ppcgfaz-stack-AWSEBSecurityGroup-2LXB5URL2CCF
2022-06-17 14:14:04    INFO    Created Auto Scaling launch configuration named: awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingLaunchConfiguration-D8PQPWW5Y1KA
2022-06-17 14:14:50    INFO    Created Auto Scaling group named: awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingGroup-1PBPMIY0QO6SJ
2022-06-17 14:14:50    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2022-06-17 14:14:51    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:5695560d-c4e9-4c00-a62f-5627a18292eb:autoScalingGroupName/awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingGroup-1PBPMIY0QO6SJ:policyName/awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingScaleUpPolicy-5TXO4SOR1647
2022-06-17 14:14:51    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:aad4ed86-b263-4cf2-8f17-0b662f276158:autoScalingGroupName/awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingGroup-1PBPMIY0QO6SJ:policyName/awseb-e-z63ppcgfaz-stack-AWSEBAutoScalingScaleDownPolicy-1BK8R8A0N83FE
2022-06-17 14:14:51    INFO    Created CloudWatch alarm named: awseb-e-z63ppcgfaz-stack-AWSEBCloudwatchAlarmHigh-1D7JBUMLBSEOH
2022-06-17 14:14:51    INFO    Created CloudWatch alarm named: awseb-e-z63ppcgfaz-stack-AWSEBCloudwatchAlarmLow-1W0MKMBWE1Q7Y
2022-06-17 14:15:09    INFO    Instance deployment completed successfully.
2022-06-17 14:15:39    INFO    Application available at docker-httpd-1.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com.
2022-06-17 14:15:40    INFO    Successfully launched environment: docker-httpd-1
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда мы создаем окружение, мы также видим список сервисов, созданных Beanstalk. Это ведро S3, группа безопасности, ELB (классический по умолчанию), ASG, экземпляр EC2, CloudWatch и SNS.

Так как это первое созданное окружение, оно будет окружением по умолчанию. Поэтому, когда мы запускаем команду eb без указания имени среды, она будет ссылаться на эту среду.

Например:

docker-httpd$ eb status
Environment details for: docker-httpd-1
  Application name: docker-httpd
  Region: ap-southeast-3
  Deployed Version: app-220617_213146077755
  Environment ID: e-z63ppcgfaz
  Platform: arn:aws:elasticbeanstalk:ap-southeast-3::platform/Docker running on 64bit Amazon Linux 2/3.4.16
  Tier: WebServer-Standard-1.0
  CNAME: docker-httpd-1.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com
  Updated: 2022-06-17 14:32:10.908000+00:00
  Status: Ready
  Health: Green
Войти в полноэкранный режим Выйти из полноэкранного режима

Давайте попробуем создать еще одно окружение, чтобы увидеть разницу!

3. Создадим второе окружение с именем docker-httpd-2 с помощью файла JSON
Удалите файл Docker Compose, который использовался для создания предыдущего окружения, и замените его на Dockerfile (оставьте его в директории).

docker-httpd$ rm docker-compose.yml 
docker-httpd$ cp ~/Documents/Dockerrun.aws.json .
docker-httpd$ ls
Dockerrun.aws.json
docker-httpd$ eb create docker-httpd-2
Creating application version archive "app-220617_212526081764".
Uploading docker-httpd/app-220617_212526081764.zip to S3. This may take a while.
Upload Complete.
Environment details for: docker-httpd-2
  Application name: docker-httpd
  Region: ap-southeast-3
  Deployed Version: app-220617_212526081764
  Environment ID: e-ymggxu7mai
  Platform: arn:aws:elasticbeanstalk:ap-southeast-3::platform/Docker running on 64bit Amazon Linux 2/3.4.16
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2022-06-17 14:25:28.486000+00:00
Printing Status:
2022-06-17 14:25:27    INFO    createEnvironment is starting.
2022-06-17 14:25:28    INFO    Using elasticbeanstalk-ap-southeast-3-0123456789 as Amazon S3 storage bucket for environment data.
2022-06-17 14:25:47    INFO    Created security group named: sg-06d732826fb0be349
2022-06-17 14:25:47    INFO    Created load balancer named: awseb-e-y-AWSEBLoa-165JPKXMH3INE
2022-06-17 14:25:47    INFO    Created security group named: awseb-e-ymggxu7mai-stack-AWSEBSecurityGroup-109X7DG8OVDK4
2022-06-17 14:25:50    INFO    Created Auto Scaling launch configuration named: awseb-e-ymggxu7mai-stack-AWSEBAutoScalingLaunchConfiguration-8LOZJ395SOJH
2022-06-17 14:26:21    INFO    Created Auto Scaling group named: awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1
2022-06-17 14:26:21    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2022-06-17 14:26:37    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:3ae34021-b577-470e-a493-8f4d88eda4dc:autoScalingGroupName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1:policyName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingScaleDownPolicy-1KY50QYHQU7OG
2022-06-17 14:26:37    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:ced74c25-be73-400d-a091-0dc729bea30a:autoScalingGroupName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1:policyName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingScaleUpPolicy-UNTK443C5E5G
2022-06-17 14:26:37    INFO    Created CloudWatch alarm named: awseb-e-ymggxu7mai-stack-AWSEBCloudwatchAlarmHigh-19INLYY0IX1XT
2022-06-17 14:26:37    INFO    Created CloudWatch alarm named: awseb-e-ymggxu7mai-stack-AWSEBCloudwatchAlarmLow-HMS29K3VMYEK
2022-06-17 14:26:57    INFO    Instance deployment completed successfully.
2022-06-17 14:27:11    INFO    Application available at docker-httpd-2.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com.
2022-06-17 14:27:11    INFO    Successfully launched environment: docker-httpd-2
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Затем, давайте откроем веб-страницу по указанному URL!

docker-httpd$ eb open docker-httpd-2
docker-httpd$ curl docker-httpd-2.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com
<html><body><h1>AWS Elastic Beanstalk is now available in the Asia Pacific (Jakarta) Region</h1></body></html>
Вход в полноэкранный режим Выход из полноэкранного режима

Ниже показан автоматический вывод, открывающийся в веб-браузере при выполнении команды eb open docker-httpd-2:

В любом случае, URL или CNAME имеет тот же формат:

2022-06-17 14:15:39    INFO    Application available at docker-httpd-1.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com.
2022-06-17 14:27:11    INFO    Application available at docker-httpd-2.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com.
Вход в полноэкранный режим Выход из полноэкранного режима

4. Обновление версии приложения в среде по умолчанию с помощью Dockerfile
Итак, теперь у нас есть два окружения. Затем мы собираемся внести какие-либо изменения, не разрушая существующее окружение. Это действие можно выполнить с помощью команды eb, которая аналогична той, что мы загружаем новую версию приложения и развертываем в определенном окружении через консоль. Сейчас мы заменим ее на Dockerfile, поскольку ранее мы уже работали с Docker Compose и JSON-файлом.

docker-httpd$ rm Dockerrun.aws.json 
docker-httpd$ cp ~/Documents/Dockerfile .
docker-httpd$ eb deploy
Creating application version archive "app-220617_213146077755".
Uploading docker-httpd/app-220617_213146077755.zip to S3. This may take a while.
Upload Complete.
2022-06-17 14:31:47    INFO    Environment update is starting.      
2022-06-17 14:31:50    INFO    Deploying new version to instance(s).
2022-06-17 14:32:07    INFO    Instance deployment completed successfully.
2022-06-17 14:32:10    INFO    New application version was deployed to running EC2 instances.
2022-06-17 14:32:10    INFO    Environment update completed successfully.

docker-httpd$ curl docker-httpd-1.eba-rdewef8v.ap-southeast-3.elasticbeanstalk.com
<html><body><h1>AWS Elastic Beanstalk is now available in the Asia Pacific (Jakarta) Region</h1></body></html>
docker-httpd$ eb open
Вход в полноэкранный режим Выход из полноэкранного режима

Мы также можем запускать любые другие команды eb для управления окружением, такие как eb events, eb config, eb health и т.д.

docker-httpd$ eb logs --all
Retrieving logs...
Logs were saved to /media/nurulramadhona/ops/docker-httpd/.elasticbeanstalk/logs/220617_215923
Logs were saved to /media/nurulramadhona/ops/docker-httpd/.elasticbeanstalk/logs/220617_215923
Updated symlink at /media/nurulramadhona/ops/docker-httpd/.elasticbeanstalk/logs/latest
docker-httpd$ eb health docker-httpd-2
 docker-httpd-2                                                                   Ok                                                                  2022-06-17 21:57:59WebServer                                                                                                                   Docker running on 64bit Amazon Linux 2/3.4.16  total      ok    warning  degraded  severe    info   pending  unknown 
    1        1        0        0        0        0        0        0    

  instance-id           status     cause                                                                                                                         health  
    Overall             Ok                
  i-0a935fb414a0bf7b5   Ok                

  instance-id           r/sec    %2xx   %3xx   %4xx   %5xx      p99      p90      p75     p50     p10                                                          requests  
    Overall             0.0         -      -      -      -         -        -       -       -       -
  i-0a935fb414a0bf7b5   0.0         -      -      -      -         -        -       -       -       -

  instance-id           type       az   running     load 1  load 5      user %  nice %  system %  idle %   iowait %                                                 cpu  
  i-0a935fb414a0bf7b5   t3.micro   3a   32 mins       0.02    0.02         0.1     0.0       0.0    99.9        0.0

  instance-id           status     id   version                   ago                                                                                       deployments  
  i-0a935fb414a0bf7b5   Deployed   1    app-220617_212526081764   31 mins
Вход в полноэкранный режим Выход из полноэкранного режима

5. Очистка
Как я уже говорил выше, есть список служб, которые создаются для нас при создании среды, но не все части приложения Beanstalk будут удалены при завершении работы среды или даже самого приложения.

Перед этим давайте завершим оба окружения, которые мы создали выше!

docker-httpd$ eb terminate docker-httpd-2
The environment "docker-httpd-2" and all associated instances will be terminated.
To confirm, type the environment name: docker-httpd-2
2022-06-17 15:08:04    INFO    terminateEnvironment is starting.
2022-06-17 15:08:21    INFO    Deleted CloudWatch alarm named: awseb-e-ymggxu7mai-stack-AWSEBCloudwatchAlarmLow-HMS29K3VMYEK 
2022-06-17 15:08:21    INFO    Deleted CloudWatch alarm named: awseb-e-ymggxu7mai-stack-AWSEBCloudwatchAlarmHigh-19INLYY0IX1XT 
2022-06-17 15:08:21    INFO    Deleted Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:ced74c25-be73-400d-a091-0dc729bea30a:autoScalingGroupName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1:policyName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingScaleUpPolicy-UNTK443C5E5G
2022-06-17 15:08:21    INFO    Deleted Auto Scaling group policy named: arn:aws:autoscaling:ap-southeast-3:0123456789:scalingPolicy:3ae34021-b577-470e-a493-8f4d88eda4dc:autoScalingGroupName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1:policyName/awseb-e-ymggxu7mai-stack-AWSEBAutoScalingScaleDownPolicy-1KY50QYHQU7OG
2022-06-17 15:08:21    INFO    Waiting for EC2 instances to terminate. This may take a few minutes.
2022-06-17 15:11:39    INFO    Deleted Auto Scaling group named: awseb-e-ymggxu7mai-stack-AWSEBAutoScalingGroup-CTHY5BO16CT1
2022-06-17 15:11:39    INFO    Deleted load balancer named: awseb-e-y-AWSEBLoa-165JPKXMH3INE
2022-06-17 15:11:39    INFO    Deleted Auto Scaling launch configuration named: awseb-e-ymggxu7mai-stack-AWSEBAutoScalingLaunchConfiguration-8LOZJ395SOJH
2022-06-17 15:11:39    INFO    Deleted security group named: awseb-e-ymggxu7mai-stack-AWSEBSecurityGroup-109X7DG8OVDK4
2022-06-17 15:11:54    INFO    Deleted security group named: sg-06d732826fb0be349
2022-06-17 15:11:58    INFO    Deleting SNS topic for environment docker-httpd-2.
2022-06-17 15:11:59    INFO    terminateEnvironment completed successfully.
Вход в полноэкранный режим Выйти из полноэкранного режима

Сделайте то же самое для другого окружения!

docker-httpd$ eb terminate
The environment "docker-httpd-1" and all associated instances will be terminated.
To confirm, type the environment name: docker-httpd-1

docker-httpd$ eb list
docker-httpd$
Войти в полноэкранный режим Выйти из полноэкранного режима

Итак, здесь две вещи все еще существуют!

docker-httpd$ aws s3 ls
2022-06-17 21:13:45 elasticbeanstalk-ap-southeast-3-0123456789
docker-httpd$ aws elasticbeanstalk describe-applications | grep Name
  ApplicationName: docker-httpd
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте удалим обе службы!

  • S3

Ведро, созданное Beanstalk, используется для всех приложений Beanstalk, созданных под нашей учетной записью AWS (возможно, это причина, по которой ведро сохраняется, даже если мы завершаем приложение). К нему прикреплена политика с правилами, разрешающими GET и запрещающими любые другие операции. Только роли Beanstalk разрешено делать с ним что-либо. Но поскольку я выступаю в роли администратора, у меня есть другой способ удалить его, который заключается в том, чтобы сначала удалить политику bucket.

docker-httpd$ aws s3 rm s3://elasticbeanstalk-ap-southeast-3-0123456789 --recursive
docker-httpd$ aws s3api delete-bucket --bucket elasticbeanstalk-ap-southeast-3-0123456789

An error occurred (AccessDenied) when calling the DeleteBucket operation: Access Denied
docker-httpd$ aws s3api delete-bucket-policy --bucket elasticbeanstalk-ap-southeast-3-0123456789
docker-httpd$ aws s3api delete-bucket --bucket elasticbeanstalk-ap-southeast-3-0123456789
docker-httpd$ aws s3 ls
docker-httpd$
Вход в полноэкранный режим Выход из полноэкранного режима
  • Приложение Elastic Beanstalk
docker-httpd$ aws elasticbeanstalk delete-application --application-name docker-httpd
docker-httpd$ aws elasticbeanstalk describe-applications
Applications: []
Вход в полноэкранный режим Выход из полноэкранного режима

Итак, мы справились с заданием!

Спасибо, что пришли, и я с нетерпением жду ваших отзывов. Следите за мной, чтобы получать уведомления о публикации новых статей!

Ссылки:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/docker.html
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-getting-started.html

Оцените статью
Procodings.ru
Добавить комментарий