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
Сценарий развертывания
- Создайте приложение с именем
docker-httpd
. - Создайте среду по умолчанию (первую) под названием
docker-httpd-1
с помощью Docker Compose - Создайте второе окружение с именем
docker-httpd-2
с помощью файла JSON - Обновите версию приложения в среде по умолчанию с помощью Dockerfile
- Очистка
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