こんにちは。かっぺいです。
AWSでWordPressサイト構築、第3回。EFSです。
静的コンテンツが、将来的にストレージを圧迫していくことが想定されるため、最初の構築時点からAWSであることを活用できないかなと考えていました。
プラグインで、静的コンテンツをS3にアップロードして配信においてもスケーラブルに行うというものがありましたが、結局ローカルも使うのでストレージサイズという点からは、あまり効果がないのかなと思いました。
そこで考えたのが、EFSを構築して静的コンテンツを配置すればどうかなと思いました。
EFSは、簡単に説明するとNASのようなものをマウントする形になるので、EC2とEFS間で通信が発生します。
ただ、AWSでは同一リージョン内のサービス間通信には費用が発生しないので、S3に置いた時と通信量という点では同等かなと思いました。
配信という点については、CloudFrontを使うのでビヘイビアで静的コンテンツのキャッシュ時間を調整すれば、EC2への負荷軽減にもなるので、スケーラブルなことはとりあえず考えなくて済むのではと思っています。
また、EFSに静的コンテンツを配置することで、将来 ELBを使ったときにも問題にならない気がしています。(WordPress初心者なので、気づいていないだけかもしれませんが)
EFS作成
まずは、マネージメントコンソールにログインして、サービスからEFSを選びます。
EFSを作成したいリージョンが選択されていることを確認したら、ファイルシステムの作成を選びます。
ポップアップで、ファイルシステムの作成画面が表示されます。

このまま作成でも良いのですが、プライベートサブネットに配置したいので「カスタマイズ」を選びます

名前の入力します。
値段がそれほど高くないので「自動バックアップを有効化」をデフォルトのままチェックを入れておきます。

パフォーマンスモードと、スループットモードも通常の利用であれば、デフォルトのままで大丈夫です。

タグはそのまま、「次へ」を選びます。

ネットワーク設定になります。VPCとAZとサブネットを選びます。
プライベートサブネットを選ぶ場合は、サブネットで変更します。
セキュリティグループは、マウントしたいインスタンスと同一のものを選んでおくことをお勧めします。

最後に、ファイルシステムポリシーを指定します。
プライベート空間に配置する場合は、特に指定しなくて良いと思います。
「次へ」を選択後に、確認画面となり「作成」を選ぶとEFSが作成されます。
EC2インスタンスからEFSの利用
LinuxのEC2インスタンスからは、NFSとしてマウントできますが、現在はamazon-efs-utilを利用した、EFSマウントヘルパーからの利用を推奨しているようです。
EC2インスタンス作成時に、作成済みのEFSを追加することができるので、インスタンス作成前にEFSを作成して、EC2インスタンスを作成する手順をお勧めします。
EC2のインスタンス作成画面の、ストレージを設定から、右下の編集を選びます。

EBSボリュームの下に、EFSを選べるのでEFSを選びます。

同一リージョンにあるEFSが表示されるので、マウントしたいEFSを選び、マウントポイントを指定します。
マウントポイントは、デフォルトのままでも問題ありません。
「セキュリティグループを自動的に作成してアタッチ」は、EFS作成時にセキュリティグループを指定しているのでチェックを外します。
この状態で、EC2インスタンスを作成すると、ユーザーデータに必要なパッケージのインストールと指定のEFSをマウントするスクリプトが自動的に定義されます。
作成したインスタンスを起動して、セキュリティグループとサブネット設定が正常であれば、指定したマウントポイントにマウントできているはずです。
dfコマンドで確認してみると
sh-4.2$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 908088 0 908088 0% /dev
tmpfs 947900 0 947900 0% /dev/shm
tmpfs 947900 1916 945984 1% /run
tmpfs 947900 0 947900 0% /sys/fs/cgroup
/dev/nvme0n1p1 10464236 3293304 7170932 32% /
/dev/nvme0n1p128 10202 3820 6382 38% /boot/efi
127.0.0.1:/ 9007199254739968 126976 9007199254612992 1% /mnt/efs/fs1
/mnt/efs/fs1がマウントされています。ペタバイトまでスケールできるので、サイズの桁が他と違います。
WordPressの静的コンテンツの移動とリンク
あとは、静的コンテンツのフォルダ、wp-contentsをこのEFS配下に移動し、元の場所とのリンクを行います。
# cd /var/www/html
# mv wp-content /mnt/fs/efs1/
# ln -s /mnt/fs/efs1/wp-content wp-content
以上で、静的コンテンツをEFS配下におくことができるようになります。
2023/12/31追記
wp-content/uploadフォルダを共有フォルダにするのが正解だったようです
2024/1/27追記
コンテナでWordPressを構築する場合は、wp-content全体を共有フォルダにしないとストレージの永続化が行えないとのこと。
AWS Backupの設定
EFS構築時に、「自動バックアップの有効化」にチェックを入れておくと、AWS Backupの設定が自動的に作成されます。
自動的に作成されるバックアップルールが、毎日バックアップし5週間保存という内容になっていますので、適度な値に変更します。
マネージメントコンソールから、Backupを選び、マイアカウントのバックアッププランを選びます。

EFSの自動バックアッププランを選びます。

バックアップルールを選びます

バックアップ頻度、保持期間が主なバックアップ設定になります。
頻度は毎日で良いと思うので、保持期間を2週間とか適度な値に変更しましょう。
長い間保持していても良いのですが、AWSは使った分だけ費用が発生します。自分の利用目的に合った適切な値に設定することをお勧めします。
設定適用後、すぐにバックアップリソースが削除されるわけではありません。次回のバックアップルールが稼働したときのバックアップから、保持期間が動作します。
古いリソースは、取得した時の保存条件が適用されて削除されます。