NEWSニュース

2020.04.16

TECH BLOG

キャパシティープロバイダー戦略でリソース管理&コスト削減

はじめに

CAMでSREを担当している神山です。

 

CAMで運用しているサービスの多くは、EC2インスタンスをホストとしたECSを使って運用しています。

ECSを採用したことで負荷に応じてタスクを増減させることが可能で、何らかの不具合で特定のコンテナが停止してしまっても、すぐさま新しく立て直したり、過去のバージョンに戻すことも可能になりました。

しかしECSを運用していく上で無視できない問題として、EC2インスタンスのリソース管理が挙げられます。

この記事では、EC2インスタンスのリソース管理を容易にする「キャパシティープロバイダー戦略」について取り上げます。

 

1. EC2を使う理由

EC2インスタンスを使わずにECS上でコンテナを立てることが可能な「Fargate」がローンチされてから久しいです。

「EC2インスタンスをベースにするよりもFargateを使った方が楽では?」と思う方もいるかもしれません。

しかしながら、未だにCAMでEC2ベースでECSが使われているのには理由があります。

 

まず、CAMではEFSを活用しているサービスもあるため、EC2インスタンスをベースにした使い方を採用しています。

当時のFargateでは外部ストレージをマウントする機能が存在しませんでした。

また、FargateとEC2インスタンスを比較した場合に、EC2インスタンスをベースとした方がコストを抑えることができます。これはFargate Spotがリリースされた現在でも同様です。

 

2. EC2のデメリット

EC2を採用するケースではコンテナを立てるために十分なインスタンスを用意する必要があります。

しかし余剰に大量のインスタンスを立ち上げておくと無駄な費用が掛かってしまい、EC2を採用する旨味が少なくなります。

また、新たなコンテナを立てるためのリソースが足りない場合には、EC2インスタンスを必要に応じて追加してあげる必要があります。

 

このようにEC2を採用するケースでは、コンテナとEC2インスタンスの両方を管理する必要があります。

そのためには適切なAutoScalingポリシーを作成してあげる必要があります。

 

 

リソースが不足している状態でコンテナを追加しようとしても、リソース不足であることを伝えるメッセージが表示されるだけで増やすことはできません。

 

3.キャパシティープロバイダー戦略

 

 

今回のテーマであるECSキャパシティープロバイダー戦略とは、2019年12月にローンチされた機能でECSクラスター内の全てのタスクとリソース需要を満たすために自動的にスケーリングすることができるサービスです。

https://aws.amazon.com/jp/about-aws/whats-new/2019/12/amazon-ecs-cluster-auto-scaling-now-available/

 

今回の記事では導入手順は解説しませんが、[ターゲットキャパシティー]くらいしか調整する必要がないため簡単に導入することができます。

このターゲットキャパシティーは1-100%の間で設定することができて、100%にするとEC2インスタンスが無駄なく全て使われ、50%にすると必要数の2倍のインスタンスが立ち上がるといった形で反映されます。

 

キャパシティープロバイダー戦略を適用すると自動的にAutoScalingのポリシーとして追加されます。

 

4. 挙動の調査

挙動を確認するためEC2インスタンス上に可能な限りコンテナを立ち上げた状態を作りました。

添付の画像の例では、メモリが不足しているためこれ以上コンテナを追加することはできません。

 

その状態でサービスの設定から必要なコンテナ数を2個追加しました。

この場合では本来「メモリ不足でコンテナを追加することができない」というイベントメッセージが追加されて終わってしまうのですが、キャパシティープロバイダー戦略が有効になっていると新たなコンテナが立ち上がろうとしていることがわかります。

 

 このケースではキャパシティープロバイダー戦略によって必要なリソースが用意されるまでの間、[PROVISIONING]というステータスでタスクが待機します。

 

十分な時間が経過すると、EC2インスタンスが1台追加されて追加したコンテナも配置されます。

このキャパシティープロバイダー戦略によるスケールアウトは、

デプロイなどタスク定義が更新されたことによるECSサービスの更新時にも適用されます。

 

例えば最小ヘルス率が100のサービスが更新された際に、十分なリソースが用意されていなかった場合には自動的にインスタンスが追加されます。

 

5.キャパシティープロバイダー戦略だけでは厳しい

キャパシティープロバイダー戦略は自動的にEC2インスタンスをスケールアウト・スケールインしてくれる便利な機能です。

しかし正直なところキャパシティープロバイダー戦略だけでは意図した運用が厳しいでしょう。

 

その理由として、例えばタスクのデプロイによって一時的にEC2インスタンスを追加したつもりが、追加したインスタンスがいつまでも削除されずに残ってしまう可能性があるからです。

これはコンテナが立ち上がっている状態のインスタンスに対しての削除は行われないためです。

そのためキャパシティープロバイダー戦略を有効にしていたとしても、[CPUReservation]や[MemoryReservation]に余剰がある場合にスケールインを実行するなどのAutoScalingポリシーを準備した方が良いでしょう。

 

6.まとめ

キャパシティープロバイダー戦略を活用することで、EC2インスタンスのスケールを簡単に実現することができます。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cluster-capacity-providers.html

 

現在の仕様のままでは使いにくいところも目立ちますが、通常のなAutoScalingポリシー以外にキャパシティープロバイダー戦略は有効にしておくと運用も楽になりますし、余計なリソースを立てなくて済むためコストカットにも期待できます。

将来的には有効にしておくことが当たり前になるかもしれない機能ですので、実際に動作確認をして記事にしてみました。

 

AWSは日々アップデートされており、進化が早いサービスです。今後も新しい機能や今まで使っていなかった機能については検証して、良さそうであればCAMの構成に取り込めればなと思います。

 


 


WRITTEN BY:神山
AWSを個人利用でも使っているくらいハマっています。最近の好きなサービスはCloudFrontとLambda。