ECS vs Fargate【きのこたけのこ戦争？だがFargateが圧勝しました！】

<img class="aligncenter wp-image-552" src="https://s3-ap-northeast-1.amazonaws.com/brawsskill/wp-content/uploads/2019/05/22083056/maxC-2.jpg" alt="" width="648" height="433" />

こんにちは。朝から晩までAWS検証中の黒川です。

ECSとFargateの違い分かりますか？

私は昔、コンテナをEC2タイプかFargateタイプが選べると知り、<strong>「どっちがどう違うんじゃい？」</strong>と出鼻をくじかれました。

また、複雑なマイクロサービスに向いているのはどっち？など双方のメリットとデメリットが理解できていないと感じたので改めて整理しようと思います。

☑️本記事のテーマ
<div style="padding: 10px; margin-bottom: 10px; border: 1px dotted #333333; border-radius: 5px;"><span style="background-color: #ffff00;">ECSとFargateはどちらを使うべきか迷っている方の為の記事です</span></div>
<div></div>
&nbsp;

☑️結論
<div style="padding: 10px; margin-bottom: 10px; border: 1px dotted #dcdcdc; border-radius: 5px;">Fargateが圧勝</div>
&nbsp;

☑️理由
<div style="padding: 10px; margin-bottom: 10px; border: 1px dotted #dcdcdc; border-radius: 5px;">Fargateは料金安いし運用難易度が低い、一方コンテナインスタンスはスケーリング難易度が高いため</div>
<h2 style="background-color: #f5f5f5; text-align: center; border-left: 10px solid #ffa500;">Fargateとは？これってECSのサービスの1つですよね？</h2>
<img class="aligncenter wp-image-555" src="https://s3-ap-northeast-1.amazonaws.com/brawsskill/wp-content/uploads/2019/05/22133424/Featured-image-containers-vs-serverless.png" alt="" width="602" height="361" />
<h3 style="border-left: 10px solid #ffa500;">ECSサービスの定義</h3>
「イケてる設計」を目指すエンジニアは、（何故か）コンテナサービスをクラウドで動かすことを選択しますよね。

設計が複雑だったり、環境変化のスピードに対応するマイクロサービス型のビジネスに向いていたり。。

さて、ここでECSサービスをちょっくら分解してみることにしてみましょう。
<div style="background-color: #fff5ee;">

・コンテナを実行するサービスである

・タスクを管理するサービスである

</div>
タスクとは、コンテナの定義を定めたDockerfileのようなもので、複数のコンテナを定義することが多いです。

例えば、nginxのコンテナとphp-fpmのコンテナをひとつのタスクにまとめる、とか。

ECSはコンテナを実行するわけではなく、タスクを管理するコントロールプレーンを用意してくれるという点に注意。

それじゃあ、一体コンテナを実行しているのは誰だ？
<h3 style="border-left: 10px solid #ffa500;">コンテナを実行しよう</h3>

コンテナを実行したいのなら、次の2つのオプションが用意されているので選択しましょう。



・ECSコンテナインスタンスを使用する

・Fargateを使用する


次の図は両者の違いを示したものです。

<img class="aligncenter wp-image-546" src="https://s3-ap-northeast-1.amazonaws.com/brawsskill/wp-content/uploads/2019/05/22001345/ecs-container-instance-fargate.png" alt="" width="610" height="368" /><span style="background-color: #ffff00;"><strong>
あれ？「ECS」のサービスに「EC2」と「Fargate」っていうスタイルがあるんだっけ？</strong></span>

そう、つまり「コンテナインスタンス vs Fargate」という記事のタイトルであるべきでしたね。

きのこたけのこ言ってる場合じゃないよ、全く。。

ECSコンテナインスタンスは「ECSコンテナのエージェントを持っているEC2インスタンス」ってこと以外は普通のEC2と何ら変わりないですね。

他のEC2インスタンスと同様に「インスタンス」画面に並んで動いているし。

上司　「ってことで、もちろんEC2インスタンスの監視、パッチ、セキュリティ面の配慮は君の仕事だから、後はよろしく頼んだよ。」

部下　「（えー。。。サーバー管理は骨が折れるから好きじゃ無いけど、、）」

コンテナインスタンスとはつまりそういうこと。

EC2の管理が面倒なんですよね。

あと、インスタンスタイプ（t2.microとか）を適切に選ぶって結構ハードル高いですよね。
<h2 style="background-color: #f5f5f5; text-align: center; border-left: 10px solid #ffa500;">Fargateの料金とEC2インスタンスタイプの弱点</h2>
<img class="aligncenter wp-image-556" src="https://s3-ap-northeast-1.amazonaws.com/brawsskill/wp-content/uploads/2019/05/22133603/azure_functions_featured_image.png" alt="" width="469" height="268" />
上述の管理面と同様に、EC2インスタンスタイプは弱点がいくつかあります。

コンテナインスタンスのクラスターは通常、オートスケーリンググループ内で実行することかと思いますが、スケーリングは簡単じゃ無いですね。

なぜなら
<div style="background-color: #fff5ee;">

・タスクの配置がよろしく無く、キャパシティ関連の問題でエラーとなった場合でもスケールをする明確なメトリックの基準がない

・Cloudformationでクラスターをスケールアップする際、オートスケーリングやECSって連動して認識しない

・長時間実行しているタスクをkillしないでスケールダウンってめちゃくちゃ難しい

</div>
AWS公式ドキュメントでさえ、クラスターをオートスケーリングする件については記載がないですし。
<h3 style="border-left: 10px solid #ffa500;">Fargateの圧勝です</h3>
Fargateはタスクの実行を管理してくれるもので、EC2インスタンスを管理する必要は一切無いです。

お金はvCPUとメモリーの量で決まり、タスクの実行時間で決まるから凄く簡単そうに聞こえる。

Fargateで実行するタスクは、専用のプライベートIPアドレスを持ったENIで動いています。

同一タスク上のコンテナ同士はlocalhostを通じてお互いに通信することができるし、ENIを通して外とインバウンド、アウトバウンドの通信がとれるってこと。

もちろん、パブリックIPアドレスについても同様です。




<table style="border-collapse: collapse; width: 100%; height: 270px;" border="1">
<tbody>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px; background-color: #eb9c49;"></td>
<td style="width: 33.3333%; height: 45px; background-color: #eb9c49;">ECS</td>
<td style="width: 33.3333%; height: 45px; background-color: #eb9c49;">Fargate</td>
</tr>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px;">料金</td>
<td style="width: 33.3333%; height: 45px;">高い</td>
<td style="width: 33.3333%; height: 45px;">安い</td>
</tr>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px;">運用難易度</td>
<td style="width: 33.3333%; height: 45px;">高い</td>
<td style="width: 33.3333%; height: 45px;">低い</td>
</tr>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px;">EFSとの統合</td>
<td style="width: 33.3333%; height: 45px;">難しいが可能</td>
<td style="width: 33.3333%; height: 45px;">無理</td>
</tr>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px;">EBSとの統合</td>
<td style="width: 33.3333%; height: 45px;">難しいが可能</td>
<td style="width: 33.3333%; height: 45px;">無理</td>
</tr>
<tr style="height: 45px;">
<td style="width: 33.3333%; height: 45px;">NWオプション</td>
<td style="width: 33.3333%; height: 45px;">複数選択可能</td>
<td style="width: 33.3333%; height: 45px;">ENI</td>
</tr>
</tbody>
</table>
&nbsp;
<h2 style="background-color: #f5f5f5; text-align: center; border-left: 10px solid #ffa500;">まとめ</h2>
<img class="wp-image-557 aligncenter" src="https://s3-ap-northeast-1.amazonaws.com/brawsskill/wp-content/uploads/2019/05/22133714/888.jpg" alt="" width="468" height="263" />

ECSかFargateかどっちが良いの？っていうのは適切な質問ではないですね。

ECSは両方含んでいるので、正しくは「コンテナインスタンスとFargateどっちが良い？」っていうことです。

確かに、EC2インスタンスを手中で管理したいって企業も多いと思うが、マイクロサービスをするのなら圧倒的にFargateに軍配が上がります。

コンテナインスタンスをスケーリングすることは難しいので、Fargateをオススメします。

Fargateは運用するのが楽なので、もし可能なら試してみて下さい。

参考
https://www.awsskill.com/540/fargateorecs/