Amazon Elastic File System(EFS)試用~AWSで簡易な冗長構成のWordPressを構築してみる~

概要

2018年7月11日から提供が開始されているAmazon Elastic File System(EFS)を試しに使ってみます。できるだけシンプルな形で冗長構成のWordPressを構築してみます。

おおまかな流れ

  1. ネットワーク設計
  2. AWS管理画面でEC2インスタンス・ELB・RDSを作成(本記事では省略)
  3. EC2インスタンスの初期設定・Apache導入(本記事では省略)
  4. RDS WordPress用ユーザー・DB準備(本記事では省略)
  5. EFS作成・マウント
  6. WordPress導入・投稿・表示テスト

ネットワーク設計

ネットワーク構成について

WebアクセスはELBを経由して2台のEC2インスタンスに流します。
EC2インスタンス2台から1つのEFS, 1つのRDSを利用させます。
RDSのマルチAZを有効にしてフェイルオーバーする構成にすることで、冗長化が可能です。

EFS自体も普通に作成するだけで複数のAZに冗長的に保存されるため可用性が確保されています。
( 参考:Amazon EFS のよくある質問 )

ネットワーク構成を図にまとめると以下のようになります。

ドキュメントルートについて

wordpress-web1, wordpress-web2両方のサーバーで、ドキュメントルートは/home/www/contents/htdocsに指定しました。ドキュメントルートを含む/home/www/contentsディレクトリごとEFSを利用するように進めたいと思います。

セキュリティグループ設定

EFS「wordpress-efs」に紐付いたセキュリティグループのアクセス元として、wordpress-web1, wordpress-web2のみからNFS(2049ポート)にアクセスできるよう設定しました。下記のセキュリティグループを作成し、wordpress-web1, wordpress-web2, wordpress-efsに設定します。

タイプ プロトコル ポート ソース 説明
NFS TCP 2049 sg-XXXXXXXX(設定しているセキュリティグループ自身) WordPress-EFS

EFS作成・マウント

AmazonLinuxの場合

AWSの提供しているEFS マウントヘルパーが利用可能です。wordpress-web1, wordpress-web2それぞれのサーバーで下記を実施します。

EFS マウントヘルパーをインストール

sudo yum install -y amazon-efs-utils

マウントするためのディレクトリを作成

mkdir /home/www/contents

EFS マウントヘルパーを利用してマウント

mount -t efs fs-XXXXXXXX:/ /home/www/contents

その他のLinuxの場合 (RedHat系のCentOS7で動作を確認)

wordpress-web1, wordpress-web2それぞれのサーバーで下記を実施します。

nfs-utilsをインストール

yum install nfs-utils

マウントするためのディレクトリを作成

mkdir /home/www/contents

/etc/fstabに下記を追記

fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/ /home/www/contents nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev 0 0

マウント

mount -a -t nfs4
マウントするためのディレクトリを作成した後、下記コマンドで直接マウントすることができます。

mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/ /home/www/contents
EFSのマウントがうまくいかない(タイムアウトする)場合、セキュリティグループの設定を見直してください。

WordPress導入・投稿・表示テスト

普通にWordPressのインストールを進めます。ドキュメントルートは1つのEFSなので、片方のサーバーにSSH接続してwgetで持ってきて解凍すればOKです!

ドキュメントルート作成

mkdir /home/www/contents/htdocs

最新のWordPressを取得

cd /home/www/contents/htdocs;
wget https://ja.wordpress.org/latest-ja.tar.gz

WordPressデータを解凍

tar zxf latest-ja.tar.gz

移動

shopt -s dotglob
mv /home/www/contents/htdocs/wordpress/* /home/www/contents/htdocs/

RDSにログインし、DBを用意

mysql -u マスターユーザ -p -h エンドポイント.ap-northeast-1.rds.amazonaws.com
mysql> CREATE DATABASE DB名;
mysql> GRANT ALL PRIVILEGES ON DB名.* TO ユーザー名@'%' IDENTIFIED BY 'パスワード';
mysql> FLUSH PRIVILEGES;

(ブラウザ)用意したDB情報を入力してWordPressインストールを進める

WordPressインストール完了です!

ドメインのDNSレコードを事前に用意したELBに向ける

この時点でサービスとして運用が開始できます! 2台のサーバーのアクセスログを見て、アクセスが分散してきていれば成功です!

EFSマウントの箇所のAnsibleロールを作りました

(tasks/main.yml)

  - name: INSTALL_NFS_UTILS
    yum: name=nfs-utils state=installed

  - name: CREATE_TARGET_DIRECTORY
    file: path={{ item.target_dir }} state=directory
    with_items: "{{ mount_data }}"

  - name: INSERT_FSTAB
    lineinfile: dest=/etc/fstab backup=yes regexp="^{{ item.efs_dns }}" line="{{ item.efs_dns }}:/ {{ item.target_dir }} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev 0 0"
    with_items: "{{ mount_data }}"

  - name: MOUNT_EFS
    shell: mount -a -t nfs4

(vars/main.yml)

mount_data:
  - { "target_dir": "/efs(マウントするディレクトリ)", "efs_dns": "EFS-ID.efs.ap-northeast-1.amazonaws.com" }

所感

EFSの登場前に作成したWordPressを利用したメディアでは、冗長構成にする際、画像データをS3に保管させる構成をとっていました。開発陣によると、この構成に対応していないプラグインがあったとのことでした。この問題はEFSを利用した構成にすれば解決しそうです。

また、サーバー1台で運用していたWordPressサイトをあとから冗長構成にしたい際にもEFSは使えそうです。アクセスは少ないけどできるだけ落としたくないWPサイトをライトに運用したいときに使えるかなと思います。今後、Webサーバー用途の利用の際のEFSのパフォーマンスを測るような検証も行ってみたいと思います。

参考

Amazon Elastic File System (EFS)の東京リージョン対応がアナウンスされました
https://aws.amazon.com/jp/blogs/news/amazon-elastic-file-system-efs-nrt/

[速報] EFS(Elastic File System)が2018年7月に東京リージョンで提供開始! #AWSSummit
https://dev.classmethod.jp/cloud/aws/efs-in-tokyo-region/