ECS 再入門 vol.3 ECS と共有ストレージ

Fri, 13 Dec 2019


この記事は Fusic その 2 Advent Calendar 2019 13 日目の記事です。

はじめに

前回は、ECS を利用する際のオートスケールについて書きました。
システムによっては、オートスケールしても所定の位置にある画像ファイルを参照したいなどの要件があるかと思います。

今回は、そんな時に必要になる ECSで共有ストレージを使用する方法 について書きたいと思います。

ECS と共有ストレージ

共有ストレージの種類

ECSで利用可能な共有ストレージは、下記になります。

  1. 非永続データボリューム

    タスクが終了すると消滅する、揮発性のボリューム。Fargateは非永続ボリュームしか使用できない。

    • レイヤストレージ

      タスク毎に10GB割り当てられ、そこからイメージの容量を差し引いた容量(イメージが4GBなら6GB)を書き込み領域として使用可能。コンテナ間で互いに独立しているため、一切の共有はできない。

    • ボリュームストレージ

      タスク毎に4GB割り当てられ、タスク定義内でDockerボリュームとして利用可能。コンテナ間で共有可能だが、コンテナインスタンス間では共有できないので、2台以上のFagateで共有することはできない。

  2. 永続データボリューム

    タスクが終了しても消滅しないボリューム。

    • Docker ボリューム

      コンテナインスタンスの /var/lib/docker/volumes に作成される Docker マネージドボリューム。

      タスク定義のvolumesdockerVolumeConfigurationの設定を記載して、コンテナにマウントして使用(公式サイト)。コンテナインスタンス間での共有はできない。

    • バインドマウント

      ホストマシン上のファイルやディレクトリをコンテナにマウントする。

      タスク定義のvolumeshostの設定を記載して、コンテナにマウントして使用(公式サイト)。

      こちらもコンテナインスタンス間での共有は 基本的には できない。

コンテナインスタンス間でのストレージ共有

前述の通り、コンテナ間でのストレージ共有はECSの基本的な機能で賄うことができますが、コンテナインスタンスを跨いだストレージ共有は基本的な機能のみでは難しいです。

そこで、下記のような方法をとります。

[方法1] コンテナインスタンスにS3等をマウントして、そのマウントポイントをコンテナにマウントする

  1. 共有ストレージとして、EFSやS3等のストレージサービスを用意する
  2. ユーザーデータや fstab を使用して、コンテナインスタンス起動時に、共有ストレージを所定の位置にマウントするように設定する
  3. タスク定義のバインドマウントを使用して、2で共有ストレージをマウントしたパスを、さらにコンテナにマウントする

文章に起こすと複雑ですが、こちらの方法が正攻法です。ただし、2019年12月12日現在、EC2起動タイプにしかできない方法になります。

[方法2] アプリケーション側でS3等をストレージとして参照するように設定する

  1. 共有ストレージとして、S3等のマウントする必要のないストレージサービスを用意する

  2. アプリケーション側で用意したS3等の外部ストレージを仮想的にストレージ領域として使用する

アプリケーションをECS専用に改修する必要がありますが、EC2起動タイプ、Fargate起動タイプ問わずに利用が可能です。そのため、Fargateを使用する場合は現状こちらの選択肢しか無いかと思います。

まとめ

今回はECSをオートスケールした際に発生する、共有ストレージの問題について少し詳しくまとめてみました。 EC2起動タイプでは、アプリケーション側で一切意識することなく通常のストレージのように共有ストレージを利用する方法が存在しますが、2019年12月12日現在、Fargate起動タイプには存在しません。

ただ、将来的にはFargateもEFSに対応して、今よりももっと利便性が上がると信じています。


← back