【AWS】ECS+Fargateで環境構築

Dockerの基本的な座学は大体終えたので、AWSのECSをFargateで実践してみる。

用語整理

  • タスク…アプリケーション単位のコンテナのまとまりのこと。コンテナの集合体。 AコンテナとBコンテナという2つのコンテナでWebサーバーを構築する場合、Webサーバーのタスクということになる。次の「タスク定義」を元に作成される。
  • タスク定義…どのようなタスクを生成するかを定義しているもの。どんなイメージ、CPUやメモリの割り当て、などなどを設定する。
  • サービス…タスクのステータスを監視しながら、タスクの台数だったりを調整してくれるもの。
  • クラスタ…アプリケーション毎にタスクとサービスをまとめるもの。
  • ECRAWSが提供するDockerイメージのレジストリサービス
  • ALBロードバランサー(サーバーにかかる負荷を分散させるもの)
  • TargetGroup…ALBとサーバーの間にあるもので、ヘルスチェックなどを担う。

ECRへのプッシュ

ECRへイメージのプッシュは別の記事にまとめたので、既に使用するイメージのプッシュは済んでいるものとする。

クラスターの作成

ECS上でアプリケーションを動かすとき、クラスター、タスク、サービスの3つを主に作成することになるが、その中で一番大きい単位のものがクラスター。

今回は1つのタスクしか作らないが、複数のタスクをまとめる役割を持つ。

タスクが1つだとしても必要不可欠である。

ECSのダッシュボードからクラスターを作成する。

ネットワーキングのみと書かれ、AWS Fargateを使用と書かれたテンプレートを選択。

適当なクラスター名を入力し、VPCは既に作成してあるのであればVPCの作成にチェックは入れない。

今回はWebサーバーのタスクのみを入れるので、それ専用のパブリックVPCは予め作成しておく。

これで作成を押す。

タスク定義を作成

タスクのあれこれを記述するタスク定義を作成する。

同じくダッシュボードからタスク定義を作成。

FARGATEを選択、

タスクロール:ecsTaskExecutionRole

ネットワークモード:vpc

タスクメモリ&タスクCPU:とりあえず一番小さいもの

コンテナの定義:

コンテナ名はわかりやすいものを入力し、イメージに事前にECRへプッシュしておいたものを入力する。ECRのダッシュボードのURIに:tagとして:latestを付けておく。

メモリ制限はとりあえず128、ポートマッピングはdocker-composeでいうportsの部分を入力。

下のストレージとログの部分にボリュームの設定がある。

もし今定義しているコンテナが他のコンテナのボリュームを参照したい場合は、ボリュームソースのソースコンテナの部分に参照したいコンテナ名を入れる。多分docker-composeでいう(Ver3からはないが)volumes_forみたいなやつだと思う。

あとは基本そのままで作成。

サービスの作成

先程作ったタスク定義からどうやってタスクを作成するかと言うと、このサービスを作成し、実行することで作成することができる。

サービスはタスクやクラスターを設定した通りに管理してくれる優秀な装置みたいなもの。

前に作成したクラスターの画面からサービスを作成する。

起動タイプは勿論FARGATE、タスク定義は先程のを選択、リビジョンはlatest

サービス名はわかりやすいものを。

サービスタイプはとりあえずレプリカ。

タスク数は1。

最小ヘルス100、最大率200。

VPCやらセキュリティグループは予め設定したものを選ぶ。

サービス検出の結合の有効化はとりあえずなしで。

以上で作成。

作成が終わると、タスクを実行し、クラスターのタスクタブからステータスを確認することができる。

この時点で、タスクのパブリックIPへアクセスすると、対象のアプリケーションが表示されるはず。

コマンド入力が必要なときについて

rails db:createなどコマンド打ちたいからSSHでFargateに入りたいのですが、残念ながらFargateはSSHに対応していません。

ただ、AWSのSystemManagerを利用すれば出来るっぽいです。(動かすコンテナにssm-agentを入れたりとだいぶ面倒そうですが…)

https://qiita.com/pocari/items/3f3d77c80893f9f1e132

僕の場合はとりあえずrails db:createしたいだけだったので、既にテストとして作っていたEC2インスタンスを起動し、それにSSH接続しコマンド入力でcreateしました。