本記事ではECSって言葉は聞いたことあるけど、よくわからないという初めてECSを触れる方にもわかるように、ECSで使用される各コンポーネントがどんな仕組みを持っているか?を内容を中心的に解説してみようと思います。
前提
本記事はECSの超初心者向けの記事です。ECSを実務で使ってる方や中級者の方には物足りない内容となっております。
自分自身が超初心者のため初心者目線でECSについての記事を書きました。
私と同様にECSって聞いたことあるけど、よくわかってないという方、ちょっと勉強したけどよくわからなかったという方にはおすすめできるかなと思いますのでお時間ある方は最後までお付き合いください。
ECSとは
ECS = Elastic Contaier Serviceの略です。
これはAWSのサービス名と思っていただければ差し支えないです。
コンテナを使うサービスなんだな、とふわっと分かれば大丈夫です。
コンテナについて
前提としてECSの各コンポーネントを理解する上でコンテナについても理解しておく必要があります。
「コンテナ」とは入れ物です。
いわば魂の抜け殻となった人とも表現できます。
「入れ物」なのでこのままでは「入れ物」のままでしかありません。
このコンテナには中に「役割」を担わせることで効果を発揮できます。
魂の抜け殻に「役割」を与えて上げます。
例えば事務員やエンジニア。
彼らにはそれぞれ特徴を持った役割を持ってお仕事をします。
職種と言っても良いかもしれません。
ECSではこのコンテナの中に色々な役割を持たせてアプリケーションを動かすための「入れ物」として使います。
例えば
- Webサーバ
- アプリケーションのコード
などが当てはまります。
もう少し踏み込んでみましょう。
Webサーバとは例えばNginxやApache、アプリケエーションのコードをPHPだとするならば、
コンテナに対してこれらを入れ込むことで、NginxやApacheを入れたコンテナはWebサーバとしての役割を持ち、PHPを入れたコンテナはアプリケーションを動かす役割を持つことができます。
データプレーンについて
コンテナがどういったもので、どういう役割を持たせるのか、なんとなく理解できたかと思います。
このコンテナですが、コンテナ単体では役割は持っているものの、動かすことができません。
コンテナが動いて活躍するためには「土台」が必要になります。
例えば、その土台を「オフィス」を例にしてみましょう。
彼ら事務員やエンジニアが活躍するには「オフィス」が必要になります。
ECSではこの「オフィス」を整えることで、それぞれの役割を持ったコンテナが活躍することができます。
データプレーンと言われるEC2もしくはFargateという2つの舞台が存在します。
EC2はおそらく大半の方がご存知かと思いますので説明は割愛します。
FargateとはAWSがフルマネージドしてくれる土台で、以下のようなメリットがあります。
- サーバーレスである ゆえに管理 (OSやミドルウェア)が不要である
- パッチの適用が不要である
- スケーリングを自動でしてくれる
ECSの各コンポーネントについて
ECSを理解する上で欠かせない各コンポーネントについてご説明します。
とりあえず全体像です。
ちょっと解りづらいですね。
私は以下のように考えてみました。
一つずつ解説していきます。
ECSの各コンポーネントには以下があります。
- タスク
- タスク定義
- サービス
- クラスター
タスクとは
図の中ではチームで働く「プロジェクトチーム」と表現しました。
「タスク」=「コンテナの集まり」のことを指しています。
コンテナとはそれぞれ役割を持った事務員やエンジニアと表現しましたが、これらが集まったプロジェクトチームです。
実際のコンテナの役割で考えるとNginxとPHPが密接に関わり合い役割を全うします。
タスク定義とは
タスク定義とは開発プロジェクトを進める上では必ず「要件」が必要になってきますが、その要件を決める「要件定義書」や「設計書」と思っていただくと良いかと思います。
具体的には
- タスク定義ファミリー名
- 起動タイプ (Fargate / EC2)
- OS (Linux / Windows)
- ネットワークモード (Fargateの場合awsvpcのみ)
- タスクサイズ (vCPU / メモリのサイズを決めてそのサイズの中でコンテナが動きます)
- タスクロール / タスク実行ロール
- コンテナイメージ (コンテナに役割を持たせるための職種 (Dockerイメージ = コンテナを動かすためのテンプレート))
- 環境変数 (DBへの接続情報などを定義する USER_NAME, PASSWORD, DB_HOST, DB_NAMEなど)
- ログ収集
などをタスク定義では設定します。
(箇条書きした内容の詳細については割愛しますが、別記事で書ければ書きたいと思います)
サービスとは
サービスは「プロジェクトマネージャー」です。
プロジェクトマネージャーの仕事は、
- 要件に基づいた指示
- タスク進捗や負荷状況の確認
- プロジェクトメンバーの人員配置
などが挙げられます。
ECSにおけるサービスも、タスク定義に基づいてタスクに対して指示を出します。
メンバーはそれぞれ割り当てられたタスクをこなしているかと思いますが、
Nginxのコンテナ、PHPのコンテナに対して働いてもらうようにタスクに対して指示を出します。
またサービスは予めタスクを動かすためのタスク数を決めておき、その負荷に応じてタスクを増減させるために常に監視しています。
プロジェクトにおいても作業タスクが増えたまま、メンバーを増やさずに作業を続けるとメンバーに負荷が増えてしまいます。放っておけばそのまま炎上し、いずれそのプロジェクトは立ち行かなくなるといった事も考えられるでしょう。
NginxやPHPについてもクライアントからのトラフィック量に応じて対応できるキャパシティが決まっています。
トラフィック量に対応できるキャパシティがないと、コンテナは落ちてサーバエラーとなり障害発生ということになります。
クラスターとは
クラスターとは働くメンバーに場所を提供してあげるところで、いわば「オフィス」と言えます。
会社でお仕事する場合にはオフィスが存在し、そこで皆がせっせと働いています。
ECSではこのクラスターのことを「仮想的な運用環境」または「コンテナの実行空間」とも言えます。
データプレーンにはEC2とFargateの2つがあると申し上げましたが、今回はFargateについて解説します。
Fargateではこの「仮想的な運用環境」や「コンテナの実行空間」を管理しなくて良いというメリットがあります。
オフィスを使っていくと次第に汚くなってきて、掃除をしないとずっと汚くなっていきます。
しかし、Fargateの場合は掃除ロボが自動でオフィスを掃除してくれます。
これがECS Fargateの最大の特徴で、AWS側がコンテナの稼働するOSを管理しています。
つまり、OSのセキュリティパッチ適用や各種ライブラリのアップデート作業に割く人件費の削減などもできます。
これがFargeteではなく、クラスターをEC2にしている場合にはEC2に対するOSのセキュリティパッチ適用等が発生し、その分の運用コストが発生します。
また、Fargateは実行環境を自動でスケールアウトするため、その点を考慮する必要もありません。
人が増えてきたらオフィスが自動で増えてくれるとなったら最高ですね。
参考書籍
本記事を執筆するに当たり以下の本を参考にさせていただきました。
ECSを学ぶには最適の本で超おすすめです。
私も絶賛読み途中ですが、読んだ内容をできる限りアウトプットしていけたらと思っております。