ECS (Amazon Elastic Container Service) の EC2 起動タイプ で WordPress を動かす

ECS とは

  • Docker コンテナのオーケストレーション
  • 一個以上のコンテナから構成される「タスク」や「サービス」を定義し、それらを「クラスター」 (EC2 インスタンス) 上でうまいこと動かす仕組みを提供
    • スケールアウト、スケールインとロードバランシング
    • タスク間の通信
    • タスクの死活管理

ECS におけるコンテナ起動方式

2 種類ある。

EC2 起動タイプ

  • コンテナを動かす EC2 インスタンスを自分で管理する
  • ホスト EC2 インスタンスをいじれるのでいろいろできる
    • ホストに SSH ログインして、サーバー上から直に docker exec してコンテナ内でなにかする
    • EFS をマウントしてコンテナ間でファイル共有
    • ホストになんかツールやデーモン入れる
  • ホスト EC2 インスタンスを自分で管理しなければならないので、面倒くさい
    • コンテナ数のスケーリングとは別に、ホスト EC2 インスタンスのスケーリングも考えなくてはならない
    • OS 脆弱性対応など

Fargate 起動タイプ

  • コンテナを動かす EC2 インスタンスは AWS 管理なものを使用する
  • ホスト EC2 インスタンスが AWS 管理なので制限がある
    • ホストに SSH できない
    • (2018/08 時点では) EFS マウントできない
    • コンテナ止めるとストレージは消えるのでボリューム周りで考慮が必要
  • EC2 起動タイプで挙げたような、ホストマシンについて管理すべき点が減るのでラク

「EC2」起動タイプの ECS で WordPress を動かす

以下を組み合わせて動かしてみた。

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 関連設定を指定
  • ボリュームソース: 先に定義した 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 コンテナが復活させてくれる。便利。