AWSスポットインスタンスでスケーラブルなAPIを構築する

こんにちは!私の名前はキリルです。私はAdaptyのCTOです。アーキテクチャのほとんどはAWS上にあります。本日は、本番環境でスポットインスタンスを使用してサーバーコストを3倍削減する方法と、自動スケーリングするように構成する方法について説明します。最初にそれがどのように機能するかの概要があり、次に開始のための詳細な説明があります。



スポットインスタンスとは何ですか?



スポットインスタンスは、現在アイドル状態であり、大幅な割引価格で販売されている他のAWSユーザーのサーバーです(Amazonは最大90%書き込み、経験上3倍、リージョン、AZ、インスタンスタイプによって異なります)。従来のものとの主な違いは、いつでもオフにできることです。したがって、S3またはベースで中間結果を保存しながら、バージン環境または何かを計算するタスクにそれらを使用することは通常のことであると長い間信じていましたが、販売には使用しませんでした。販売中のスポットを使用できるサードパーティのソリューションはありますが、私たちのケースには多くの松葉杖があるため、実装しませんでした。記事で説明されているアプローチは、追加のスクリプトやクラウンなどなしで、標準のAWS機能内で完全に機能します。



以下は、スポットインスタンスの価格の履歴を示すスクリーンショットです。



m5.largeにおけるEU-1西部地域-(アイルランド)。価格は3か月間ほぼ安定しており、現在は2.9倍の節約になります。



画像



m5.large私たち-東-1地域(N.バージニア州)。価格は3か月間絶えず変化していますが、現在の節約額はアベイラビリティーゾーンに応じて2.3倍から2.8倍です。



画像



t3.small私たち-東-1地域(N.バージニア州)。価格は3か月間安定しており、現在の節約額は3.4倍です。



画像



サービスアーキテクチャ



この記事で説明するサービスの基本的なアーキテクチャーを下の図に示します。



画像



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



画像



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



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



Automatic task scaling policies — . 2 :



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


, , , .





Docker , .



画像



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


, , email-, .



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



, ECS - .



, serverless ( ) GitLab CI Terraform Cloud.



, !




All Articles