こんにちは。ABEJAのインフラを担当している村主です。
昨今インフラ界隈で流行っておりますKubernetesに全振りしたい気持ちで仕事に励んでおりますが、サクッと使うにはKubernetesは重くて、ECSが軽いのでECSも使っています。
まずはじめにSpotinstについてや、ECSの組み合わせのメリットについてはこちらに書いてありますので一読ください。
事の発端
今回、社内でコンテナを使ったWebインフラを作りたいという要望があり、ほな作るわ。ということでECSをベースにEC2はSpotinstで管理させることにしました。
出来上がった後、使い方の説明してる時に「これ利用者から見たらContainer as a Serviceやん。しかもスポットインスタンス使ってるし激安やん」ということに気付いたよ。ってのが今回の話です。
内容としては
- ECSベースで作られているのでいつも通りの使い勝手
- 利用者はECSクラスタに対してServiceを作ればいい
- EC2部分は足りなければSpotinstが勝手にスケールアウトしてくれる
- EC2が不要になればSpotinstが勝手にスケールインしてくれる
- EC2部分はスポットインスタンスなので激安
利用者が気にするのは2番だけですね。ECSクラスタに対してServiceを投げるだけ。
Fargateと似たような感じでFargateと比べるとEC2が起動する分だけ時間かかって劣るけど、スポットインスタンスが使えるので大目に見ましょう。
イメージするとこんな感じです。インフラと利用者の境界が綺麗に分かれてますね。
Spotinstを挟む理由
この構成でSpotinstを挟んでいる理由は下のブログにも書いている通り、空きCPU/MEM以上のコンテナサイズで投げた時に発生するリソース不足のイベントをSpotinstは拾ってくれるからです。ECSはそのイベントを拾ってくれません。
また、複数のインスタンスサイズを選択できたり、コンテナの配置を最適化し不要になったインスタンスを停止したり、Terminate時にコンテナのDrainも一緒に行ってくれる、設定変更時はBlue/Green Deploymentを強制するなど、良い点がたくさんです。
で、どのようにこれを作るのか
ここからはECSを作った事ある人を対象に記載します。
ECSを作ってSpotinstでイチからElastiGroupを作って。という方法もあるのですが、自分で一旦ECSクラスタを作成しEC2をJoinさせます。この状態からElastiGroupでECSクラスタをインポートするのが一番手っ取り早いです。ECSやEC2の情報を丸ごと引っ張ってくれます。 あとは出来上がったECSクラスタに対してServiceとかを投げるだけです。 これだけで上の構成が出来上がります。めっちゃ簡単です。
1. ElastiGroupのCreateを選択
2. Join Existing ECSを選択
3. 任意の名前、リージョンを選択し、対象とするECSクラスタを選択します
4. すると各種パラメータを引っ張ってくれるので、Createする
5. その後に既存のEC2を停止する。以上
せっかくなので、もうちょっと深掘り
上のようにインフラと利用者の境界がうまく分かれました。 さらにこの構成はAWSとSpotinstの境界もうまく分かれていて、SpotinstがやることはメトリクスをベースにEC2を起動させたり、ECSのイベントをフックしてEC2を起動したりと、EC2の起動・停止が主なので、それ以外の部分は今まで通りAWSをそのまま運用しているのと変わらず、ECS/EC2の起動・停止のAPIをうまくコントロールしてくれるラッパー的な位置付けでいてくれます。
外部サービスに依存するとそのサービスの可用性に引っ張られますが、AWSそのままなので非常にありがたいです。
ということで宣伝。コスト最適化したいエンジニア募集中です。
ABEJAではインフラでコスト最適化したいエンジニアを募集しています。
ABEJAが発信する最新テクノロジーに興味がある方は、是非ともブログの読者に!
ABEJAという会社に興味が湧いてきた方はWantedlyで会社、事業、人の情報を発信しているので、是非ともフォローを!! www.wantedly.com
ABEJAの中の人と話ししたい!オフィス見学してみたいも随時受け付けておりますので、気軽にポチッとどうぞ↓↓