Skip to main content

Amazon ECS (Elastic Container Service)

Overview

コンテナオーケストレーションをするサービス。
タスク定義、サービス、デプロイ方式、ヘルスチェック、サーキットブレーカーなどの管理機能を持っている。

特徴

  • Dockerと互換性があります。
  • タスクとサービスの概念を提供して、アプリケーションのコンポーネントを管理します。
  • タスク定義を使用して、コンテナーのセットを指定します。
  • サービスを使って、タスクのセットを維持・スケーリングできます。
  • Fargateというサーバレスコンピューティングエンジンを提供しています。これを使用すると、インフラストラクチャの管理を気にすることなく、コンテナーを直接実行できます。

ECSがない場合の運用docker

今まではEC2上にdocker engineをインストールして、その上でコンテナーを管理するという方法だった。
この場合、コンテナーごとにポート変えないといけなかったり、コンテナーで何かしら不具合起きたら ssh でログインして原因特定して治して、起動し直さないといけなかったりしないといけなかった。
また、アクセス集中してサーバー台数増やす時にまた環境構築しないといけなかったり、何かと監視が必要になってくる。

そこでECSの出番となる。
ECSでは上記のような問題をすべて解決してくれる。ポートマッピング、コンテナーの状態の監視、自動復旧などをおこなってくれる。

ECS関連の用語

Cluster(クラスター)

タスクやサービスを使う論理的なグループ。
コンテナーを動かすEC2やfargateの集合体のことをいう。

info

クラスターはリージョン固有の存在で跨ぐことはできない。

Service

Taskをまとめて管理するもの。同じサービス内で起動しているTaskは同じTask Definitionからできている。
サービスはタスクの集まりを表し、タスクの数や更新方法、配置戦略などを定義する。
タスク定義とサービス定義を関連付けることにより、コンテナーを実行する。

Task Definitionとは

ECSでコンテナーを起動するための情報を記載したもの。

  • どのimageでコンテナー起動するのか
  • cpuとメモリはどうするのか
  • portはどうするかとか
  • コンテナーが終了したり失敗した時に起動し直すのかどうかとか設定する。
    ※docker-compose.yml的な立ち位置でdocker-compose.ymlファイルでタスク定義ができる。

Taskとは

Task Definitionを元に起動した各コンテナー(またはコンテナーの集まり)のこと。 Railsでよくあるコンテナーの構成で例えるなら、appで1タスク、nginxで1タスク、dbで1タスクみたいなイメージ。

Fargateとは

Fargateはサーバーの管理が不要なコンテナー向けのサーバーレスコンピューティングエンジン。EC2を利用した場合、自分でサーバーを起動してecs起動してと言うことをしていたが、Fargateを利用した場合は、ECSのServiceの状態によってTaskを自動的に起動したり終了したり、設定によってTask数を増やしたり減らしたりといったことを自動でしてくれる。EC2では起動していた分だけ課金されるが、Fargateの場合はリソースに対しての従量課金となっているため、コスパがいい。

環境変数の渡し方

参考URL

ECSコンテナーには3つの方法で環境変数を渡すことができる

  1. ベタ書き
  2. S3からインポート
  3. パラメーターストア/Secrets Managerからインポート

2について
S3からインポートする方法は、S3バケット中のオブジェクトのパスを指定してenvファイルから変数を設定する方法。
ファイル中に複数の変数名と値を指定して一括でECSに読み込むことが可能

3について
パラメータストア/Secrets Managerからインポートする方法は、SSMパラメータストアもしくは、Secrets Managerに値を設定しておき、環境変数名に対応したパスやARNをECSに設定することで値を取得します。 パスワードなどの直接書き込むべきでない変数をセキュアに渡す際に活用できます。

パラメーターストア

パラメータストアの値に関しては同じリージョンならパスかARNで、異なるリージョンならARNで取得可能。

Secrets Manager

Secrets Managerの値はARNで取得が可能。

circuitBreaker(サーキットブレーカー)

サーキットブレーカーは、もともと電気回路のブレーカーに由来するソフトウェアのメタファーで、システム内で繰り返し失敗が発生した場合に、さらなる処理を停止してシステム全体を保護する仕組み。

ECSにおいては、「デプロイメントサーキットブレーカー」という機能があり、ECSサービスで新しいタスク定義へのデプロイ時に、起動したタスクがヘルスチェックに何度も失敗した場合、自動的にロールバックして以前の安定したタスク定義に戻します。これにより、失敗した新タスクが無限に置き換わり続けることを防ぎ、サービスの安定性を確保します。