RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【CloudFront】WordPressサイトを高速化してみた話

こんにちは!ラクスでインフラ開発部というところに所属している akiponx です。
今回はCDNの一つ。AWSが提供しているCloudFrontでWordPressを高速化してみた話を書いてみます。

使ったサービスは

  • ACM ... Amazonの無料SSL証明書
  • Route53 ... DNS
  • EC2 ... オリジンサーバ
  • ELB ... ALBを利用
  • S3 ... ログ置き場
  • CloudFront ... CDN
  • CloudFront Functions ... IP制限,Basic認証
  • AWS WAF ... アクセス制限

あたりを使って実装していきます。

目次

1. CloudFrontとは?

CDNの一つがCloudFrontです。
CDNとは、Contents Delivery Network の略で、コンテンツを配信するネットワークという意味合いです。
CloudFrontはAWSが提供するCDNで世界中にエッジサーバが存在しているため、どこからアクセスしても爆速でレスポンスが返ってきます。

2. CloudFront用語

CloudFrontを語るには、以下の用語はおさえておきたいところです。
CDNの基本用語とも被るところはありますので「知ってる!」という方はすっ飛ばしてください。

では順番に説明していきます。

オリジンサーバ

CloudFrontが配信するコンテンツが置いているサーバのことです。(AWSでいうとEC2とかS3とか)
CloudFrontのエッジサーバにキャッシュがなかった場合、オリジンサーバまでリクエストが届きます。

エッジサーバ

世界中に存在しているCloudFrontのキャッシュサーバたちのことです。
ブラウザでアクセスすると、まずエッジサーバにリクエストが行くようにDNSの設定を行います。  

エッジサーバがキャッシュを持っていなかったときは、オリジンサーバにリクエストが行きます。
逆にエッジサーバがキャッシュを持っていれば、そのままエッジサーバがキャッシュされたページをブラウザに返します。

ディストリビューション

CloudFrontが配信するサイト…というか設定…のことを言います。
複数のサイトを1つのディストリビューションで設定することも可能ですが、サイトごとにキャッシュの設定を変更したい場合などもあるので個人的には1ディストリビューションにつき、1サイトとしたほうが柔軟性は高いと思います。
本記事では1ディストリビューション、1サイト構成で説明していきます。

オリジンドメイン

ブラウザからアクセスさせたいドメインのことです。
例えば、https://rakus.co.jp/ へのアクセスをエッジサーバ経由にしたい場合、CloudFrontのオリジンドメイン部分に rakus.co.jp を設定します。

3. CloudFrontの料金

CloudFront 無料枠

  • 1TBのデータ転送(アウト)
  • 1,000万件のHTTP,HTTPSのリクエス
  • 200万件のCloudFront Functionsの呼び出し

CloudFront オンデマンド料金

  • エッジサーバからインターネットへのデータ転送(アウト)の料金 (GB 単位)
    • 10TBまで0.114(USD)
    • 次の40TBまで0.098(USD)
    • 次の100TBまで0.086(USD)
  • オリジンサーバからエッジサーバへのデータ転送(アウト)の料金 (GB 単位)
    • 0.060USD
  • HTTPメソッドリクエスト料金(1万件当たり)
    • HTTP: 0.0090(USD)
    • HTTPS: 0.0120(USD)
  • CloudFront Functions (100万件当たり)
    • 0.10(USD)

詳しくは公式をご覧ください。

4. CloudFrontを使う準備

  1. ドメインを用意 (DNS登録含む)
  2. ACM (AWSが提供している無料のSSL証明書)
  3. ELB or S3 (コンテンツがおかれているオリジンサーバ)

ACM米国東部(バージニア北部)(us-east-1)リージョン で発行しなければCloudFrontでは使えません。
※オリジンサーバの構築場所に東京リージョンを使う場合、東京リージョンでACMの発行も必要です。
 (2か所で設定するのめんどくさいですが。)

5. CloudFrontの設定方法

さて、それではそろそろ実際にCloudFrontの始め方、設定方法を見ていきましょう。

まずは、CloudFrontディストリビューション作成ボタンをクリックします。
続いて各項目を入れていきます。

オリジン
CloudFrontにオリジンサーバを教えてあげる項目です。

  • オリジンドメイン
  • マッチビューアー
    • アクセスできるプロトコルを選択
    • 両方アクセスさせたいときはマッチビューワー
  • オリジンパス
    • 「/」を入れればOK
  • 名前
    • 基本的には何でもいいですが、サイト名とかわかりやすいのにするといいと思います

デフォルトのキャッシュビヘイビア
CloudFrontのキャッシュを持たせる設定を行う項目です。
初期設定ではCloudFront経由でアクセスした全リクエストに対してキャッシュの設定されてしまいますが、後でURI毎にキャッシュの設定が可能です。

  • オブジェクトを自動的に圧縮
    • Yesにしておくとよい。転送量が減って気持ち節約になります
  • ビューワープロトコルポリシー
    • Redirect HTTP to HTTPS にしておくのが無難ですかね
  • 許可されたHTTPメソッド
    • サイトに合わせて設定してください
      • 静的サイト…GET,HEAD
      • 動的サイト…GET,HEAD,OPTIONS,PUT,POST,PATCH,DELETE
  • キャッシュキーとオリジンリクエス
    • 基本的に触らないくていい

設定
エッジサーバについての設定を行う項目です。

  • 料金クラス
    • すべてのエッジロケーションを使用する
  • AWS WAF ウェブ ACL
    • アクセス制限やWAFをいれたい場合はここで設定を追加
      • もちろんAWS側でルールを作る必要あり
  • 代替ドメイン
    • アクセスさせたいドメイン名を記載(複数記載OK)
    • CloudFrontを使う準備に記載したドメインを入力してもらえればOK
      • 例) www.rakus.co.jp, rakus.co.jp など
  • カスタムSSL証明書
    • ACMで取得した証明書をプルダウンから選択
  • 標準ログ記録
    • 必要な場合はオンにして、ログを保存するS3バケットを設定
  • IPv6
    • 対応していなければオフに

以上でCloudFrontの初期設定は完了です。
最期に「ディストリビューションの作成」をクリックしましょう。

6. CloudFrontでWordPressを配信する

さて、ディストリビューションの作成が完了したので続いてはWordPress特有の設定を入れていきましょう。

  • オリジンサーバにWordPressをインストール
  • ELBの設定

今回の投稿では上記については割愛させてもらいます。<m(__)m>
WordPress インストール」というような記事でググって入れてください<m(__)m>
最低限、CloudFrontでWordPressを配信するだけなのであればここまでの設定で配信可能です。(多分。)
が、このままではWordPressの管理画面にアクセスできず、

などなどが管理画面上から行えないため、辛いです。
そのため、WordPress管理画面へのアクセスができるようにキャッシュをコントロールしなければいけません。

その設定を入れていきます。
作成したディストリビューションを編集するために設定画面に遷移します。

ビヘイビア > ビヘイビアを作成 をクリック

  • パスパターン
    • パスパターンを指定して、指定したパスにアクセスが来たときのキャッシュの挙動を設定
    • キャッシュしてはいけないパスパターン
      • /wp-admin/* (WordPressをインストールしたパスに合わせてください。)
      • *.php
      • *preview*
  • オリジンとオリジングループ
  • ビューワー
    • デフォルトのキャッシュビヘイビアで設定した物と同じ設定を入れる
  • キャッシュキーとオリジンリクエス
    • Legacy chache settings
      • ヘッダー:すべて (キャッシュしないように設定)

上記の設定でキャッシュしてはいけないパスパターンを作成してください。

  - キャッシュしてはいけないパスパターン
    - /wp-admin/* (WordPressをインストールしたパスに合わせてください。)
    - *.php
    - \*preview\*

デフォルトのビヘイビアの編集

デフォルトのビヘイビアを編集する前にキャッシュポリシー、オリジンリクエストポリシーを作成します。
デフォルトのビヘイビアに作成したキャッシュポリシー、オリジンリクエストポリシーをアタッチするイメージです。

■ キャッシュポリシー
まずはキャッシュポリシーを作成します。

CloudFrontトップ画面 > ポリシー > キャッシュ > キャッシュポリシーを作成

  • 名前
    • わかりやすい名前なら何でも。
    • 別のディストリビューションにもアタッチできるので汎用的なキャッシュポリシー名にするのも良き
  • 説明
    • 適当に説明文を入れる
  • キャッシュキーの設定
    • ヘッダー
      • Host, CloudFront-Forwarded-Proto を入れてください
        • Host:ALBが振り分けられなくなります
        • CloudFront-Forwarded-Proto:EC2が80番しか開けていない場合これがないと表示崩れます

設定できたら作成をクリックして、キャッシュポリシーを作成します。

■ オリジンリクエストポリシー
続いて、オリジンリクエストポリシーの作成をやっていきます。

CloudFrontトップ画面 > ポリシー > オリジンリクエスト > オリジンリクエストポリシーを作成

  • 名前
    • キャッシュポリシーと一緒
  • 説明
    • キャッシュポリシーと一緒
  • オリジンリクエストの設定

設定できたら作成をクリックして、オリジンリクエストポリシーを作成します。
ここまでできたら、デフォルトのビヘイビアを編集していきます。

■ デフォルトのビヘイビア
さて、キャッシュポリシーとオリジンリクエストポリシーが出来たので、デフォルトのビヘイビアの編集をしていきます。

CloudFrontトップ画面 > ディストリビューション > 作成したディストリビューション > ビヘイビア > デフォルト > 編集

  • キャッシュキーとオリジンリクエス
    • キャッシュポリシー
      • さっき作ったキャッシュポリシーを選択
    • オリジンリクエストポリシー
      • さっき作ったオリジンリクエストポリシーを選択

編集箇所はここだけです。
変更を保存しましょう。


さて設定もできたので、CloudFront経由でアクセスしてみましょう。

できた!!

7. CloudFrontでWordPressを配信するときの注意点

CloudFrontでWordPressを配信することができるようになりました。
私が初めてこの作業をやったときにハマったポイントを、いくつか記載しておきます。

  • LB配下にWordPressをインストールしたときはwp-config.phpとある記述が必要
  • 管理画面にアクセスできなかった…
    • キャッシュの設定はご注意を
  • 記事を更新するたびにCloudFrontのキャッシュをクリアしないといけない
    • Wodpressにプラグインがあるのでそいつを使うと便利
      • テーマはなどの更新は多分検知されない…

というところでしょうか。

おまけ

アクセス制限

CloudFrontでアクセス制限を掛けたいときってありますよね?(例えば検証機とか。)
接続元がCloudFrontのIPアドレスになっていた、ELBのIPになっていたりとサーバ側で制限をかけるのが結構めんどくさいです。
そんな時に役立つのが AWS WAF, CloudFront Functions です!

IP制限したいな~と思ったら下記を試してみてください<m(__)m>

また、CloudFront以外からのアクセスを遮断したい!みたいなこともあるかと思います。
悪い人がhostsファイルなどでサーバに直接アクセスできるようにしてくるかもしれません。
そんな時は一つの方法として、CloudFrontが付与したカスタムヘッダーをLBが判定する方法が手っ取り早くて楽だと思います。
しかし、最近だともう少し楽にできる方法もあるみたいです。
お時間あれば調べてみてください。

8. まとめ

長い記事を呼んでいただき、ありがとうございました。
CloudFrontを使うと運用がめんどくさくなることもありますが、サイト自体が軽量化でき、SEO対策にもなります。
以前、WordPressで作った弊社オンデマンドサイトはアクセス集中が起きると必ず落ちていましたが、CloudFront経由で配信するようにしてからは(多分)1度も落ちていません。

  • アクセス集中で困っている!
  • すぐ高負荷になって困っている!

という方は、一度CloudFrontや他のCDNの構成を検討してみてもいいかもしれないです。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.