EC2と関連付けてざっくり理解するFargate

[弁護士ドットコム](https://corporate.bengo4.com/)という会社で[税理士ドットコム](https://www.zeiri4.com/)というサービスの開発をしています @ug23 です。

この記事は[弁護士ドットコム Advent Calendar 2020](https://qiita.com/advent-calendar/2020/bengo4com) の23日目の記事です。祝日じゃないイブイブに違和感ありまくりですね。

`PHPのテスティングフレームワークを比較してみたい` という意気込みを書いていましたが最近PHPを書くよりもDockerやAWSに関係する業務が多かったので、最近やったことを中心に整理しつつまとめました。

EC2しか触ったことがないけどFargateを触る必要が出てきた方や、ECSは使っていないけどFargateを使ったことのない方の理解の一助となれば幸いです。

**Fargateのベストプラクティスや構築方法については触れません。**

# Fargateと私

先日税理士ドットコムはEC2をベースにした構成から[Fargate](https://aws.amazon.com/jp/fargate/)を使った構成に移行しました。

インスタンスの管理から解放され、コンテナの管理に集中できるようになったり、動作環境のアップデートやスケールイン/スケールアウトも素早くできたりするなど移行して間もないながらメリットを多く感じています。

しかし、私個人としては本番環境がコンテナベースになるというのが初めての経験だったのでFargateに触れたばかりのころはEC2と概念の違いに戸惑う事がよくありました。開発環境はDockerなので日常的にコンテナに触れてはいたのですが、SpinnakerやKubernetesなど本番でコンテナをいい感じに動かすツールに縁がありませんでした。Fargateに慣れるためにも概念を整理しながら進めていました。

勉強しながら気づいたのは**FargateになってもAWSの既存と結びつけて考えられる**という点でした。

## ECSとFargateの関係

Fargateは[ECS(Elastic Container Service)](https://aws.amazon.com/jp/ecs/)のサービスの中で使うことができるものです。そのため、Fargateを理解するにはECSを理解する必要があります。

ECSはその名の通り、コンテナに関連するサービスでオーケストレーションを担います。
その中で、コンテナの[起動タイプ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_types.html)を以下から選択することになります。

- EC2起動タイプ: EC2を起動しその上でコンテナを動かす
- Fargate起動タイプ: Fargateでコンテナを動かす

EC2起動タイプはEC2を管理しながらほかの自動化ソリューションを使ってEC2上でDockerコンテナを実行するのに近い形で運用できるようです。一方でEC2の管理はしないといけない課題が残ります。

Fargate起動タイプにすることでFargateを利用してEC2の管理をユーザ側で意識することなくサービスを運営できるようです。[^1]

もし、現在ECSでEC2起動タイプを利用して運営しているサービスがあるなら起動タイプをFargateに変更すれば移行はできます。（もちろんネットワーク構成などが変わるため検証は必要ですが）

## EC2と同じではないが似たような機能は用意されている
Fargateはコンテナで扱うという特徴からEC2と全く異なる概念を扱うと思いがちですが、結構似たような概念のものが用意されています。

|EC2では|Fargateでは|説明|
|:--:|:--:|:--|
| インスタンスタイプ | CPU/メモリ設定 | Fargateではインスタンスタイプよりも柔軟にvCPUとメモリ容量の組み合わせをタスクごとに設定できる |
| インスタンスストア |タスクストレージ| タスクごとに20GBのエフェメラルストレージを利用できる。タスクを終了するとデータはロストする |
| EBS | EFS | EBSは利用できないのでEFSを利用する |
|スポットインスタンス|Fargate Spot|キャパシティプロバイダーの設定でFARGATE_SPOTを設定すると通常のタスクの最大7割引で利用できる。中断リスクは変わらない|
|インスタンスごとのIAMロール|タスクごとのIAMロール|IAMロールの範囲がタスク単位になる|


似ていると言っても完全に同じではないので利用したい場合は実際にメリット/デメリット、制約条件や課金体系を確認してから使いましょう。

## awsvpcネットワークモード
EC2を扱っているところから一気に変わる部分としてはタスクネットワーキングがawsvpcに固定されるところでしょうか。

- タスクごとにENI(Elastic Network Interface)を持つため、private IPが割り振られる
- タスク内で複数コンテナを起動できるが、内部ではlocalhostインターフェイスを共有しているので同じタスクの別のコンテナへlocalhostでアクセスできる
    - Webサーバを提供するコンテナと各種モニタリング系サービスのエージェントを同タスクに配置してlocalhostでアクセスし合うことができる
- 同VPC内であればインスタンスと同じようにprivate IPでアクセス可能
- ALBに接続するために、ターゲットグループへ登録する際はターゲットタイプをIPとしてタスクを登録する

タスク内でlocalhostを共有する部分は面食らうと思いますが実際に構築してみると身体で感じられるかと思います。

# さいごに
EC2しか扱ったことのない私でも、Fargate内で扱っている概念やネットワーキングのしくみがわかると基本的なところはそこまで変わらないことがわかり、業務を通して慣れていくことができました。Fargateを使うことになった、転職したら環境がFargateだった、という方はぜひ怖がらずにFargateに触ってみてほしいです。

また、AWSに関してはこれに限らず、blackbelt online seminarのスライドを読むことでサービス概要やほかのサービスとの関連性を学べるので、サービスをはじめて触る場合は確認してみましょう。（ここに書いてあることはこれらのスライドに書いてあります）

- [20200422 AWS Black Belt Online Seminar Amazon Elastic Container Service (Amazon ECS)](https://www.slideshare.net/AmazonWebServicesJapan/20200422-aws-black-belt-online-seminar-amazon-elastic-container-service-amazon-ecs)
- [20190731 Black Belt Online Seminar Amazon ECS Deep Dive](https://www.slideshare.net/AmazonWebServicesJapan/20190731-black-belt-online-seminar-amazon-ecs-deep-dive-162160987)
- [20190925 AWS Black Belt Online Seminar AWS Fargate](https://www.slideshare.net/AmazonWebServicesJapan/20190925-aws-black-belt-online-seminar-aws-fargate)

明日は @poemn さんがなにか書いてくれるらしいです。

[^1]: [こちら](https://www.slideshare.net/AmazonWebServicesJapan/20190925-aws-black-belt-online-seminar-aws-fargate)のスライドの9ページを見る限り、ユーザが管理していないだけで動いているのはAWS基盤側が管理しているEC2環境のようです。