小さなエンドウ豆

まだまだいろいろ勉強中

スタートアップのための AWS Fargate 入門

スタートアップのための AWS Fargate 入門

本記事は以下の内容を読んでより具体的な方法について書いたものです。

aws.amazon.com

そもそもコンテナが解決しているもの

アプリケーションを動かすにはコードだけでなく関連するコンポーネントが揃っている必要があります。
例えば Ruby on Rails の場合は以下が挙げられます。

このような依存関係を解決するための手段としてコンテナが利用されます。
アプリケーションの実行に必要な依存ブルをすべてコンテナの中にパッケージングし、開発環境から本番環境まで同一の環境で動作させることが出来ます。

https://d2908q01vomqb2.cloudfront.net/0286dd552c9bea9a69ecb3759e7b94777635514b/2019/08/07/docker2.png

パッケージングされたコンテナを実行するツールとしてデファクトスタンダードとなっているのが Docker です。
Docker Engine が動いている環境であればコンテナを実行することが出来ます。
Docker Engine の管理するスコープとしては単一ホストマシン上でのコンテナの動作になります。
それ以外の部分、例えばコンテナのオートスケーリングや複数ホストマシンにまたがるような配置、ローリングアップデートなどは別の仕組みとして実装する必要があります。

ローリングアップデートとは

同じ機能を持った複数のコンピュータで構成している場合のシステムをアップデートする手法の一つです。 システムの稼動状態を維持しながら、1台ずつ順番にアップデートを行っていきます。

コンテナオーケストレーション

AWS ECS や EKS といったサービスがこれに当たります。
複数のホストマシンにまたがるコンテナの配置やコンテナのアップデート、ロードバランサーへの紐づけなどを管理してくれます。
以下のイメージのようにこちらから API 経由で変更後の状態を支持することでツールがその状態になるように維持・動作します。
これを宣言的デプロイと呼ぶそうです。

https://d2908q01vomqb2.cloudfront.net/0286dd552c9bea9a69ecb3759e7b94777635514b/2019/08/07/docker3.png

コンテナオーケストレーションをを使うとオートスケールや複数のマシンでのコンテナ管理が簡単になり、開発者はコンテナの運用に集中できると思われるが、
実際はホストマシンそのものの管理や運用は依然として残っています。
コンテナが動くホストマシンは OS が動いていますし、Docker Engine が動いている必要があるからです。

コンテナ解決することは上記にも書きましたが、その一方でコンテナとホストマシンの両方を管理・運用しなければならないということになります。

AWS Fargate とは

上記のような二重管理を解決するのが AWS Fargate です。
ECS でコンテナを実行する際の起動タイプの一つで、EC2 と Fargate があります。 EC2 で実行したい際のイメージが以下です。
「どのホストマシン」で「どのコンテナ」を「いくつ起動する」かなどのハンドリングは、オーケストレーションツールである Amazon ECS から行うことが可能ですが、各ホストマシンの管理・運用業務は依然として残ります。

https://d2908q01vomqb2.cloudfront.net/0286dd552c9bea9a69ecb3759e7b94777635514b/2019/09/10/ecs1-2.png

一方 Fargate がこちらです。

https://d2908q01vomqb2.cloudfront.net/0286dd552c9bea9a69ecb3759e7b94777635514b/2019/09/10/fargate2-1.png

この画像ではホストマシンが見えなくなり、OS や Docker Engine, ecs-agent が抽象化され Fargate プラットフォームに隠蔽されていることを表しているようです。

他にも以下のようなメリットがあります。

クラスタの管理が不要(キャパシティ)

通常、EC2 等の仮想マシンクラスタを構築し運用する際には様々なことを考慮する必要があります。
AWS Fargate を利用すると、こういったことを意識することなくコンテナを実行することが出来ます。
コンテナ実行時に必要な CPU, メモリの組み合わせを選択するだけでよく、リソースの調達等は Fargate プラットフォーム側で行われます。

ホストマシンの管理が不要(セキュリティ等)

コンテナワークロードに限らず、通常 EC2 等の仮想マシンを運用する際は、 OS やミドルウェアのバージョンアップやセキュリティパッチの適用などをやらなければなりません。
Fargate プラットフォームの管理運用は AWS にて行うため、前述の OS や Docker Engine, ecs-agent 等のバージョンアップやセキュリティパッチの適用もこの中に含まれるため、行う必要はありません。

実践

AWS が用意しているチュートリアルをもとに気になった用語などをまとめていきます。

https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/firstRun

ほとんどデフォルトのままで起動が可能でした。

Container definition

どんなコンテナを使うか宣言する部分。
チュートリアルでは Apache, Nginx, Tomcat とカスタムが用意されています。 今回は Nginx を選択。

カスタムにするとマシンスペックも選ぶことが出来ます。(CPU, メモリなど)

Task Definition

どのように起動させるかここで決めることが出来ますが、チュートリアルではすでに設定があるため必要ありませんでした。

Service

先程設定したタスク定義を何個実行して維持するか設定できます。
必要なタスクの数やロードバランサ(なし or ALB)を選ぶことができます。

Cluster

VPC, サブネットを設定します。 新規作成してくれるようなのでいじらずにそのまま作成へ。

これだけで Nginx に接続ができました。
後にタスクの数を 2 つにして起動し直し、2つにアクセスが振り分けれることも確認できました。

まとめ

  • コンテナを使うとアプリケーション実行に必要な依存関係をパッケージングしてくれる
  • コンテナを複数マシンで実行するためにンテナオーケストレーションツール(ECSやEKS)は必須
  • Fargate は ECS の起動モードの一つでホストマシンの管理が不要になる
  • Fargate のチュートリアルは雰囲気を味わうにはよい

今回はチュートリアルの内容をただやった実施しただけなので、次回は自作のコンテナを Fargate 上で実行するってことに挑戦してみます。