EKSをECSへ移行するやり方をチームで考えた

# はじめに
この記事は [bellFace Advent Calendar 2021](https://adventar.org/calendars/6917) の23日目の記事です。

本項では、AWSでコンテナを利用したアプリケーション運用を行う際に、昨今メインストリームとして利用されている EKS (Elastic Kubernetes Service) と ECS (Elastic Container Service) について比較しながら、当社ベルフェイスで行った直近の技術選択についてお話します。

# 自己紹介
ベルフェイス System GroupでSREをしています、大沼こと @numa-numa と申します:bow:

コア領域はネットワークと情報セキュリティ(のはず…)なのですが、YAMAHA RTX1210を傍らにGCPのインフラコーディングをしたり、社内情シスをやったり、Goスクリプトを開発したり…
WEBサービス数社で取っ散らかったことをいろいろ経験してきました:cat:

ベルフェイスでは入社1年余となり、インフラ/基盤まわりの改善を担当しています:grey_exclamation:

# コンテナとは何か？
記事に関してはいろいろな方が読む可能性があると思っており、なるべく前提知識がなくても分かりやすくします:smiley:

- AWSのマネージドサービスである EKS (Elastic Kubernetes Service) の Kubernetes って何？
- そもそもコンテナって何？

…というあたりについて詳しく知りたい方は、私が年初に書きました以下の記事を、先にお読みいただけると良いかもしれません:exclamation:
[【コンテナの話をはじめから】](https://qiita.com/numa-numa/items/d0cda2bc109344020758)

# ベルフェイスのインフラ担当組織について
ベルフェイスはベンチャー企業であり、2021年現在プロダクトをはじめいろいろなことが怒涛の勢いで改善されています。

組織に関しても例外ではなく、これまでのいろいろな経緯もありインフラを担当する組織もいくつかに分かれてきました。

そのうち、

- Platform Infraチーム
- DevOpsチーム

と呼ばれていた2つの主要チームが、2021年春から1チーム (これより後は、単純にSREチームとのみ記載します) として働くことになり、インフラ組織としてのシナジーも上がっています:+1:

# ベルフェイスのSREチームが担当しているシステム

私たちが担当している主要システムについて、簡単な概念図で示すと以下のようになります。
![BF System Summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/a26e67b8-2e5c-7c59-0c64-1c72a64f3f1d.png)
実は先ほど紹介した、旧組織ごとで受け持っている範囲が異なっており、それぞれ担当範囲分けをしていたため、結果として上図のようなシステムとなっています。
(一部を切り取って、非常に簡略化しています。)

- Platform Infraチーム
    - EC2(仮想マシン)の構築/運用をメインで行う
- DevOpsチーム
    - EKSのコンテナ開発/運用をメインで行う

図内では点線を引いてある所を主な分解点とし、左側はおよそEC2を利用して基本的なAWSの使い方でインフラが構成されており、一部のアプリケーションにのみ右側のEKSを利用する、少し不揃いな構成になっています。

ベルフェイスとしては、コンテナ運用を主軸としてシステム改善/運用負荷低減を進めたく、その方針にずっとブレはありません。

ただかなり以前のことですが、これありきでKubernetesを採用し、結局のところやや持て余してしまっていた昨今の現状もあり、これを解消するプロジェクトをSREチーム一丸で進めることになったのでした。

なお、図内で "**ポイント!!**" と書いている箇所は通信が発生しており、今回の技術判断のポイントになった箇所です。
順番に、詳しくご説明していきます。

# ECS・EKSの話

まずは、本項の目玉の技術要素でもあるECS・EKSとはどういったものなのか、改めて特徴とメリデメをご紹介します。

## ECS (Elastic Container Service)

ECSはタスク定義と呼ばれる、動作アプリケーションコンテナに関するある種のひな形となる設定を、タスク (コンテナの実体) としてクラスタへ反映/実行させることで動作する、シンプルな作りになっています。

これを図にしてみると以下のようになります。
![ECS Architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/e64887c3-0b8d-1c04-b871-4978b7feb642.png)

ここでは、ざっくりした技術の全体感を見ていただきたいので個別的な説明は行いませんが、とてもシンプルなもの…という感覚は伝わると思います。

続いてEKSについて見ていきましょう。

## EKS (Elastic Kubernetes Service) 

EKSはマネージドのKubernetesサービスです。
つまり、クラスターとはKubernetesクラスターであり、それにかかわる管理機能は、クラスター内に全て有するということになります。
Kubernetesは、基本的にサービス稼働コンテナのスケジューリングを行うMaster Nodeと、実際にサービス稼働コンテナを受け持つWorker Nodeを、Kubernetesクラスター内に両方持つことになります。

これを図にしてみると以下のようになります。
![EKS Architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/570d8f50-d8a4-4fa5-96b2-08759587818c.png)

相当に簡略化はしていますが、ECSよりかなり複雑な構成となることが分かるでしょう。

というよりも、ここで出ている技術要素はほとんどKubernetesのことであって、これらをもし個別理解しようとすれば、とても大変そうだ…という感覚は伝わると思います。

ちなみにマネージドサービスなので、Master Node (コントロールプレーン) は、実際にはユーザーは見ることもできません。Kubernetesのバージョンだけは、AWSがサポートするものから選ぶことができます。

## ECSのメリット/デメリット
ECSについては、以下のようにまとめました。

- メリット
    - シンプルさ
    - 運用の手軽さ
    - 学習コストが高くない
- デメリット
    - ベンダーディペンド (AWS) でクラウド間の可搬性がない
    - コンテナ間通信を行う仕組みが標準では存在しない

これらについては、ほぼ同様のことを書いているサイトやQiita記事などもあるので、特に目新しい情報はないと思います。

## EKSのメリット/デメリット
EKSについても、以下のようにまとめました。

- メリット
    - 多機能でプラグインも豊富
    - デファクトスタンダードであり、クラウド間の可搬性がある
    - 複数種のリソース種を扱え、DBやバッチ処理のようなものもワンストップでの構成も可能
- デメリット
    - まだ成長途上であり、破壊的なアップデートが走ることがある
        - **総じて運用負荷が高くなりがち**
    - **学習コストがかなり高い**

こちらも同様に目新しい情報はないと思いますが、運用に関してのデメリットに、特に重要なポイントがあるように思いました。そのため**太字**で記載しました。

# えっ、逆じゃないの！？
経験者の方は「えっ、逆じゃないの！？」という感想を持たれるかもしれません。
題名からもお分かりのように…

- **ベルフェイスは主要システムの1つでEKSをやめ、ECSに移行するという決断を行いました！**

昨今の潮流としては、Kubernetesがすでにコンテナオーケストレーションのデファクトスタンダードとなっているので、「影響度の低いシステムからECS→EKSへの移行を検討しようかな…」という会社が多いという所感を、私も持っています。

そんな中で、当社が主要システムの1つでEKSをやめることにした大きな理由としては、以下の3つです。

1. アプリとインフラ役割分担の明確化
1. 既存のEC2環境の統一化を考えた時に、統一的なアーキテクチャへの移行の際に、シンプルなECSにしたい
1. アップデートに対する知識の追従コストが高かった点の改善

Kubernetesは、アプリケーション開発者がインフラを意識しなければならず、結果論としてアプリケーション開発に集中できない状況が生じたり、インフラ/アプリケーションの権限分離が難しくなったりする点も運用上の考慮を要します。

# EKSからECSへの移行でハマった箇所

EKS稼働していたシステムをECSに移行するだけであれば、基本的にはDockerベースであり、その難易度はさほど高くないです。
むしろ、EKSでは自家運用せざるを得ない点を、ECSはAWSマネージドで持っている点も多いので、構成はより簡単になるようにも思われます。

ただ、当社では非常に難しい点がありました。

それは、[こちら](https://qiita.com/numa-numa/items/3662bb3a7827f2385c48#%E3%83%99%E3%83%AB%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E3%81%AEsre%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C%E6%8B%85%E5%BD%93%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)で紹介した "**ポイント!!**" の箇所に関係があります。
図中のUser管理機能をさらにブレイクダウンした図が以下です。

![User Mgmt Detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/89f39c40-c07e-0b9d-bb99-3ffb10670ada.png)

EKSのデファクトとして外部通信のために `ALB Ingress Controller` というリソースを利用します。
その中で、URLの階層を利用したサービスルーティングを行っており、ALB (Application Load Balancer = AWS標準のWEBサービス終端) を通さず、**他のAWSアカウントにある**ベルフェイスのコアアプリケーションにアクセスするという設計が行われていました:sweat:

ALBについては、先ほど**終端** (エンドポイント) と書きましたが、終端であるがために **ALB -> ALB** へ通信するという構成は作ることができません。
つまり、ECS移行システムを作ったとしても、以下のような設計をすることはできません。

![User Mgmt NG Vision.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/162bc9ee-ba90-5720-26f1-5dd906b89681.png)

# 実際に問題を解決した方法

私たちは完全にこの問題に頭を悩ませていましたが、最終的には `ALB Ingress Controller` に依存していることにより、**類似の構成は作ることができないこと**を悟りました。

通常、上位のサービスルーティングには[CDN](https://e-words.jp/w/CDN.html) (WEBのアクセス負荷を軽減するものだが、今回の用途にも合う) を使用することが多いのですが、完全に頭を切り替えてそちらで実現できるように、設計しなおしました。

CDNとしては、AWSで提供されるCloudFrontを採用しました。
全ての通信においてキャッシュしない (負荷分散用途にはしない) 設定を行い、以下のように構成しました。

![User Mgmt CloudFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147015/bd69fb59-aebd-5ee0-8de5-920f043eccae.png)

# まとめ
ベルフェイスのSREチームでは、会社の状況の変化や技術的な方針転換もあり、一部ではEKSで構成していたコンテナインフラを捨て、ECSへ移行するという決断を行いました。ECS移行を行う中で見えてきたポイントを、以下の2点にまとめます。

- **単純なWEBをコンテナ化する目的では、EKSよりECSから検討すべし！**
- **ALB -> ALBへ通信したいような要件では、CDNを利用すべし！**

今後の展望として、現在EC2上で稼働している既存アプリケーションも、徐々にECSへ移行することを計画しています。
ベルフェイスは、1チームで改善に取り組んでいます:muscle:

# We are Hiring !!!
ベルフェイスでは、プロダクトやシステムのメンバーを引き続き積極採用しています！！

エンジニアの方は以下から:information_desk_person:
https://hrmos.co/pages/bellface/jobs/014

それ以外の各ポジションの方は以下から:information_desk_person:
https://hrmos.co/pages/bellface/jobs?category=1441373246841167872

カジュアル面談も行ってます:information_desk_person:
https://meety.net/articles/t2--7_60ljhphb

# Who's NEXT
明日の [bellFace Advent Calendar 2021](https://adventar.org/calendars/6917) のエントリーはシークレット:secret:
お楽しみに:bangbang: