ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Amazon EFS で同期させないディレクトリの作り方

アドヴェントなカレンダーも6日目。 おはようございます、コバケンです。

今回は、クラウドネイティブな NFS ファイルシステム「Amazon EFS」について語ってみようかと思います!

複数の EC2 インスタンスで構成される Web アプリケーションなどにおいて、コンテンツを各インスタンスに腹持ちせず Amazon EFS に保存してネットワーク越しにステートレスに共有することがあります。

この EFS に保存して共通化したコンテンツの中に、キャッシュファイルやログファイルがあって、これらは同期をさせたくない、個々のインスタンスで、ローカルファイルを参照させたいという要件をいただくことは多々あります。

今回は、シンボリックリンクを使った、同期させないディレクトリーの作成方法についてまとめてみます。

概要

  • 複数の Amazon EC2 インスタンス間でコンテンツを共有したい
  • リリース作業は一度で済ませたい。
  • 各インスタンスの同期は面倒なので自動化したいが、サーバーには負担をかけたくない。
  • 共有するディレクトリーの中には、一部共有したくないディレクトリーもある
  • これらのご要望を Amazon EFS と シンボリックリンクで解決!

事例紹介

以下の構成例を元に、Amazon EFS とシンボリックリンクの設定方法を記載してみます。

  • アプリケーション用のディレクトリ
    /etc/sync_settings

  • EC2 インスタンスごとに保存したいキャッシュファイルとログファイル /etc/offline/cache
    /etc/offline/log

Amazon EFS マウント

まず、複数のインスタンスで同じファイルを参照させるために Amazon EFS を構築します。 今回は、EFS をプライベートサブネットに構築し、AZ a、AZ c、Az d の各インスタンスからアクセスできるようにしました。 バーストスループットモードで構築し、運用開始後に BurstCreditBalance ※ の値を監視することにしました。

マウント先は、/efs/ としました。すなわち、

/efs/sync_settings

という形でコンテンツを参照ができるようにしました。

シンボリックリンク

一方で、キャッシュファイルとログファイルに関しては、普通に EFS をマウントすると子ディレクトリも同期してしまうため、シンボリックリンクでローカルを向けるようにしました。

$ sudo mkdir /etc/offline/cache
$ sudo mkdir /etc/offline/log
$ sudo ln -s /etc/offline/cache /efs/sync_settings/cache
$ sudo ln -s /etc/offline/log /efs/sync_settings/log
$ ls /etc/offline/
cache  log
$ ls -l /efs/sync_settings/
total 8
lrwxrwxrwx 1 root root 18 Dec  3 23:16 cache -> /etc/offline/cache
lrwxrwxrwx 1 root root 16 Dec  3 23:16 log -> /etc/offline/log
$

試験

ここまで設定ができたら試験をしてみます。 「/efs/sync_settings/cache」ディレクトリーにキャッシュファイルのダミーファイルを書き出して、各インスタンスごとに保存されることを確認してみました。

  • fs-aa11111b が Amazon EFS のエンドポイントです。
  • 「/efs/sync_settings/cache」を「/etc/sync_settings/cache」としてリンクしています。
  • 以下ホストAには、試しに「hoge_123.txt」を保存しました。

ホスト A (ip-xxx-xxx-xxx-101) にて確認

[ec2-user@ip-xxx-xxx-xxx-101 ~]$ hostname
ip-xxx-xxx-xxx-101
[ec2-user@ip-xxx-xxx-xxx-101 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 483M 64K 483M 1% /dev
tmpfs 493M 0 493M 0% /dev/shm
/dev/xvda1 7.8G 1.2G 6.6G 15% /
fs-aa11111b.efs.ap-northeast-1.amazonaws.com:/ 8.0E 0 8.0E 0% /etc/sync_settings
[ec2-user@ip-xxx-xxx-xxx-101 ~]$ sudo touch /efs/sync_settings/cache/hoge_123.txt
hoge_123.txt

ホスト B (ip-xxx-xxx-xxx-201) にて確認

ホストBでも「hoge_456.txt」を保存しましたが、ホストAに保存した「hoge_123.txt」はもちろん見えません。

[ec2-user@ip-xxx-xxx-xxx-201 ~]$ hostname
ip-xxx-xxx-xxx-201
[ec2-user@ip-xxx-xxx-xxx-201 ~]$ ls -l /etc/sync_settings/
total 4
lrwxrwxrwx 1 root root 12 Jun 2 08:25 cache -> /etc/sync_settings/cache
[ec2-user@ip-xxx-xxx-xxx-201 ~]$ ls -l /efs/sync_settings/cache/hoge_123.txt
ls: cannot access /efs/sync_settings/cache/hoge_123.txt: No such file or directory
[ec2-user@ip-xxx-xxx-xxx-201 ~]$ 

図解

図に記載すると、以下のようになります。 ログやキャッシュファイルといった、各サーバー固定で所持しないといけないものを共通ファイルサーバーから切り離しには、 シンボリックリンクの設定が有効的です。

以上、Amazon EFS で同期させないディレクトリを作った事例の紹介でした。

参考情報

※ BurstCreditBalance Amazon EFS がネットワークスループットをバーストさせる際に使用するクレジット。 (現在では、100MB/秒 まで対応) 0 になるとベースラインまで転送速度が落ちてしまう。

※ unlink シンボリックリンクを解除するときは、unlink を使います。

$ sudo unlink /efs/sync_settings/cache
$ sudo unlink /efs/sync_settings/log
$ ls -l /etc/offline/cache/
total 0
-rw-r--r-- 1 root root 0 Dec  5 23:20 hoge
$