【WordPress】W3 Total Cache を使用して静的ファイルやメディアファイルを S3 へオフロード

はじめに

WordPress サーバーをスケールアウトする際にまず問題となるのが、メディアファイルによって Web サーバーがステートフルになってしまうことである。
AWS で構築するのであれば S3 にオフロードするのが筋なのはわかるが、いかんせん WordPress コアでは S3 へのオフロードをサポートしていないので一手間かける必要がある。

  1. s3fs 等を使って S3 をマシンへマウントする
  2. cron で定期的に s3 sync など
  3. S3 オフロード用のプラグインを使用する
  4. NFS、EFS

1.は不安定な印象が強いので避けたい。2.もなんか微妙だなぁ。 となると、3.くらいしか無い。

え、NF……なに、聞こえねーな。

S3 オフロード用プラグイン

そのうち、W3 Total Cache (W3TC) ならば、メディアファイルに加えてテーマファイルや CSS ファイルもオフロードできるし、AWS の Whitepaper で紹介されているので 間違いないだろうということで試してみた。

WP Offload Media Lite 導入に関しては、弊サイトにもすでに記事があった……!!

設定方法

W3TC は S3 オフロード用プラグインというわけではなく、その他にも様々な機能が搭載されているので設定項目の量が膨大だが、とりあえず S3 オフロード設定のみを施す想定。

S3 バケット準備

普通に作成。

一般公開用バケットポリシーを設定。

{
    "Version": "2008-10-17",
    "Id": "AccessRestriction",
    "Statement": [
        {
            "Sid": "PublicAccess",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Principal": {
                "AWS": "*"
            },
            "Resource": "arn:aws:s3:::<your_bucket_name>/*"
        }
    ]
}

S3 アップロード用 IAM ユーザー準備

プログラムによるアクセスだけで良い。

先に作成したバケットに対するアクセス権限のみ許可。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<your_bucket_name>",
                "arn:aws:s3:::<your_bucket_name>/*"
            ]
        }
    ]
}

更新ボタンを押してから作成したポリシーを検索して選択。

CSV を忘れずに保存。

W3 Total Cache プラグインのインストール

普通にインストールして有効化。

W3 Total Cache 設定 (General Settings)

S3 オフロード以外の機能が不要な場合はすべて無効化。

CDN を有効化して、S3 を選択。

W3 Total Cache 設定 (CDN)

先程作成した S3 アップロード用 IAM ユーザーのアクセスキーとシークレット、S3 バケット名、リージョンを設定。

General 部分はとりあえずデフォルトで。

無効になっている意味がよくわからないので Use CDN links for the Media Library on admin pages を有効化。

Export changed files automatically も有効化したほうが良くないか?

設定画面上部にこんなメッセージが表示されているはずなので、これらのボタンを押下して、既存の静的ファイルをアップロード。

done になれば大成功。

記事に貼り付けた画像などが S3 から配信されることを確認。

おわりに

  • このプラグインは独自ファイル (/wp-content/w3tc-config/master.php など) を作成したり、.htaccess の変更を行っているみたいなので要注意