ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

AWS Fargate のタスクにおけるコンテナ間のファイル共有をバインドマウントによって実現する

こんにちは、rightgo09 です。今回は AWS Fargage のコンテナ間でのファイル共有についてまとめます。

よくありそうな例として、Fargate のタスク内にアプリケーションと HTTP サーバを別のコンテナとして設置したいが、アプリケーションが生成した静的ファイルたちは HTTP サーバに直接配信してもらいたい、という場合を考えます。

まとめ

アプリケーションの Dockerfile にて VOLUME 命令で共有したいディレクトリを指定して、タスク定義の HTTP サーバのコンテナの方でボリュームソースとして設定すれば共有が可能なようです。

まとめ画像

その1.VOLUME でマウントする場所を指定する
その2.Docker イメージたちを Fargate で使用する

具体例

アプリケーションの Dockerfile

...
WORKDIR /var/www/html
COPY . /var/www/html/

RUN npm install
RUN npm run build

# 共有したいディレクトリを指定する。
# このディレクトリに静的ファイルたちがあって、HTTP サーバが直接配信してほしい。
VOLUME ["/var/www/html/public"]

HTTP サーバ(以下は Nginx)の 設定

    server {
        # ルートを上記のディレクトリと同じように指定する。
        # Nginx 単体ではこのディレクトリは存在していないので、マウントすることが前提となっている。
        root /var/www/html/public;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            fastcgi_index index.php;
            fastcgi_pass localhost:9000;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;

        }

ECS タスク定義で設定する

「読み取り専用」にチェックをする場合は、マウントするディレクトリには書き込みができません。

なお、現在、ECS の新しい管理画面では、まだこの設定ができず、通常の画面または JSON による設定が必要となるようです。

参考:

unifa-e.com