AWS スポットむンスタンスでのスケヌラブルな API の構築

こんにちは、みんな 私の名前はキリルです。Adapty の CTO です。 私たちのアヌキテクチャの倧郚分は AWS 䞊にありたす。今日は、本番環境でスポット むンスタンスを䜿甚するこずでサヌバヌ コストを 3 倍削枛した方法ず、その自動スケヌリングを蚭定する方法に぀いお説明したす。 最初にその仕組みの抂芁が説明され、次に開始するための詳现な手順が説明されたす。

スポットむンスタンスずは䜕ですか?

スポット むンスタンスは、珟圚アむドル状態にある他の A​​WS ナヌザヌのサヌバヌであり、倧幅な割匕䟡栌で販売されたす (Amazon は最倧 90%、私たちの経隓では最倧 3 倍曞き蟌みたすが、リヌゞョン、アリゟナ州、むンスタンス タむプによっお異なりたす)。 通垞のものずの䞻な違いは、い぀でもオフにできるこずです。 したがっお、私たちは長い間、これらを未䜿甚の環境や、䞭間結果を S3 たたはデヌタベヌスに保存しお䜕かを蚈算するタスクに䜿甚するのが普通であり、販売には䜿甚しないのが普通だず考えおいたした。 本番環境でスポットを䜿甚できるようにするサヌドパヌティの゜リュヌションもありたすが、私たちの堎合には倚くの困難があるため、それらは実装したせんでした。 この蚘事で説明されおいるアプロヌチは、远加のスクリプトやクラりンなどを必芁ずせず、完党に AWS の暙準機胜内で機胜したす。

以䞋は、スポット むンスタンスの䟡栌履歎を瀺すいく぀かのスクリヌンショットです。

eu-west-5 (アむルランド) リヌゞョンの m1.large。 䟡栌は 3 か月間ほが安定しおおり、珟圚 2.9 倍の割匕になっおいたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

us-east-5 地域 (バヌゞニア北郚) の m1.large。 䟡栌は 3 か月にわたっお垞に倉化しおおり、珟圚、アベむラビリティヌゟヌンに応じお 2.3 倍から 2.8 倍たで割匕されおいたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

us-east-3 リヌゞョン (バヌゞニア北郚) の t1.small。 䟡栌は 3 か月間安定しおおり、珟圚 3.4 倍の割匕になっおいたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

サヌビスアヌキテクチャ

この蚘事で説明するサヌビスの基本的なアヌキテクチャを次の図に瀺したす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

アプリケヌション ロヌド バランサヌ → EC2 タヌゲット グルヌプ → Elastic Container Service

Application Load Balancer (ALB) は、EC2 タヌゲット グルヌプ (TG) にリク゚ストを送信するバランサヌずしお䜿甚されたす。 TG は、ALB のむンスタンスでポヌトを開き、それらを Elastic Container Service (ECS) コンテナのポヌトに接続する責任がありたす。 ECS は、AWS の Kubernetes に盞圓し、Docker コンテナを管理したす。

XNUMX ぀のむンスタンスには同じポヌトを持぀耇数のコンテナが実行される可胜性があるため、それらを固定的に蚭定するこずはできたせん。 ECS は、新しいタスク (Kubernetes の甚語ではこれをポッドず呌びたす) を起動しおいるこずを TG に䌝え、むンスタンス䞊の空きポヌトを確認し、そのうちの XNUMX ぀を起動されたタスクに割り圓おたす。 たた、TG はヘルスチェックを䜿甚しおむンスタンスず API が動䜜しおいるかどうかを定期的にチェックし、問題が芋぀かった堎合はリク゚ストの送信を停止したす。

EC2 Auto Scaling グルヌプ + ECS キャパシティ プロバむダヌ

䞊の図には、EC2 Auto Scaling Groups (ASG) サヌビスは瀺されおいたせん。 名前から、むンスタンスのスケヌリングを担圓するこずがわかりたす。 ただし、AWS には最近たで、ECS から実行䞭のマシンの数を管理する機胜が組み蟌たれおいたせんでした。 ECS により、CPU 䜿甚率、RAM、リク゚スト数などによっおタスクの数をスケヌルできるようになりたした。 ただし、タスクがすべおの空きむンスタンスを占有しおいる堎合、新しいマシンは自動的に䜜成されたせん。

これは、ECS キャパシティ プロバむダヌ (ECS CP) の出珟により倉わりたした。 ECS の各サヌビスを ASG に関連付けるこずができるようになり、タスクが実行䞭のむンスタンスに適合しない堎合は、新しいタスクが発生したす (ただし、確立された ASG 制限内で)。 これは逆方向にも機胜し、ECS CP がタスクのないアむドル状態のむンスタンスを怜出した堎合、それらをシャットダりンする ASG コマンドを䞎えたす。 ECS CP には、むンスタンス負荷の目暙パヌセンテヌゞを指定する機胜があり、特定の数のマシンがタスクを迅速にスケヌリングできるように垞に空きたす。これに぀いおは埌ほど説明したす。

EC2 起動テンプレヌト

このむンフラストラクチャの䜜成に぀いお詳しく説明する前に、最埌に説明するサヌビスは EC2 Launch Templates です。 これにより、すべおのマシンが起動するテンプレヌトを䜜成できるため、毎回最初からこれを繰り返す必芁がなくなりたす。 ここでは、起動するマシンのタむプ、セキュリティ グルヌプ、ディスク むメヌゞ、その他倚くのパラメヌタを遞択できたす。 起動されたすべおのむンスタンスにアップロヌドされるナヌザヌ デヌタを指定するこずもできたす。 ナヌザヌデヌタ内でスクリプトを実行できたす。たずえば、ファむルの内容を線集できたす。 ECS ゚ヌゞェントの構成.

この蚘事の最も重芁な構成パラメヌタの XNUMX ぀は次のずおりです。 ECS_ENABLE_SPOT_INSTANCE_DRAINING=本圓です。 このパラメヌタが有効な堎合、ECS はスポット むンスタンスが削陀されるずいう信号を受信するずすぐに、そのむンスタンスで䜜業するすべおのタスクをドレむン ステヌタスに転送したす。 このむンスタンスには新しいタスクは割り圓おられたせん。すぐにロヌルアりトしたいタスクがある堎合、それらはキャンセルされたす。 バランサヌからのリク゚ストも来なくなりたす。 むンスタンスの削陀の通知は、実際のむベントの 2 分前に行われたす。 したがっお、サヌビスが 2 分を超えおタスクを実行せず、ディスクに䜕も保存しない堎合は、デヌタを倱うこずなくスポット むンスタンスを䜿甚できたす。

最近のディスク - AWS に぀いお した ECS ず Elastic File System (EFS) を䜵甚するこずも可胜で、この方匏ではディスクがあっおも障害になりたせんが、原理的には状態を保存するためにディスクが必芁ないため、これは詊したせんでした。 デフォルトでは、SIGINT (タスクが Draining ステヌタスに転送されたずきに送信される) を受信した埌、実行䞭のすべおのタスクは、ただ完了しおいない堎合でも 30 秒埌に停止されたす。この時間はパラメヌタを䜿甚しお倉曎できたす。 ECS_CONTAINER_STOP_TIMEOUT。 䞻なこずは、スポットマシンの堎合は2分以䞊に蚭定しないこずです。

サヌビスの䜜成

説明したサヌビスの䜜成に進みたしょう。 その過皋で、䞊では觊れなかったいく぀かの圹立぀ポむントに぀いおも説明したす。 䞀般に、これは段階的な説明ですが、非垞に基本的な堎合や、逆に非垞に特殊な堎合に぀いおは考慮したせん。 すべおのアクションは AWS ビゞュアル コン゜ヌルで実行されたすが、CloudFormation たたは Terraform を䜿甚しおプログラムで再珟できたす。 Adapty では Terraform を䜿甚しおいたす。

EC2 起動テンプレヌト

このサヌビスは、䜿甚されるマシンの構成を䜜成したす。 テンプレヌトは、[EC2] -> [むンスタンス] -> [テンプレヌトの起動] セクションで管理されたす。

Amazon マシンむメヌゞ (AMI) — すべおのむンスタンスを起動するディスク むメヌゞを指定したす。 ECS の堎合、ほずんどの堎合、Amazon から最適化されたむメヌゞを䜿甚する䟡倀がありたす。 定期的に曎新され、ECS が動䜜するために必芁なものがすべお含たれおいたす。 珟圚のむメヌゞ ID を確認するには、次のペヌゞにアクセスしおください。 Amazon ECS に最適化された AMI、䜿甚しおいるリヌゞョンを遞択し、その AMI ID をコピヌしたす。 たずえば、us-east-1 リヌゞョンの堎合、執筆時点の珟圚の ID は次のずおりです。 ami-00c7c1cf5bdc913ed。 この ID は、「カスタム倀の指定」項目に挿入する必芁がありたす。

むンスタンスタむプ — むンスタンスのタむプを瀺したす。 あなたのタスクに最適なものを遞択しおください。

キヌペア (ログむン) — 必芁に応じお、SSH 経由でむンスタンスに接続できる蚌明曞を指定したす。

ネットワヌク蚭定 — ネットワヌクパラメヌタを指定したす。 ネットワヌキングプラットフォヌム ほずんどの堎合、Virtual Private Cloud (VPC) が必芁です。 セキュリティグルヌプ — むンスタンスのセキュリティ グルヌプ。 むンスタンスの前にバランサヌを䜿甚するため、ここでバランサヌからの受信接続のみを蚱可するグルヌプを指定するこずをお勧めしたす。 ぀たり、2 ぀のセキュリティ グルヌプが存圚したす。80 ぀はバランサヌ甚で、ポヌト 443 (http) ず XNUMX (https) 䞊の任意の堎所からの受信接続を蚱可したす。XNUMX ぀目はマシン甚で、バランサヌ グルヌプからの任意のポヌトでの受信接続を蚱可したす。 。 䞡方のグルヌプのアりトバりンド接続は、TCP プロトコルを䜿甚しお、すべおのポヌトのすべおのアドレスに察しお開かれる必芁がありたす。 発信接続のポヌトずアドレスを制限するこずはできたすが、その堎合は、閉じられたポヌト䞊で䜕かにアクセスしようずしおいないこずを垞に監芖する必芁がありたす。

ストレヌゞ (ボリュヌム) — マシンのディスクパラメヌタを指定したす。 ディスク サむズは、AMI で指定されたサむズより小さくするこずはできたせん。ECS 最適化の堎合、ディスク サむズは 30 GiB です。

高床な詳现 — 远加パラメヌタを指定したす。

賌入オプション — スポットむンスタンスを賌入するかどうか。 垌望したすが、ここではこのボックスをチェックしたせん。Auto Scaling グルヌプで蚭定したす。そこにはさらにオプションがありたす。

IAMむンスタンスプロファむル — むンスタンスが起動されるロヌルを瀺したす。 むンスタンスを ECS で実行するには、暩限が必芁です。暩限は通垞、ロヌルにありたす。 ecsむンスタンスロヌル。 堎合によっおは䜜成できる堎合もありたすが、䜜成できない堎合はここで 呜什 これを行う方法に぀いお。 䜜成埌はテンプレヌトに蚘茉させおいただきたす。
次に倚くのパラメヌタがありたす。基本的にどこでもデフォルト倀のたたで倧䞈倫ですが、それぞれに明確な説明がありたす。 EBS に最適化されたむンスタンスず T2/T3 Unlimited オプションを䜿甚する堎合は垞に有効にしたす 砎裂しやすい むンスタンス。

操䜜実働時間 — ナヌザヌデヌタを瀺したす。 ファむルを線集しおいきたす /etc/ecs/ecs.config、これには ECS ゚ヌゞェント蚭定が含たれたす。
ナヌザヌデヌタの䟋は次のようになりたす。

#!/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 — このパラメヌタヌは、スポット むンスタンスをオフにする信号を受信したずきに、そのむンスタンス䞊のすべおのタスクをドレむン ステヌタスに転送する必芁があるこずを指定したす。

ECS_CONTAINER_STOP_TIMEOUT=1m - このパラメヌタヌは、SIGINT シグナルを受信した埌、すべおのタスクが匷制終了されるたで 1 分間の猶予があるこずを指定したす。

ECS_ENGINE_AUTH_TYPE=docker — このパラメヌタヌは、Docker スキヌムが承認メカニズムずしお䜿甚されるこずを瀺したす

ECS_ENGINE_AUTH_DATA=... — Docker むメヌゞが保存されおいるプラ​​むベヌト コンテナヌ レゞストリぞの接続パラメヌタヌ。 パブリックの堎合は、䜕も指定する必芁はありたせん。

この蚘事では、Docker Hub のパブリック むメヌゞを䜿甚するので、パラメヌタヌを指定したす。 ECS_ENGINE_AUTH_TYPE О ECS_ENGINE_AUTH_DATA それは必芁ありたせん。

知っおおくずよいです: 新しいバヌゞョンでは Docker、Linux、ECS ゚ヌゞェントなどのバヌゞョンが曎新されるため、AMI を定期的に曎新するこずをお勧めしたす。これを忘れないようにするには、次のようにしたす。 通知を蚭定する 新しいバヌゞョンのリリヌスに぀いお。 通知をメヌルで受信しお手動で曎新するこずも、曎新された AMI を䜿甚しお新しいバヌゞョンの起動テンプレヌトを自動的に䜜成する Lambda 関数を䜜成するこずもできたす。

EC2オヌトスケヌリンググルヌプ

Auto Scaling グルヌプは、むンスタンスの起動ずスケヌリングを担圓したす。 グルヌプは、[EC2] -> [Auto Scaling] -> [Auto Scaling Groups] セクションで管理されたす。

起動テンプレヌト — 前のステップで䜜成したテンプレヌトを遞択したす。 デフォルトバヌゞョンのたたにしおおきたす。

賌入オプションずむンスタンス タむプ — クラスタヌのむンスタンスのタむプを指定したす。 起動テンプレヌトに準拠するず、起動テンプレヌトのむンスタンス タむプが䜿甚されたす。 賌入オプションずむンスタンス タむプを組み合わせるこずで、むンスタンス タむプを柔軟に構成できたす。 䜿わせおいただきたす。

オプションのオンデマンドベヌス — 垞に動䜜する通垞の非スポット むンスタンスの数。

基準を䞊回るオンデマンドの割合 — 通垞むンスタンスずスポット むンスタンスの割合。50  50 が均等に配分され、通垞むンスタンスごずに 20  80 の 4 ぀のスポット むンスタンスが発生したす。 この䟋では 50  50 ずしたすが、実際には 20  80 が最も倚く、堎合によっおは 0  100 になりたす。

むンスタンスタむプ — ここで、クラスタヌで䜿甚される远加のむンスタンスのタむプを指定できたす。 話の意味がよく分からないので䞀床も䜿いたせんでした。 おそらくこれは、特定の皮類のむンスタンスに察する制限が原因ですが、サポヌトを通じお簡単に増やすこずができたす。 アプリケヌションをご存知の堎合は、コメントを読んでいただけるず幞いです

AWS スポットむンスタンスでのスケヌラブルな API の構築

ネットワヌク — ネットワヌク蚭定、マシンの VPC ずサブネットを遞択したす。ほずんどの堎合、利甚可胜なすべおのサブネットを遞択する必芁がありたす。

ロヌドバランシング - バランサヌの蚭定ですが、これは個別に行いたす。ここでは䜕も觊れたせん。 ヘルスチェック これも埌で蚭定したす。

グルヌプサむズ — クラスタヌ内のマシン数の制限ず、開始時に必芁なマシン数を瀺したす。 メトリックに埓っおスケヌリングが発生する必芁がある堎合でも、クラスタヌ内のマシンの数が指定された最小倀を䞋回ったり、最倧倀を超えたりするこずはありたせん。

スケヌリングポリシヌ — スケヌリングパラメヌタですが、実行䞭の ECS タスクに基づいおスケヌリングするため、埌でスケヌリングを蚭定したす。

むンスタンスのスケヌルむン保護 — スケヌルダりン時にむンスタンスが削陀されないように保護したす。 ASG がタスクを実行しおいるマシンを削陀しないように、これを有効にしたす。 ECS Capacity Provider は、タスクを持たないむンスタンスの保護を無効にしたす。

タグを远加する — むンスタンスのタグを指定できたす (このためには、[新しいむンスタンスにタグを付ける] チェックボックスをオンにする必芁がありたす)。 Name タグを指定するこずをお勧めしたす。そうすれば、グルヌプ内で起動されるすべおのむンスタンスが同じ名前になり、コン゜ヌルで衚瀺するのに䟿利です。

AWS スポットむンスタンスでのスケヌラブルな API の構築

グルヌプを䜜成した埌、それを開いお [詳现蚭定] セクションに移動したす。䜜成段階ですべおのオプションがコン゜ヌルに衚瀺されないのはなぜですか。

終了ポリシヌ — むンスタンスを削陀するずきに考慮されるルヌル。 これらは順番に適甚されたす。 普段は䞋の写真のものを䜿っおいたす。 たず、最も叀い起動テンプレヌトを持぀むンスタンスが削陀されたす (たずえば、AMI を曎新した堎合、新しいバヌゞョンが䜜成されたしたが、すべおのむンスタンスはそのバヌゞョンに切り替えるこずができたした)。 次に、次の請求時間に最も近いむンスタンスが遞択されたす。 そしお、発売日に基づいお最も叀いものが遞択されたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

知っおおくずよいです: クラスタヌ内のすべおのマシンを曎新するため、䟿利に䜿甚できたす。 むンスタンスの曎新。 これを前のステップの Lambda 関数ず組み合わせるず、完党に自動化されたむンスタンス曎新システムが完成したす。 すべおのマシンを曎新する前に、グルヌプ内のすべおのむンスタンスのむンスタンスのスケヌルむン保護を無効にする必芁がありたす。 グルヌプ内の構成ではなく、マシン自䜓からの保護。これは [むンスタンス管理] タブで行われたす。

Application Load Balancer ず EC2 タヌゲット グルヌプ

バランサヌは、「EC2」→「ロヌド・バランシング」→「ロヌド・バランサヌ」セクションで䜜成されたす。 Application Load Balancer を䜿甚したす。さたざたなタむプのバランサヌの比范に぀いおは、次の URL を参照しおください。 サヌビスペヌゞ.

リスナヌ - ポヌト 80 ず 443 を䜜成し、埌でバランサヌ ルヌルを䜿甚しお 80 から 443 にリダむレクトするのが合理的です。

アベむラビリティヌゟヌン — ほずんどの堎合、私たちは党員を察象ずしたアクセシビリティ ゟヌンを遞択したす。

セキュリティ蚭定を構成する — バランサヌの SSL 蚌明曞がここに瀺されおいたす。最も䟿利なオプションは次のずおりです。 蚌明曞を䜜る ACMで。 違いに぀いお セキュリティヌポリシヌ で読むこずができたす ドキュメンテヌション、デフォルトで遞択されたたたにするこずができたす ELBSecurityPolicy-2016-08。 バランサヌを䜜成するず、それが衚瀺されたす DNS名、ドメむンの CNAME を構成するために必芁です。 たずえば、Cloudflare では次のようになりたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

セキュリティグルヌプ — バランサヌのセキュリティ グルヌプを䜜成たたは遞択したす。これに぀いおは、䞊蚘の「EC2 起動テンプレヌト」→「ネットワヌク蚭定」セクションで詳しく曞きたした。

タヌゲットグルヌプ — バランサヌからマシンにリク゚ストをルヌティングし、問題が発生した堎合にそれらを眮き換えるためにそれらの可甚性をチェックする責任を負うグルヌプを䜜成したす。 察象タむプ むンスタンスである必芁がありたす。 プロトコヌル О ポヌト 任意。バランサヌずむンスタンス間の通信に HTTPS を䜿甚する堎合は、バランサヌずむンスタンスに蚌明曞をアップロヌドする必芁がありたす。 この䟋では、これは行わず、単にポヌト 80 のたたにしたす。

ヘルスチェック — サヌビスの機胜をチェックするためのパラメヌタ。 実際のサヌビスでは、これはビゞネス ロゞックの重芁な郚分を実装する別のリク゚ストである必芁がありたすが、この䟋ではデフォルト蚭定のたたにしたす。 次に、リク゚スト間隔、タむムアりト、成功コヌドなどを遞択できたす。この䟋では、䜿甚される Docker むメヌゞが 200 コヌドを返すため、成功コヌド 399  304 を瀺したす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

タヌゲットを登録する — ここではグルヌプの車が遞択されおいたすが、この堎合、これは ECS によっお行われるため、このステップをスキップしたす。

知っおおくずよいです: バランサヌ レベルで、特定の S3 に保存されるログを有効にするこずができたす。 曞匏。 そこから、分析のためにサヌドパヌティのサヌビスに゚クスポヌトしたり、S3 内のデヌタに察しお盎接 SQL ク゚リを実行したりできたす。 アテナを䜿甚する。 䟿利で、远加のコヌドなしで機胜したす。 たた、指定した期間埌に S3 バケットからログを削陀するように蚭定するこずをお勧めしたす。

ECS タスクの定矩

前の手順では、サヌビス むンフラストラクチャに関連するすべおを䜜成したした。次に、起動するコンテナヌの説明に進みたす。 これは、「ECS」→「タスク定矩」セクションで行われたす。

起動タむプの互換性 - EC2を遞択したす。

タスク実行 IAM ロヌル - 遞ぶ ecsTaskExecutionRole。 これを䜿甚するず、ログが曞き蟌たれ、秘密倉数ぞのアクセスが蚱可されたす。

「コンテナ定矩」セクションで、「コンテナの远加」をクリックしたす。

画像 — プロゞェクト コヌドを含むむメヌゞぞのリンク。この䟋では、Docker Hub のパブリック むメヌゞを䜿甚したす。 bitnami/ノヌド䟋:0.0.1.

メモリ制限 — コンテナのメモリ制限。 ハヌドリミット — ハヌドリミット。コンテナヌが指定された倀を超えるず、docker kill コマンドが実行され、コンテナヌはすぐに停止したす。 ゜フトリミット — ゜フト制限。コンテナヌは指定された倀を超えるこずができたすが、このパラメヌタヌはタスクをマシンに配眮するずきに考慮されたす。 たずえば、マシンに 4 GiB の RAM が搭茉されおおり、コンテナの゜フト制限が 2048 MiB である堎合、このマシンはこのコンテナで最倧 2 ぀のタスクを実行できたす。 実際には、4 GiB の RAM は 4096 MiB よりわずかに少なく、これはクラスタヌの [ECS むンスタンス] タブで確認できたす。 ゜フト制限はハヌド制限を超えるこずはできたせん。 XNUMX ぀のタスクに耇数のコンテナがある堎合、それらの制限は合蚈されるこずを理解するこずが重芁です。

ポヌトマッピング - で ホストポヌト 0 を瀺したす。これは、ポヌトが動的に割り圓おられ、タヌゲット グルヌプによっお監芖されるこずを意味したす。 コンテナ枯 — アプリケヌションが実行されるポヌトは、倚くの堎合、実行コマンドで指定されるか、アプリケヌション コヌド、Dockerfile などで割り圓おられたす。 この䟋では、次のリストにある 3000 を䜿甚したす。 ドッカヌファむル 䜿甚されおいる画像。

健康蚺断 — コンテナヌのヘルスチェックパラメヌタヌ。タヌゲットグルヌプで構成されたパラメヌタヌず混同しないでください。

環境 - 環境蚭定。 CPUナニット - メモリ制限ず同様、プロセッサに関するもののみ。 各プロセッサ コアは 1024 ナニットであるため、サヌバヌにデュアルコア プロセッサが搭茉されおおり、コンテナヌが 512 に蚭定されおいる堎合、このコンテナヌを䜿甚しお 4 ぀のタスクを XNUMX 台のサヌバヌで起動できたす。 CPU ナニットは垞にコアの数に察応しおおり、メモリの堎合ず同様に、CPU ナニットが少しでも少なくなるずいうこずはありたせん。

Command — コンテナ内でサヌビスを開始するコマンド。すべおのパラメヌタはカンマで区切っお指定したす。 これは、gunicorn、npm などです。 指定しない堎合は、Dockerfile の CMD ディレクティブの倀が䜿甚されたす。 衚瀺したす npm,start.

環境倉数 — コンテナ環境倉数。 これは、単玔なテキスト デヌタたたは秘密倉数のいずれかです。 シヌクレットマネヌゞャヌ たたは パラメヌタストア.

ストレヌゞずロギング — ここでは、CloudWatch Logs (AWS のログ甚サヌビス) でのログ蚘録を蚭定したす。 これを行うには、[CloudWatch Logs の自動構成] チェックボックスを有効にするだけです。 タスク定矩を䜜成するず、CloudWatch にログのグルヌプが自動的に䜜成されたす。 デフォルトでは、ログは無期限に保存されるため、保持期間を無期限から必芁な期間に倉曎するこずをお勧めしたす。 これは CloudWatch Log グルヌプで行われ、珟圚の期間をクリックしお新しい期間を遞択する必芁がありたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

ECS クラスタヌず ECS キャパシティ プロバむダヌ

ECS → Clusters セクションに移動しおクラスタヌを䜜成したす。 テンプレヌトずしお EC2 Linux + Networking を遞択したす。

クラスタヌ名 - 非垞に重芁です。ここでは、Launch Template パラメヌタヌで指定したものず同じ名前を䜜成したす。 ECS_CLUSTER、 私たちの堎合には - DemoApiClusterProd。 「空のクラスタヌを䜜成する」チェックボックスをオンにしたす。 オプションで、Container Insights を有効にしお、CloudWatch のサヌビスのメトリクスを衚瀺できたす。 すべおを正しく行った堎合は、[ECS むンスタンス] セクションに Auto Scaling グルヌプで䜜成されたマシンが衚瀺されたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

タブに移動 キャパシティプロバむダヌ 新しいものを䜜成したす。 実行䞭の ECS タスクの数に応じおマシンの䜜成ずシャットダりンを制埡する必芁があるこずを思い出させおください。 プロバむダヌは XNUMX ぀のグルヌプにのみ割り圓おられるこずに泚意するこずが重芁です。

オヌトスケヌリンググルヌプ — 以前に䜜成したグルヌプを遞択したす。

管理されたスケヌリング — プロバむダヌがサヌビスを拡匵できるように有効にしたす。

目暙容量% — タスクがロヌドされたマシンの䜕パヌセントが必芁か。 100% を指定するず、すべおのマシンが垞にタスクの実行でビゞヌ状態になりたす。 50% を指定するず、車の半分は垞に無料になりたす。 この堎合、負荷が急激に増加した堎合、新しいタクシヌはむンスタンスの配備を埅぀こずなく、ただちに無料の車䞡に乗車したす。

管理された終了保護 — 有効にするず、このパラメヌタヌを䜿甚するず、プロバむダヌはむンスタンスの削陀からの保護を解陀できたす。 これは、マシン䞊にアクティブなタスクがなく、タヌゲット容量% が蚱可されおいる堎合に発生したす。

ECS サヌビスずスケヌリングのセットアップ

最埌のステップ:) サヌビスを䜜成するには、[サヌビス] タブで以前に䜜成したクラスタヌに移動する必芁がありたす。

発射タむプ — [容量プロバむダヌ戊略に切り替える] をクリックし、以前に䜜成したプロバむダヌを遞択する必芁がありたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

タスク定矩 — 以前に䜜成したタスク定矩ずそのリビゞョンを遞択したす。

サヌビス名 — 混乱を避けるため、垞にタスク定矩ず同じものを瀺したす。

サヌビスの皮類 - 垞にレプリカ。

タスクの数 — サヌビス内のアクティブなタスクの必芁な数。 このパラメヌタはスケヌリングによっお制埡されたすが、それでも指定する必芁がありたす。

最䜎限の健康率 О 最倧パヌセント — 導入時のタスクの動䜜を決定したす。 デフォルト倀は 100 ず 200 で、デプロむメント時にタスクの数が数倍に増加し、その埌望たしい倀に戻るこずを瀺したす。 最小 = 1、最倧 = 0 の 100 ぀のタスクが実行されおいる堎合、デプロむメント䞭にタスクが匷制終了され、その埌新しいタスクが発生したす。぀たり、ダりンタむムになりたす。 1 ぀のタスクが実行䞭 (最小 = 50、最倧 = 150) の堎合、1 ぀のタスクを半分に分割したり XNUMX 倍に増やすこずはできないため、デプロむメントはたったく行われたせん。

展開タむプ — ロヌリングアップデヌトを終了したす。

配眮テンプレヌト — タスクをマシンに配眮するためのルヌル。 デフォルトは AZ Balanced Spread です。これは、すべおのアベむラビリティヌゟヌンのマシンが皌働するたで、新しいタスクがそれぞれ新しいむンスタンスに配眮されるこずを意味したす。 通垞、BinPack - CPU および Spread - AZ を䜿甚したす。このポリシヌでは、タスクは CPU ごずに XNUMX ぀のマシンにできるだけ高密床に配眮されたす。 新しいマシンを䜜成する必芁がある堎合は、新しいアベむラビリティ ゟヌンに䜜成されたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

ロヌドバランサの皮類 — [アプリケヌション ロヌド バランサヌ] を遞択したす。

サヌビス IAM ロヌル - 遞ぶ ecsServiceRole.

ロヌドバランサ名 — 以前に䜜成したバランサヌを遞択したす。

ヘルスチェックの猶予期間 — 新しいタスクのロヌルアりト埌にヘルスチェックを実行する前に䞀時停止したす。通垞は 60 秒に蚭定したす。

コンテナから負荷分散ぞ — [タヌゲット グルヌプ名] 項目で、以前に䜜成したグルヌプを遞択するず、すべおが自動的に入力されたす。

AWS スポットむンスタンスでのスケヌラブルな API の構築

サヌビス自動スケヌリング — サヌビスのスケヌリングパラメヌタ。 [サヌビスの自動スケヌリングの構成] を遞択しお、サヌビスの必芁な数を調敎したす。 スケヌリング時にタスクの最小数ず最倧数を蚭定したす。

Service Auto Scaling の IAM ロヌル - 遞ぶ AWSServiceRoleForApplicationAutoScaling_ECSService.

自動タスクスケヌリングポリシヌ — スケヌリングのルヌル。 2 ぀のタむプがありたす:

  1. タヌゲット远跡 — タヌゲットメトリクス (CPU/RAM 䜿甚率たたは各タスクのリク゚スト数) を远跡したす。 たずえば、プロセッサの平均負荷を 85% にしたいずしたす。これが高くなるず、目暙倀に達するたで新しいタスクが远加されたす。 逆に、負荷が䜎い堎合は、スケヌルダりンに察する保護が有効になっおいない限り、タスクは削陀されたす(スケヌルむンを無効にする).
  2. ステップスケヌリング - 任意のむベントに察する反応。 ここでは、任意のむベント (CloudWatch アラヌム) に察する反応を構成でき、むベントが発生したずきに、指定した数のタスクを远加たたは削陀したり、タスクの正確な数を指定したりできたす。

サヌビスには耇数のスケヌリング ルヌルがある堎合がありたす。これは䟿利です。重芁なのは、それらが互いに競合しないようにするこずです。

たずめ

指瀺に埓っお同じ Docker むメヌゞを䜿甚した堎合、サヌビスは次のようなペヌゞを返すはずです。

AWS スポットむンスタンスでのスケヌラブルな API の構築

  1. サヌビス内のすべおのマシンが起動されるテンプレヌトを䜜成したした。 たた、テンプレヌトが倉曎されたずきにマシンを曎新する方法も孊びたした。
  2. スポット むンスタンス停止信号の凊理を構成したため、受信埌 XNUMX 分以内に実行䞭のすべおのタスクがマシンから削陀されるため、䜕も倱われたり䞭断されたりするこずはありたせん。
  3. 負荷をマシン党䜓に均等に分散するためにバランサヌを䞊げたした。
  4. スポット むンスタンス䞊で実行されるサヌビスを䜜成したため、マシンのコストが玄 3 分の XNUMX に削枛されたす。
  5. ダりンタむムコストを発生させるこずなく増加したワヌクロヌドを凊理できるように、䞡方向の自動スケヌリングを構成したした。
  6. アプリケヌションがむンフラストラクチャ (マシン) を管理するのではなく、その逆ではないように、Capacity Provider を䜿甚したす。
  7. 私たちは玠晎らしいです。

倧芏暡な電子メヌル キャンペヌンで広告を掲茉しおいる堎合など、負荷の急増が予枬できる堎合は、次の方法でスケヌリングを蚭定できたす。 時刻衚.

システムのさたざたな郚分からのデヌタに基づいお拡匵するこずもできたす。 たずえば、次のような機胜がありたす 個別のプロモヌションオファヌの送信 モバむルアプリケヌションのナヌザヌ。 キャンペヌンが 1 䞇人以䞊に送信されるこずもありたす。 このような配垃の埌は、倚くのナヌザヌが同時にアプリケヌションにログむンするため、API ぞのリク゚ストが垞に倧幅に増加したす。 そのため、プロモヌション プッシュ通知を送信するためのキュヌに、はるかに倚くの暙準むンゞケヌタヌがあるこずがわかった堎合は、すぐにいく぀かの远加のマシンずタスクを起動しお、負荷に備えるこずができたす。

スポット むンスタンスず ECS を䜿甚した興味深い事䟋やスケヌリングに぀いおコメントで教えおいただければ幞いです。

たもなく、䞻にサヌバヌレス スタックで XNUMX 秒あたり数千の分析むベントを (資金を䜿っお) 凊理する方法や、GitLab CI ず Terraform Cloud を䜿甚しおサヌビスのデプロむメントがどのように機胜するかに぀いおの蚘事が掲茉される予定です。

ぜひ賌読しおください。きっず面癜いでしょう

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

実皌働環境でスポット むンスタンスを䜿甚したすか?

  • 芖聎者の%がはい6

  • 芖聎者の%がNo18

  • 芖聎者の%が蚘事で知り、䜿甚する予定です3

27 人のナヌザヌが投祚したした。 5名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす