Erstellen Sie eine skalierbare API auf AWS Spot-Instanzen

Hallo! Mein Name ist Kirill, ich bin CTO bei Adapty. Der größte Teil unserer Architektur basiert auf AWS, und heute werde ich darüber sprechen, wie wir die Serverkosten durch die Verwendung von Spot-Instanzen in einer Produktionsumgebung um das Dreifache senken und sie für die automatische Skalierung konfigurieren können. Zuerst gibt es eine Übersicht über die Funktionsweise und dann detaillierte Anweisungen zum Starten.



Was sind Spot-Instanzen?



Spot- Instanzen sind Server anderer AWS-Benutzer, die derzeit inaktiv sind und mit einem erheblichen Rabatt verkauft werden (Amazon schreibt nach unserer Erfahrung bis zu 90%, ~ 3x, je nach Region, AZ und Instanztyp). Ihr Hauptunterschied zu herkömmlichen besteht darin, dass sie jederzeit ausgeschaltet werden können. Daher haben wir lange Zeit geglaubt, dass es normal ist, sie für jungfräuliche Umgebungen oder für Berechnungsaufgaben zu verwenden, wobei Zwischenergebnisse auf S3 oder in der Basis gespeichert werden, aber nicht für den Verkauf. Es gibt Lösungen von Drittanbietern, mit denen Sie zum Verkauf stehende Spots verwenden können, aber es gibt viele Krücken für unseren Fall, sodass wir sie nicht implementiert haben. Der im Artikel beschriebene Ansatz funktioniert vollständig innerhalb der Standard-AWS-Funktionalität, ohne zusätzliche Skripte, Kronen usw.



Im Folgenden finden Sie einige Screenshots, die den Verlauf der Spot Instance-Preise zeigen.



m5.large in der Region eu-west-1 (Irland). Preis meist stabil für 3 Monate, derzeit 2,9x Einsparungen .



Bild



m5.large in der Region us-east-1 (N. Virginia). Der Preis hat sich seit 3 ​​Monaten ständig geändert. Derzeit liegen die Einsparungen je nach Verfügbarkeitszone zwischen 2,3x und 2,8x .



Bild



t3.small in der Region us-east-1 (N. Virginia). Der Preis ist für 3 Monate stabil, derzeit sind die Einsparungen 3,4x .



Bild



Servicearchitektur



Die grundlegende Architektur des Dienstes, über die wir in diesem Artikel sprechen werden, ist in der folgenden Abbildung dargestellt.



Bild



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 — , . , . , . , )



Bild



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, , , , .



Bild



Advanced configurations, .



Termination policies — , . . , . Launch Template (, AMI, , ). , . .



Bild



: , 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.



Bild



Security Group — , EC2 Launch Template → Network settings.



Target group — , , . Target type Instance, Protocol Port , HTTPS , . , 80 .



Health checks — . , -, -. , , . Success codes 200-399, Docker , , 304 .



Bild



Register Targets — , ECS, .



: , S3 . , SQL- S3 Athena. - . S3 .



ECS Task Definition



, , , . ECS → Task Definitions.



Launch type compatibility — EC2.



Task execution IAM roleecsTaskExecutionRole. , .



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 mappingsHost 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, .



Bild



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.



Bild



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 .



Bild



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. , .



Bild



Load balancer type — Application Load Balancer.



Service IAM roleecsServiceRole.



Load balancer name — .



Health check grace period — , 60 .



Container to load balance — Target group name , .



Bild



Service Auto Scaling — . Configure Service Auto Scaling to adjust your service’s desired count. .



IAM role for Service Auto ScalingAWSServiceRoleForApplicationAutoScaling_ECSService.



Automatic task scaling policies — . 2 :



  1. Target tracking — ( CPU/RAM ). , 85%, , , . , , (Disable scale-in).
  2. Step scaling — . (CloudWatch Alarm), , , .


, , , .





Docker , .



Bild



  1. , . .
  2. , , .
  3. , .
  4. , , 3 .
  5. , , .
  6. Capacity Provider, (), .
  7. .


, , email-, .



. , - . 1+ . API, . , - , , .



, ECS - .



, serverless ( ) GitLab CI Terraform Cloud.



, !




All Articles