【WordPress + ElastiCache】永続オブジェクトキャッシュ実装

Blog-Thumbnail_WordPress-01

はじめに

こんにちは、KUDs です。

突然ですが、WordPress のサイトヘルス機能は利用していますか?
WordPress 管理画面の「ツール」から利用可能です。
ここでは、サイトのセキュリティやパフォーマンス向上のためのアドバイスが表示されます。

今回は、以下のような「おすすめの改善: 永続オブジェクトキャッシュを使用してください」という提案を受けた方向けです。

WordPress サイトヘルスのおすすめの改善「永続オブジェクトキャッシュを使用してください」
WordPress サイトヘルスのおすすめの改善「永続オブジェクトキャッシュを使用してください」

この提案は、具体的には、データベースへの頻繁なアクセスを軽減し、ページの読み込み速度を向上させるための「オブジェクトキャッシュ」の導入を推奨しています。
一般的なキャッシュサーバとしては、Redis や Memcached が挙げられます。

永続オブジェクトキャッシュについて詳細を確認したい方は、以下の WordPress ドキュメントをご参照ください。

Optimization – Advanced Administration Handbook | Developer.WordPress.org
Whether you run a high traffic WordPress installation or a small blog on a low cost shared host, you should optimize Wor...

WordPress のオブジェクトキャッシュの重要性

WordPress は、コア、プラグイン、テーマなどの多くのコンポーネントでデータベースを頻繁に利用します。
特に高トラフィックのサイトでは、同じクエリが繰り返し発行されてしまいます。
オブジェクトキャッシュは、これらのクエリの結果を一時的に保存することで、データベースへの再度のアクセスを減少させ、サイトのレスポンス時間を改善します。

なぜオブジェクトキャッシュは有効なのか?

  • 再利用:
    • 一度取得したデータを再利用することで、サーバのリソースを節約
    • これによって、ページの読み込み時間を短縮
  • 効率化:
    • サイトが大量の訪問者を迎えたとき、データベースへの同時接続数を減少
    • これによって、サイトがダウンするリスクを減少
  • カスタマイズの容易さ:
    • オブジェクトキャッシュのソリューションの中には、特定のクエリやデータをキャッシュから除外する機能を持つものもある
    • これによって、サイトのニーズに合わせてカスタマイズが可能

しかし、オブジェクトキャッシュはただ導入するだけで良いというわけではありません。
当然、適切な設定やメンテナンスが必要です。

ElastiCache for Redis と Redis Object Cache の選択

今回私は、AWS サービスの ElastiCache for Redis と WordPress プラグインの Redis Object Cache を組み合わせて永続オブジェクトキャッシュを実装する方法を選択しました。
これらの組み合わせには、高速なキャッシュ機能の提供だけでなく、他のキャッシング手法と比較しても独自のメリットがあります。

組み合わせる理由とその効果

  • スケーラビリティとシンプルさのバランス
    • ElastiCache for Redis は AWS のマネージドサービスとして高いスケーラビリティを持ちます
    • Redis Object Cache は WordPress にプラグインとして容易に導入できます
    • これによって、簡単な設定で高いパフォーマンスを得られる構成となります
  • コストとパフォーマンスの最適化
    • ElastiCache for Redis は、高い可用性やセキュリティ機能を提供します。
      これには通常費用が発生しますが、AWS には 12か月間の無料利用枠が存在しており、一部制限はあるものの、ElastiCache はその対象です。
    • Redis Object Cache は有料プランもあるものの、基本的な機能は無料で利用できます
    • この組み合わせによって、コストを抑えつつ必要なパフォーマンスを確保することが可能となります。
  • セキュリティと運用の効率化
    • AWS 及び ElastiCache for Redis のセキュリティ機能と、Redis Object Cache による WordPress とのシームレスな連携によって、安全かつ効率的なキャッシュ運用が実現されます。

このように、ElastiCache for Redis と Redis Object Cache の組み合わせは、WordPress に永続オブジェクトキャッシュを実装し、パフォーマンス改善を図る際に、費用対効果の高い手段だと考えられます。

AWS アーキテクチャ図でのイメージ確認

Before

kuds-wordpress_aws-architecture_1-0.drawio
kuds-wordpress_aws-architecture_1-0.drawio

After

kuds-wordpress_aws-architecture_1-1.drawio
kuds-wordpress_aws-architecture_1-1.drawio

AWS ElastiCache の概説と無料利用枠

AWS の ElastiCache は、Web アプリケーションのパフォーマンスを向上させるためのフルマネージド型のインメモリキャッシュサービスです。

このサービスは、DB からのデータの読み取りを劇的に高速化します。
これによって、アプリのレスポンス時間を短縮し、DB の負荷を削減します。

ElastiCache とは

ElastiCache では、オープンソースのインメモリキャッシュエンジンである RedisMemcached をサポートしています。
これらのエンジンでは、高速なパフォーマンスとスケーラビリティを提供しております。

例えば以下のように、リアルタイム性を求められるようなアプリケーションを含む、様々なユースケースで使用されています。

  • ゲーム
  • 分析
  • EC サイト等

Redis / Memcached とは

  • Redis:
    • キー/バリューストアの一種です。
    • データ構造のサポート、レプリケーション、トランザクションなどの高度な機能を備えています。
    • また、パブ/サブ機能やLuaスクリプト実行などの特性を持っています。
  • Memcached:
    • 高性能、分散型のキー/バリューストアです。
    • 動的なウェブアプリケーションにおけるデータベースの負荷軽減を目的としています。

ElastiCache では、これらのエンジンの運用を簡単に実現できます。
また、AWS サービスの特徴でもある以下の機能も含みます。

  • 必要に応じたリソースのスケーリング
  • マルチ AZ
  • 自動フェイルオーバー
  • バックアップ等

ElastiCache 無料利用枠について

AWS では、新規 AWS アカウントのユーザーを対象に、12ヶ月間の無料利用枠を提供しています。

AWS クラウド無料利用枠 | AWS
AWS 無料利用枠を使用すると、AWS のプラットフォーム、製品、およびサービスを無料でお試しいただけます。各製品ごとの無料利用枠の詳細やご利用開始方法についてご紹介します。

もちろん、ElastiCache サービスもこの無料利用枠の対象です。

無料利用枠

Amazon ElastiCache は AWS 無料利用枠に含まれているので、無料で開始できます。新規に AWS をご利用になるお客様には、ElastiCache cache.t2.micro または cache.t3.micro ノードの 750 時間分の使用が最大 12 か月間無料で提供されます。 

ElastiCache ノードそのものに対して発信または着信するトラフィックに対しては、ElastiCache データ転送料金が発生することはありません。AWS の新規のお客様は、AWS 無料利用枠の一環として、AWS のサービス全体で、毎月 15 GB のデータ送信を 1 年間無料でご利用いただけます。 

AWS 無料利用枠は、当社の世界中のリージョンを対象としたサービス加入に対して適用されます。AWS 無料利用枠に基づく無料の使用量は、毎月全リージョンでの合計量が計算され、自動的に請求額に適用されます。無料利用の繰り越しはできません。AWS 無料利用枠は現在、AWS GovCloud (米国) リージョン* または中国 (北京) リージョンではご利用いただけません。

https://aws.amazon.com/jp/elasticache/pricing/

なお、料金シナリオ等の詳細を確認したい方は、以下の公式ドキュメントをご参照ください。

料金 - Amazon ElastiCache | AWS
Redis と Memcached のマネージドキャッシングサービスである Amazon ElastiCache では、使った分だけお支払いいただけます。無料でお試しください.

この無料利用枠を利用することによって、ElastiCache の機能や性能をリスクなく体験することができます。
ただし、無料枠を超える利用や他のサービスとの連携に関しては追加料金が発生するため、注意しましょう。

ElastiCache for Redis クラスターのセットアップ手順

ElastiCache for Redis を使用するには、まずクラスターを作成・セットアップする必要があります。

Create Redis cluster

まずは、以下の手順で Redis クラスターを作成します。
[AWS マネジメントコンソール] > [ElastiCache] > [Redis clusters] > [Create Redis cluster]

次に、詳細設定を行いましょう。
以下は、無料利用枠の使用を前提とした設定例です。

Cluster settings

Choose a cluster creation method

  • Configure and create a new cluster
    ここでは、新しいクラスターのすべての設定オプションを設定します。

Cluster mode

  • Disabled
    ここでは、クラスターモードの有効・無効を指定します。
    なお、Redis クラスターは、1つのプライマリ・ノードと最大5つのリード・レプリカを持つ単一のシャード(ノード・グループ)を持つことが可能です。

※ クラスターモード無効を選択した場合、シャードの数を変更することはできません。この設定はすべてのRedisコマンドと機能をサポートしますが、最大キャッシュサイズとパフォーマンスが制限されます。

Cluster info

  • Name: your-wordpress-redis
    ここでは、クラスター名を指定します。
    名前は必須で、40文字以内でスペースを含んではいけません。
  • Description – optional: ElastiCache Redis for WordPress.

Location

  • Location: AWS Cloud
    ここでは、ElastiCache インスタンスを利用するため、 AWS クラウドを選択します。
  • Multi-AZ: Enable – off
    ここでは、Multi-AZ のオン・オフ指定します。
    Multi-AZ は、プライマリノードがフェイルオーバーした場合に、AZ をまたいだリードレプリカへの自動フェイルオーバーにより、高可用性を強化します。

※ Redis クラスターで ElastiCache Multi-AZ を無効にすると、フォールトトレランスが低下します。万が一アベイラビリティゾーンに障害が発生したり、ネットワーク接続が失われたりした場合、Redis クラスターは利用できなくなります。

Cluster settings

  • Engine version: 7.0
    ここでは、ノード上で実行されるRedisエンジンバージョンを指定します。
  • Port: 6379
    ここでは、ノードが接続を受け付けるポート番号を指定します。
  • Parameter groups: default.redis7
    ここでは、ノードとクラスターの実行時のプロパティを制御するパラメータグループを指定します。
  • Node type: cache.t3.micro (0.5 GiB memory, Up to 5 Gigabit network performance)
    ここでは、デプロイされるノードのタイプ選択します。
  • Number of replicas: 0
    ここでは、レプリカの数を 0~5 の間で入力します。
    レプリカ数が 0 の場合、プライマリ/レプリカの役割を持つ拡張クラスターは有効になりません。

※ Multi-AZ を有効にするには、1つ以上のレプリカを選択します。

Connectivity

  • Network type: IPv4
    ここでは、IPv4、デュアルスタック、IPv6から選択します
  • Subnet groups: Create a new subnet group
    ここでは、新規にサブネットグループを
  • Name: your-wordpress-redis-subnet-group
    名前は必須で、255文字まで使用でき、スペースを含んではいけません。
  • Description – optional: ElastiCache Redis for WordPress.
  • VPC ID: vpc-xxxxxxxxxxxx
    ここでは、クラスターを実行する VPC の ID を指定します
  • Selected subnets (1): ap-northeast-1a subnet-xxxxxxxxxxxx xxx.x.x.x/xx

※ Multi-AZ 高可用性モードでは、表で 2 つのアベイラビリティゾーンから少なくとも2つのサブネットの ID を選択します。

Availability Zone placements

  • Availability Zone placements: No preference
    ここでは、アベイラビリティゾーンの指定要否を選択します
    クラスター・ノードにアベイラビリティゾーンを指定する場合は、[Specify Availability Zones]を選択します。

Advanced settings

Security

  • Encryption at rest: Enable
    ここでは、ディスクに保存されたデータの暗号化を有効にします。
  • Encryption key: Default key
    ここでは、このクラスターの保存データの暗号化に使用されるキーを保護するために使用されるマスターキー指定します。
    デフォルトキーでは、AWS 所有のキーが暗号化に使用されます。
  • Encryption in transit: Enable
    ここでは、サービスとクライアント間を移動するデータの暗号化を有効にします。
  • Transit encryption mode: Required
    Required モードでは、クラスターは暗号化された TLS 接続のみをサポートします。
    なお、転送時の暗号化モードはクラスター作成後に変更できます。
  • Access control: Redis AUTH default user access
    ここでは、アクセスの認証と認可を設定する機能を提供します。
  • Redis AUTH token: wordpress-auth-token
    ここでは、クラスターで使用する AUTH トークンを指定します。
    ※少なくとも16文字、最大128文字。「 」(空白)、「”」(引用符)、「/」、「@」を除く、印字可能な ASCII 文字。

Selected security groups

  • sg-xxxxxxxx sg-for-wordpress-redis

セキュリティグループでは、アプリケーションからの通信を許可する必要があります。
特に、インバウンドルールにて以下の指定をすることを忘れないでください。

  • Source: sg-xxxxxxxx (アプリケーションサーバの SG)
  • Port: 6379

Backup

  • Enable automatic backups: On
    ここでは、ElastiCache がレプリカのセットのバックアップを毎日自動的に作成するかを指定できます。
  • Backup retention period: 1
    ここでは、自動バックアップが自動的に削除されるまでの保持日数を指定できます。
  • Backup window: No preference
    ここでは、自動バックアップが有効な場合に開始される毎日の時間範囲を指定できます。

Maintenance

  • Maintenance window: No preference
    ここでは、OS のパッチ適用、ドライバの更新、ソフトウェアやパッチのインストールなどのアップデートの時間範囲(UTC)を指定できます。
  • Auto upgrade minor versions: Enable
    ここでは、最新のマイナーバージョンへのクラスターアップグレードを自動的にスケジュールするかを指定できます。
    なお、クラスターのアップグレードは、メンテナンスウィンドウの間のみスケジュールされます。
  • Topic for Amazon SNS notification: arn:aws:sns:ap-northeast-1:123456789012:your-sns-topic
    ここでは、リストから SNS トピックを選択するか、既存のトピックの ARN を入力します。
    なお、トピックが選択されていない場合、通知は送信されません。

Logs

  • Slow logs: Enable
    ここでは、指定した実行時間を超えるクエリに対して Redis のスローログを提供。
  • Log format: JSON
  • Log destination type: CloudWatch Logs
  • Log destination: Create a new log group
    ここでは、既存のロググループを選択するか、新規作成できます。
  • Log group name: wordpress-redis-slow-logs
  • Engine logs: Enable
    ここでは、指定されたランタイムを超えるクエリに対してエンジンログを提供できます。
  • Log format: JSON
  • Log destination type: CloudWatch Logs
  • Log destination: Create a new log group
    ここでは、既存のロググループを選択するか、新規作成できます。
  • Log group name: wordpress-redis-engine-logs

これによって、ElastiCache for Redis の基本的なセットアップが完了します。

なお、SNS や CloudWatch Logs の利用は、場合によっては料金が発生します。
今回は割愛しますが、設定したい方は各サービスの料金シナリオや無料利用枠について、公式ドキュメントをご参照ください。

料金 - Amazon SNS | AWS
Amazon SNS 向けに細分化された料金表です。使用分の料金のみをお支払いください。最低料金設定はありません。AWS 簡易見積りツールを使って月額料金をお見積りください。
料金 - Amazon CloudWatch | AWS
Amazon CloudWatch は無料で始めることができ、また 、無料利用枠内でご利用いただけるアプリケーションも多数ご用意しています。このページでは Amazon CloudWatch に関する各種お見積もりや API 使用時のコスト...

EC2からの接続テスト (任意)

次に、AWS EC2 インスタンスから ElastiCache for Redis への接続が正しく行えるか検証しておきましょう。
接続テストを行うことで、設定ミス等を事前に特定・対処できます。

疎通設定確認と接続テスト

ネットワーク・セキュリティグループの確認

  • 最初に ElastiCache とEC2が同じVPC内にあることを確認します。
    ※VPC ピアリング等をしている人は無視してください
  • また、ルートテーブルも問題ないか確認しておきましょう。
  • サブネットが異なる場合は、NACL も確認しておくと良いでしょう。
    ※デフォルト設定であれば問題ありません。
  • 次に、ElastiCache のセキュリティグループの設定でインバウンドルールを確認します。
    • ソースで EC2 インスタンスが指定されているか
    • ポート(デフォルトは6379)が許可されているか

接続テストの実行

まず、EC2 インスタンスに SSH 接続します。

$ ssh -i {your-ssh-key} ec2-user@{your-ec2-ip}

次に、redis-cli ツールをインストールします。
ここでは、Amazon linux 2 で redis6 ごとインストールします。

$ sudo amazon-linux-extras install redis6

そして、redis-cli ツールを使用して ElastiCache のエンドポイントに接続します。

redis-cli -h {your-elasticache-domain} -p {your-port} --tls -a {your-wordpress-auth-token}
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

最後に、接続に成功した場合、Redisのプロンプトが表示されます。

{your-elasticache-domain}:{your-port}> set x Hello
OK
{your-elasticache-domain}:{your-port}> get x
"Hello"
{your-elasticache-domain}:{your-port}>

なんらかのエラーが発生している場合は、ドメインの指定やオプションに誤りがある可能性があります。
クラスターの設定によって、指定すべきドメインやオプションが異なります。
一度公式ドキュメントをご参照ください。

ステップ 4: クラスターのノードに接続する - Amazon ElastiCache フォー・レディス
Amazon EC2 インスタンスにログインし、キャッシュクラスター内のノードに接続します。

wp-config.php の設定例と注意点

WordPress の wp-config.php ファイルは、サイトの設定ファイルです。
Redis を利用する際、このファイルに適切な設定を追加する必要があります。
この章では、具体的な設定例と、注意点を解説します。

設定例

まず、以下のような設定を、/var/www/html/wp-config.php に追記します。

// Redisのクライアントライブラリを指定
define('WP_REDIS_CLIENT', 'predis');

// ElastiCacheのエンドポイントを設定
define('WP_REDIS_HOST', 'your-elasticache-domain');

// Redisのポート番号を指定
define('WP_REDIS_PORT', '6379');

// Redisの認証トークンを設定
define('WP_REDIS_PASSWORD', 'your-wordpress-auth-token');

// 通信のスキームを指定
define('WP_REDIS_SCHEME', 'tls');

注意点

なお、一般的な注意点は以下の通りです。

  • 配置の順序:
    • 設定は、以下の行よりも前に配置する必要があります。
      /* That’s all, stop editing! Happy publishing. */
  • 定数の再定義:
    • 他のプラグインやテーマと定数名が衝突しないよう注意が必要です。
  • 不正なパラメータ:
    • 正確なホスト名やポート番号を指定しているか改めて確認しておきましょう。
  • ファイルパーミッション:
    • wp-config.php は外部からのアクセスを防ぐよう、適切なファイルのパーミッションを設定しましょう。
  • バックアップ:
    • 設定変更前には必ずバックアップを取得し、問題が発生した場合に備えましょう。

これによって、WordPress が Redis を利用するための準備が整いました。
次に、プラグイン Redis Object Cache を導入しましょう。

WordPress プラグイン「Redis Object Cache」のインストールと有効化

このセクションでは、WordPress プラグイン Redis Object Cache のインストールから有効化までの手順を説明します。

「Redis Object Cache」のインストール

  1. WordPress のダッシュボードにログイン
  2. 左側のメニューから「プラグイン」を選択
  3. 「新規追加」をクリック
  4. 「Redis Object Cache」で検索
  5. 「Redis Object Cache」を「今すぐインストール」
  6. 「有効化」をクリック

「Redis Object Cache」の有効化

  1. 左側のメニューから「設定」を選択
  2. 「Redis」をクリック
  3. 「Overview」タブで、「Enable Object Cache」をクリック

これによって、「Redis Object Cache」が正常に有効化されました。
非常にシンプルな手順で、サイトのキャッシュ機能を向上させることができます。

さいごに

ポイントのおさらい

この記事では、以下の内容を確認しました。

  • WordPress のサイトヘルス「おすすめの改善: 永続オブジェクトキャッシュを使用してください」の対応方法
  • ElastiCache for Redis + Redis Object Cache の選択
  • ElastiCache for Redis クラスターの設定手順
  • 接続テスト手順(任意)
  • Redis 利用のための WordPress 設定手順
  • Redis Object Cache の有効化手順

最終的な AWS アーキテクチャ図

アーキテクチャとしては以下のようになりました。

kuds-wordpress_aws-architecture_1-1.drawio
kuds-wordpress_aws-architecture_1-1.drawio

ちなみに、アーキテクチャ図上の S3 はメディアファイルストレージとして利用しています。

EC2 で WordPress をホストしている場合、通常メディアファイルは EBS に保存されます。
しかし、この場合 EC2 が回復不可能な障害に陥った時、バックアップがなければメディアファイルが失われる可能性があります

対応策としては以下が挙げられます。

  • 超頻繁なバックアップ (AMI / Snapshot) の取得
  • EFS の利用
  • S3 にメディアファイルをオフロード

アーキテクチャ図の通り、私は S3 へメディアファイルをオフロードする対応をとっています。
以下の記事では、S3 へのオフロード手順を解説しています。
興味がありましたら是非ご参照ください。

次回「ページキャッシュの実装: WP Fastest Cache と Cloudflare」

次回は「WP Fastest Cache を用いたページキャッシュの実装」です。
Cloudflare との連携についても触れられればと思ってます。

→ こちらの記事を執筆しましたので、興味がございましたら是非ご参照ください。

コメント