概要
2018年7月11日から提供が開始されているAmazon Elastic File System(EFS)を試しに使ってみます。できるだけシンプルな形で冗長構成のWordPressを構築してみます。
おおまかな流れ
- ネットワーク設計
- AWS管理画面でEC2インスタンス・ELB・RDSを作成(本記事では省略)
- EC2インスタンスの初期設定・Apache導入(本記事では省略)
- RDS WordPress用ユーザー・DB準備(本記事では省略)
- EFS作成・マウント
- WordPress導入・投稿・表示テスト
ネットワーク設計
ネットワーク構成について
WebアクセスはELBを経由して2台のEC2インスタンスに流します。
EC2インスタンス2台から1つのEFS, 1つのRDSを利用させます。
RDSのマルチ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
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/