ECS とは
- Docker コンテナのオーケストレーション
- 要は Docker Compose や Docker Stack でやろうとしていることを AWS インフラ用に落とし込んだ感じかと
- 一個以上のコンテナから構成される「タスク」や「サービス」を定義し、それらを「クラスター」 (EC2 インスタンス) 上でうまいこと動かす仕組みを提供
- スケールアウト、スケールインとロードバランシング
- タスク間の通信
- タスクの死活管理
ECS におけるコンテナ起動方式
2 種類ある。
EC2 起動タイプ
- コンテナを動かす EC2 インスタンスを自分で管理する
- ホスト EC2 インスタンスをいじれるのでいろいろできる
- ホストに SSH ログインして、サーバー上から直に
docker exec
してコンテナ内でなにかする - EFS をマウントしてコンテナ間でファイル共有
- ホストになんかツールやデーモン入れる
- ホストに SSH ログインして、サーバー上から直に
- ホスト EC2 インスタンスを自分で管理しなければならないので、面倒くさい
- コンテナ数のスケーリングとは別に、ホスト EC2 インスタンスのスケーリングも考えなくてはならない
- OS 脆弱性対応など
Fargate 起動タイプ
- コンテナを動かす EC2 インスタンスは AWS 管理なものを使用する
- ホスト EC2 インスタンスが AWS 管理なので制限がある
- ホストに SSH できない
- (2018/08 時点では) EFS マウントできない
- コンテナ止めるとストレージは消えるのでボリューム周りで考慮が必要
- EC2 起動タイプで挙げたような、ホストマシンについて管理すべき点が減るのでラク
「EC2」起動タイプの ECS で WordPress を動かす
以下を組み合わせて動かしてみた。
- Docker 公式の WordPress イメージ
- なんか寂しいので BusyBox で Data Volume Container 的なコンテナも動かす
- Aurora Serverless
Auto Scaling 周りは全くノータッチなので、またいずれ……
タスク定義
Docker Compose と同様に、コンテナの仕様を定義。
- 「EC2」起動タイプを選択
- タスク定義名: 適当に設定
- タスクロール: (EC2 インスタンスの IAM ロールのように) コンテナに IAM ロールを割り当てたい場合は設定
- ネットワークモード: とりあえず
awsvpc
(各タスクに ENI をアタッチ) でいいのでは- 参考: ネットワークモード
data_volume
: Data Volume コンテナ
- 適当にボリューム作成
- ここでは
webdata
としてホストの/ecs/webdata
をマウント
- ここでは
- イメージ: 適当に Docker 公式の
busybox
- 基本 (
essential
のクソ訳) : チェック外す- 参考: タスクでのデータボリュームの使用
- コマンド: 正常終了すればなんでもいい
- マウントポイント: 先に作成した
webdata
ボリュームを、コンテナ内に/var/www/html
としてマウント - ログ設定: CloudWatch に吐き出す
wp
: WordPress コンテナ
- 80 番ポートのマッピング設定
- 環境変数: 適宜 DB 関連設定を指定
- 参考: Docker Hub の説明
- ボリュームソース: 先に定義した
data_volume
からボリュームをマウント - ログ設定: CloudWatch に吐き出す
クラスター作成
コンテナをホストする EC2 インスタンス周りの設定。
- 「EC2 Linux + ネットワーキング」を選択
- クラスター名: 適当に指定
- EC2 インスタンスタイプ: コンテナを動作させるのに十分なスペックのインスタンスタイプを選択
- キーペア: ホストに SSH ログインする場合は必須
- VPC 周り: お好みで
- コンテナインスタンスの IAM ロール:
ecsInstanceRole
がない場合は、自動的に新規作成してもらえばよい
作成を実行すると、EC2 インスタンスの Auto Scaling 設定からなる CloudFormation スタックが作成されて、EC2 インスタンスが起動する。
サービス定義
スケーリングやコンテナの配置など、タスク定義で定義したタスクをクラスター内で動かす方法を設定。
- 起動タイプ:
EC2
- タスク定義: 先の手順で定義したタスク
- タスク数: 1 以上としてタスクを起動するようにする
- VPC 周り: お好みで
- ELB 設定: コンテナへアタッチされた ENI にパブリック IP が無いため、ALB を噛まさないと外部からアクセスできないので適宜設定
動作確認
ここまで行うと、クラスターの EC2 インスタンス上でコンテナが作成される。
※busybox
のコンテナは一瞬で正常終了する。
ALB のエンドポイントへアクセスすると、WordPress 初期インストール画面が表示されるはず!
また、ECS のサービス定義で タスク数=1
と指定したため、WordPress のコンテナを手動でぶっ殺しても ECS が自動的に WordPress コンテナが復活させてくれる。便利。