salut! Je m'appelle Kirill, je suis CTO chez Adapty. La plupart de notre architecture est sur AWS, et aujourd'hui, je vais parler de la façon dont nous réduisons les coûts de serveur de 3x en utilisant des instances Spot dans un environnement de production, ainsi que de la façon de les configurer pour une mise à l'échelle automatique. Il y aura d'abord un aperçu de son fonctionnement, puis des instructions détaillées pour commencer.
Que sont les instances Spot?
Les instances ponctuelles sont des serveurs d'autres utilisateurs AWS qui sont actuellement inactifs et qui se vendent à un rabais important (Amazon écrit jusqu'à 90%, ~ 3x selon notre expérience, varie selon la région, l'AZ et le type d'instance). Leur principale différence par rapport aux systÚmes conventionnels est qu'ils peuvent s'éteindre à tout moment. Par conséquent, pendant longtemps, nous avons pensé qu'il était normal de les utiliser pour des environnements vierges, ou pour des tùches de calcul de quelque chose, avec sauvegarde des résultats intermédiaires sur S3 ou dans la base, mais pas pour la vente. Il existe des solutions tierces qui vous permettent d'utiliser des spots en vente, mais il y a beaucoup de béquilles pour notre cas, nous ne les avons donc pas implémentées. L'approche décrite dans l'article fonctionne entiÚrement dans le cadre de la fonctionnalité AWS standard, sans scripts supplémentaires, couronnes, etc.
Vous trouverez ci-dessous quelques captures d'Ă©cran qui montrent l'historique des prix des instances Spot.
m5.large dans la région eu-west-1 (Irlande). Prix globalement stable pendant 3 mois, actuellement 2,9x d' économies .
m5.large dans la région us-east-1 (Virginie du Nord). Le prix est en constante évolution depuis 3 mois, actuellement les économies sont de 2,3x à 2,8x selon la zone de disponibilité.
t3.small dans la région us-east-1 (Virginie du Nord). Le prix est stable pendant 3 mois, actuellement les économies sont de 3,4x .
Architecture de service
L'architecture de base du service, dont nous parlerons dans cet article, est illustrée dans le schéma ci-dessous.
Application Load Balancer â EC2 Target Group â Elastic Container Service
Application Load Balancer (ALB), EC2 Target Group (TG). TG , ALB Elastic Container Service (ECS). ECS â Kubernetes AWS, Docker .
, . ECS TG, ( Kubernetes ), . TG , health check, - , .
EC2 Auto Scaling Groups + ECS Capacity Providers
EC2 Auto Scaling Groups (ASG). , . AWS ECS. ECS , , CPU, RAM . , .
ECS Capacity Providers (ECS CP). ECS ASG, , ( ASG). , ECS CP , ASG, . ECS CP , , , .
EC2 Launch Templates
, , , â EC2 Launch Templates. , , . , , . , . , , ECS .
â ECS_ENABLE_SPOT_INSTANCE_DRAINING=true. , ECS , , , Draining. , , , . . 2 . 2 , .
â AWS Elastic File System (EFS) ECS, , , . SIGINT ( Draining) 30 , , ECS_CONTAINER_STOP_TIMEOUT. 2 .
. , . , - . AWS, CloudFormation Terraform. Adapty Terraform.
EC2 Launch Template
, . EC2 -> Instances -> Launch templates.
Amazon machine image (AMI) â , . ECS Amazon. ECS. ID , Amazon ECS-optimized AMIs, AMI ID . , us-east-1 ID â ami-00c7c1cf5bdc913ed. ID Specify a custom value.
Instance type â . , .
Key pair (login) â , SSH, .
Network settings â . Networking platform Virtual Private Cloud (VPC). Security groups â . , , . 2 , , (inbound) 80 (http) 443 (https), , . (outbound) TCP . , , - .
Storage (volumes) â . , AMI, ECS Optimized â 30 GiB.
Advanced details â .
Purchasing option â . , , Auto Scaling Group, .
IAM instance profile â , . , ECS, , ecsInstanceRole. , , , . .
, , . EBS-optimized instance T2/T3 Unlimited, burstable .
User data â . /etc/ecs/ecs.config
, ECS.
, user data:
#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={\"registry.gitlab.com\":{\"username\":\"username\",\"password\":\"password\"}}" >> /etc/ecs/ecs.config
ECS_CLUSTER=DemoApiClusterProd
â , , . , .
ECS_ENABLE_SPOT_INSTANCE_DRAINING=true
â , , Draining.
ECS_CONTAINER_STOP_TIMEOUT=1m
â , SIGINT, 1 , .
ECS_ENGINE_AUTH_TYPE=docker
â , docker-
ECS_ENGINE_AUTH_DATA=...
â container registry, Docker . , .
Docker Hub, ECS_ENGINE_AUTH_TYPE
ECS_ENGINE_AUTH_DATA
.
: AMI, Docker, Linux, ECS . , . email , Lambda-, Launch Template AMI.
EC2 Auto Scaling Group
Auto Scaling Group . EC2 -> Auto Scaling -> Auto Scaling Groups.
Launch template â . .
Purchase options and instance types â . Adhere to launch template Launch Template. Combine purchase options and instance types . .
Optional On-Demand base â , , .
On-Demand percentage above base â , 50-50 , 20-80 4 . 50-50, 20-80, 0-100.
Instance types â , . , . , . , )
Network â , VPC , .
Load balancing â , , . Health checks .
Group size â . , .
Scaling policies â , , ECS , .
Instance scale-in protection â . , ASG , . , , ECS Capacity Provider.
Add tags â ( Tag new instances). Name, , , , .
Advanced configurations, .
Termination policies â , . . , . Launch Template (, AMI, , ). , . .
: , Instance Refresh. Lambda- , . instance scale-in protection . , , Instance management.
Application Load Balancer EC2 Target Group
EC2 â Load Balancing â Load Balancers. Application Load Balancer, .
Listeners â 80 443 80 443 .
Availability Zones â .
Configure Security Settings â SSL- , â ACM. Security Policy , ELBSecurityPolicy-2016-08
. , DNS name, CNAME . , Cloudflare.
Security Group â , EC2 Launch Template â Network settings.
Target group â , , . Target type Instance, Protocol Port , HTTPS , . , 80 .
Health checks â . , -, -. , , . Success codes 200-399, Docker , , 304 .
Register Targets â , ECS, .
: , S3 . , SQL- S3 Athena. - . S3 .
ECS Task Definition
, , , . ECS â Task Definitions.
Launch type compatibility â EC2.
Task execution IAM role â ecsTaskExecutionRole
. , .
Container Definitions Add Container.
Image â , Docker Hub bitnami/node-example:0.0.1.
Memory Limits â . Hard Limit â , , docker kill, . Soft Limit â , , . , 4 GiB , soft limit â 2048 MiB, 2 . 4 GiB â , 4096 MiB, ECS Instances . Soft limit hard limit. , , .
Port mappings â Host port 0, , , Target Group. Container Port â , , , , Dockerfile . 3000, Dockerfile .
Health check â , , Target Group.
Environment â . CPU units â Memory limits, . â 1024 , , 512, 4 . CPU units , .
Command â , . gunicorn, npm . , CMD Dockerfile. npm,start
.
Environment variables â . , Secrets Manager Parameter Store.
Storage and Logging â CloudWatch Logs ( AWS). Auto-configure CloudWatch Logs. Task Definition CloudWatch. , Retention period Never Expire . CloudWatch Log groups, .
ECS Cluster ECS Capacity Provider
ECS â Clusters, . EC2 Linux + Networking.
Cluster name â , , Launch Template ECS_CLUSTER
, â DemoApiClusterProd
. Create an empty cluster. Container Insights, CloudWatch. , ECS Instances , Auto Scaling group.
Capacity Providers . , , ECS . , .
Auto Scaling group â .
Managed scaling â , .
Target capacity % â . 100%, . 50%, . , , , .
Managed termination protection â , . , Target capacity %.
ECS Service
:) , Services.
Launch type â Switch to capacity provider strategy .
Task Definition â Task Definition .
Service name â , , Task Definition.
Service type â Replica.
Number of tasks â . , .
Minimum healthy percent Maximum percent â . 100 200, , 2 , . 1 , min=0, max=100, , , . 1 , min=50, max=150, , 1 .
Deployment type â Rolling update.
Placement Templates â . AZ Balanced Spread â , , . BinPack â CPU Spread â AZ, CPU. , .
Load balancer type â Application Load Balancer.
Service IAM role â ecsServiceRole
.
Load balancer name â .
Health check grace period â , 60 .
Container to load balance â Target group name , .
Service Auto Scaling â . Configure Service Auto Scaling to adjust your serviceâs desired count. .
IAM role for Service Auto Scaling â AWSServiceRoleForApplicationAutoScaling_ECSService
.
Automatic task scaling policies â . 2 :
- Target tracking â ( CPU/RAM ). , 85%, , , . , , (Disable scale-in).
- Step scaling â . (CloudWatch Alarm), , , .
, , , .
Docker , .
- , . .
- , , .
- , .
- , , 3 .
- , , .
- Capacity Provider, (), .
- .
. , - . 1+ . API, . , - , , .
, ECS - .
, serverless ( ) GitLab CI Terraform Cloud.
, !