POSTD PRODUCED BY NIJIBOX

POSTD PRODUCED BY NIJIBOX

ニジボックスが運営する
エンジニアに向けた
キュレーションメディア

Andreas Wittig

本記事は、原著者の許諾のもとに翻訳・掲載しております。

WordPressはクラウド・レディでもサーバレスでもないので、私はあまり好きではありません。このブログは CloudFrontS3 を使用し、 Hexo で構築しています。しかし、なんと Webサイトの25%がWordPressを使って作成されているのです 。そこで、AWSでWordPressを構築する最も簡単な方法を説明します。フォールトトレランスとスケーラビリティを含んだ内容です。

次の図は、AWS上でフォールトトレラントかつスケーラブルなWordPress環境を構築する際のアーキテクチャを表しています。

WordPress on AWS
注釈:Elastic File System(EFS)
MySQL(マスター)
MySQL(スタンバイ)
WordPressを実行するEC2インスタンス
ロードバランサ
CDN

詳しく見ていきましょう。

問題点

WordPressは、MySQLのデータベースとディスク上のファイルという2つの異なるデータストレージを使用するPHPアプリケーションです。ファイルをディスク上に保存すると、EC2インスタンス群を使用してフォールトトレラントかつスケーラブルな方法でWordPressを実行する場合に問題が生じます。

次の例と図は、その問題点を表したものです。

  1. Maryが自分のブログに新しい画像をアップロードする。画像ファイルはES2インスタンス①に保存されている。
  2. Maryが記事を読み込む。EC2インスタンス①は彼女のHTTPリクエストに応えて、画像を入手する。
  3. BobがMaryの記事を読み込む。するとEC2インスタンス②がHTTPリクエストに応えて、 404 Not Found のエラーが出る。画像がEC2インスタンス①だけに保存されているからだ。

WordPress stateful server
面倒なことに、全てのEC2インスタンスでファイルを同期させるか、マネージドサービスにファイルをアウトソースしなくてはいけません。

1つ目の解決策

私は以前、AWSでWordPressを使う際に生じるこの問題を解決しようと試みました。 『AWSでWordPressを使用する:あなたの間違った使い方』 という記事に、解決策の詳細が載っています。

簡単に要約すると、以下のようなものです。

  • ユーザがアップロードする画像などをディスクに保存するのではなく、WordPressのプラグインを使ってS3に保存する。
  • ディスクにファイルを書き込むWordPressの他の機能を全て無効にする。プラグインやテーマのインストールとアップデート、自動更新機能、 .htaccess ファイルの書き込みなど。
  • 「各EC2インスタンスの起動時に、WordPressを全プラグイン/テーマを含めてインストールする」というプロセスを自動化する。

しかし、プラグインとテーマのインストール機能や、自動更新機能が使えないのは不便です。

2つ目の解決策

Elastic File System(EFS)は2016年にAWSのサービスに追加されました。
EFSは高可用性のスケーラブルなネットワークファイルシステムで、NFSプロトコルを使用してEC2インスタンスに接続できます。ファイルをアウトソースするには完璧な場所です。

次の図は、WordPressを実行する各EC2インスタンスが、どのようにEFSに接続してファイルを読み書きするかを表しています。ユーザがアップロードするものと、WordPressのファイルを区別する必要はありません。

WordPress with EFS
注釈:Elastic File System(EFS)
EC2インスタンス群

EC2インスタンスがEFSからファイルを読み込む際は毎回ネットワーク呼び出しが必要なので、ファイルのキャッシュが重要です。

特に .php ファイルの場合はそうです。WordPressはリクエストの度に、多くの .php ファイルにアクセスする必要があるからです。 OPcache を使えば、すぐに解決できるでしょう。

同様に、静的ファイルのキャッシュも必要になります。WordPressのブログの訪問者は、それぞれ同じ .css ファイルや .js ファイルを読み込まなければいけないので、CloudFrontのようなCDNが最適です。

これらのサービスに基づいた、AWS上のWordPressのアーキテクチャ完成図は次のようになります。

  • CloudFront:動的、静的コンテンツのためのCDN
  • ELB(Elastic Load Balancer):EC2インスタンスへリクエストを転送して、SSLを終端させるロードバランサ
  • EC2(Elastic Compute Cloud):Webサーバを実行する仮想マシン
  • EFS(Elastic File System):WordPressのファイル(WordPressコア、プラグイン、テーマ、ユーザがアップロードするもの)のストレージ
  • RDS(Relational Database Service):MySQLのデータベース

WordPress on AWS
注釈:Elastic File System(EFS)
MySQL(マスター)
MySQL(スタンバイ)
WordPressを実行するEC2インスタンス
ロードバランサ
CDN

デプロイ

上記で説明したように、EFSを使用してAWSでWordPressを使いたいですか? 私はCloudFormationのテンプレートを作成しました。次に挙げる特徴を含んだ、求められるクラウドインフラストラクチャの構築が数分で行えます。

  • 信頼性:Multi-AZによるフォールトトレランスとスケーラビリティ
  • セキュア:HTTPSのみ
  • 高速化:CDNが静的コンテンツをキャッシュ
  • 発展:ユーザのアップロードに対応できるスケーラブルなファイルストレージ

AWSでWordPressを使うためのCloudFormationのテンプレートについて 詳しく知り 、数分でスタックをローンチしてみてください。

以下の書籍と記事をお薦めします。