ITエンジニアによるITエンジニアのためのブログ

WordPressを静的ウェブサイトに変換してAWSでホスティングする方法

本記事では、ローカル環境に構築したWordPressサイトを、静的ウェブサイトジェネレーターを使ってAWSにホスティングする方法を解説します。

この方法には以下のような様々なメリットがあります。

  • ブログ執筆の際はWordPressの便利な機能が使えるため、HTMLコードを意識することなく記事作成に集中できます。
  • ホスティングは静的ウェブサイトに変換し、CDN(CloudFront)も使うため、非常に高速な配信が可能です。
  • WordPress本体を外部公開しないため、動的サイト特有のセキュリティ対策(本体やプラグインの頻繁なアップデート、不正アクセス対策など)が不要になります。
  • 非常に安価(月額100円前後~)にサイトをホスティングできます。

なお、本記事はwordpress.comからサイトを移行する方法の2番目のステップとしても位置づけられますが、別のホスティングプロバイダーからの移行や、新規ブログを静的サイトとしてAWSにホスティングする場合でも参考になるよう、汎用的に解説します。

目次

  • WordPressでの事前準備
    • Google Analytics設定
    • 記事コメントを無効化
    • お問い合わせフォームの変更
  • AWS S3バケット作成
  • 静的サイトジェネレーター設定 (Simply Static)
    • ローカル環境での静的サイト確認
    • 相対URLで静的サイト生成
    • S3へのアップロード
  • CloudFrontディストリビューション作成
    • URLリライト用CloudFront関数の追加
  • ドメイン設定 (Route 53, ACM)
    • AWS Route 53でホストゾーン作成
    • AWS Certificate ManagerでTLS証明書作成
    • CloudFrontとドメインの関連付け・テスト
  • 本番公開と仕上げ
    • ネームサーバーをRoute 53に変更
    • XMLサイトマップ作成
    • robots.txt作成
    • 絶対URLで静的サイトを更新
    • ルートドメインとwwwのリダイレクト設定
  • まとめ

WordPressでの事前準備

静的サイトを生成する前に、ローカル環境のWordPressでいくつかの事前準備を行います。

Google Analytics設定

インターネット上にあるWordPressサイトであれば「Site Kit by Google」プラグインが便利ですが、ローカル環境では設定がうまくいかないことが多いため、「Simple Custom CSS and JS」プラグインでGAタグを手動で埋め込む方法がおすすめです。

プラグインをインストールし、左メニューの Custom CSS & JS を選択し、Add HTML Code ボタンをクリックします。(Add JS Code ボタンもありますが、<script> タグが編集できないため、Google Analyticsコードには不向きです)

Google Analyticsの管理ページで発行したGAタグ(測定ID G-XXXXX のものなど)のコードを貼り付け、Publish ボタンを押して保存します。

記事コメントを無効化

静的サイトではWordPressのコメント機能は動作しないため、無効化します。

新規記事のコメントを無効化

WordPressの左メニューから Settings -> Discussion を選択し、Allow people to submit comments on new posts のチェックを外します。

既存記事のコメントを無効化

Posts メニューで全ての記事にチェックを入れ、Bulk actionsから Edit を選択して Apply ボタンを押します。表示された設定で Comments セレクトボックスを Do not allow に変更し、Update ボタンをクリックします。

お問い合わせフォームの変更

WordPressのフォームプラグイン(Contact Form 7など)を使っている場合、静的サイトでは機能しません。別のソリューションに切り替える必要があります。

本記事ではGoogleフォームを使ってフォームを作成し、カスタムHTMLブロックにiframeで埋め込む方法を紹介します。

  1. Googleフォームにてフォームを作成します。
  2. Googleフォーム上部のドロップダウンメニューより、「HTMLを埋め込む」を選択し、表示されたiframeのHTMLコードをコピーします。
  3. WordPressのお問い合わせページの編集画面にて Custom HTML ブロックを追加し、コピーしたHTMLコードを貼り付けます。

AWS S3バケット作成

静的サイトのファイルを格納するためのS3バケットを以下の設定で作成します。

  • バケットタイプ:汎用
  • バケット名:サイトのドメインと同じ名前(例:ドメインがexample.comならバケット名もexample.com)。
  • オブジェクト所有者:ACL 無効
  • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべてブロック
  • バケットのバージョニング:無効にする
  • 暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
  • オブジェクトロック:無効にする

注) 以前はS3の「静的ウェブサイトホスティング機能」を有効にする方法が主流でしたが、現在はCloudFrontのオリジンアクセスコントロール(OAC)を使い、S3バケット自体は非公開にする方法がベストプラクティスです。

静的サイトジェネレーター設定 (Simply Static)

静的サイトジェネレーターには「Simply Static」プラグインを使います。無料版と有料版がありますが、本記事では無料版を使います。プラグインをインストールして有効化してください。

ローカル環境での静的サイト確認

WordPressメニューから Simply Static -> Settings -> General ページを開き、Replacing URLsOffline Usage を選択します。この設定はサイト上のURLをファイルシステムパス(file://...)に書き換えるため、本番デプロイには使えませんが、ローカルでの動作確認に最適です。

次に Simply Static -> Settings -> Deploy メニューを開き、Deployment SettingsLocal Directory を選択します(選択肢にAWS S3もありますが、プラグインの有料版が必要です)。このデプロイ方法は、ローカルファイルシステムに生成された静的サイトを保存します。

PATH で、静的サイトを保存するローカルのディレクトリを指定します。このディレクトリは、Webサーバー(www-data ユーザーなど)が書き込めるパーミッションが必要です。

本記事では、WordPressのルートディレクトリ(/var/www/html)に public_static というディレクトリを作成する例を示します。

cd /var/www/html
mkdir public_static
chown www-data:www-data
chmod 755 public_static

Simply Static -> Diagnostics を選択します。すべての設定にチェックマークが付いており、問題がないことを確認します。もしファイルパーミッションなどで問題がある場合はエラーが表示されますので、修正します。

Simply Static -> Generate ボタンを押すと、静的サイト生成が始まります。進行状況は Activity Log ページで確認できます。

生成が完了したら、ブラウザの「ファイルを開く」などで、生成先ディレクトリ(public_static)の index.html を開きます。file:// プロトコルでサイトをナビゲートできるはずです。主なページを確認して問題ないことを確認します。

相対URLで静的サイト生成

ローカルでの確認後、次はCloudFrontでのテスト用に相対URLで生成します。

Simply Static -> Settings -> General メニューで、Replacing URLsOffline Usage から Relative Path(相対URL) に変更します。

Relative Path に設定する目的は、後ほど作成するCloudFrontのデフォルトドメイン (distribution_id.cloudfront.net) でアクセスしてもサイトのナビゲーションテストを行えるようにするためです。

Generate ボタンをクリックし、静的サイトを再度生成します。

S3へのアップロード

静的サイトの生成が完了したら、格納ディレクトリ(public_static)に入っている全てのファイルとフォルダを、先ほど作成したS3バケットにアップロードします。

AWS CLIを使ったアップロード

ファイル数が多い場合、AWSマネジメントコンソールからの手動アップロードは大変です。AWS CLI (コマンドラインインターフェース) が使える環境であれば、sync コマンドを使うと差分だけを高速にアップロードできて非常に便利です。

# public_static ディレクトリの中身を、S3バケットのルートに同期(アップロード)する
aws s3 sync ~/wordpress/public_static/ s3://example.com/ --delete

--delete オプションは、ローカルにないファイルをS3からも削除します。必要に応じて調整してください)

CloudFrontディストリビューション作成

AWS CloudFrontを利用すると、S3バケットに非公開で格納した静的サイトを、独自のドメインとHTTPSを使って高速に配信できます。

CloudFrontディストリビューションを以下の設定で作成します。

  • Distribution name: ドメイン名など任意の名前
  • Distribution type: Single website or app
  • Origin type: Amazon S3
  • S3 Origin: 作成したS3バケットをBrowse S3で選択
  • Allow private S3 bucket access to CloudFront: オン。これにより、S3オブジェクトの読み取り権限をCloundFrontのディストリビューションに許可するS3バケットポリシーが自動で付与されると同時に、CloudFrontディストリビューションからS3バケットへのリクエストに署名が付与されるようになります(オリジンアクセスコントロール(OAC)と呼ばれる仕組みです)。
  • オリジン設定:use recommended settings
  • Cache settings: use recommended settings
  • Web Application Firewall: セキュリティ保護を有効にしないでください

ディストリビューションを作成するとデプロイが始まりますので、「一般」タブの「最終変更日時」が更新されるまで待ちます(数分~数十分かかることがあります)。

デプロイが完了したら、「ディストリビューションドメイン名」(your_subdomain.cloudfront.netのような形式)をコピーし、ブラウザでアクセスできるか確認します。

(注) この時点では https://your_subdomain.cloudfront.net/index.html のように、ファイル名を指定しないとアクセスできません。

URLリライト用CloudFront関数の追加

index.html を省略し、サイトルート(/)や記事サブディレクトリ(/your_post_slug/)でアクセスできるよう、URL書き換え関数を作成します。

CloudFrontの左メニューより 関数 を選択し、関数を作成 をクリックします。

  • 名前:任意の名前を入力(例:index-rewriteなど)
  • Runtime: cloundfront-js-2.0

以下の関数コードを記載します。

function handler(event) {
    var request = event.request;
    var uri = request.uri;

    // URIがスラッシュで終わっている場合 (例: / や /subdir/)
    // S3オリジンに送る前に末尾に index.html を追加して書き換える
    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    } 
    // URIがファイル拡張子を持たない場合 (例: /subdir)
    // S3オリジンに送る前に /index.html を追加して書き換える
    else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}

変更を保存 し、発行 タブから 関数を発行 します。

同じく 発行 タブの 関連付けられているディストリビューション セクションから 関連付けを追加 ボタンをクリックします。

  • ディストリビューション: 先ほど作成したCloudFrontディストリビューションを選択
  • イベントタイプ:Viewer request
  • キャッシュビヘイビア:Default(*)

関連付けがデプロイされたら、ブラウザでCloudFrontのディストリビューションドメイン名にアクセスし(例:https://your_subdomain.cloudfront.net/)、index.html なしでサイトが表示されたら成功です。

ドメイン設定 (Route 53, ACM)

AWS Route 53でホストゾーン作成

AWS Route 53で、使用する独自ドメインのホストゾーンを作成します。

  • ドメイン名: 自身のドメイン (例: example.com)
  • タイプ: パブリックホストゾーン

AWS Certificate ManagerでTLS証明書作成

CloudFrontで独自ドメインをHTTPS化するため、ACMで無料のTLS証明書を発行します。

Certificate Manager (ACM) のコンソールを開き、バージニア北部 (us-east-1) リージョンを選択します。(CloudFrontで使用する証明書は、必ずこのリージョンで取得する必要があります)

以下の設定で証明書をリクエストします。

  • 証明書タイプ:パブリック証明書をリクエスト
  • 完全修飾ドメイン名:サイトで使用するドメイン名 (例: example.com)
  • この証明書に別の名前を追加:www.example.com のように、www付きのドメインも追加しておくことを強く推奨します。
  • エクスポートを許可:エクスポートを無効にする
  • 検証方法:DNS検証
  • キーアルゴリズム:RSA 2048

証明書リクエストを作成したら、検証画面で Route 53でレコードを作成 ボタンを押します。これにより、ドメインの所有権を検証するためのCNAMEレコードがRoute 53のホストゾーンに自動で追加されます。

(もし、まだネームサーバーをRoute 53に移行しておらず、別のDNSプロバイダーでドメインを管理している場合は、表示されるCNAME名とCNAME値をコピーし、現在のDNSプロバイダー側でCNAMEレコードを作成してください。但しこの検証用CNAMEレコードはTLS証明書発行時のみならず更新時にも必要ですので、いずれにしてもRoute 53には追加する必要があります。)

しばらく待ち、証明書のステータスが「発行済み」になったことを確認します。

CloudFrontとドメインの関連付け・テスト

CloudFrontディストリビューションの管理画面に戻り、一般 タブの 設定 から Add domain をクリックします。

Domains to serveにドメイン名 (例: example.com) を入力します。(wwwあり・なし両方設定する場合は、メインで使う方のみをここで入力します。もう一方はリダイレクト用に後で設定します)

先ほど発行された証明書をAvailable certificatesの項目で選択し、関連付けして保存します。

ディストリビューションの代替ドメイン名の項目にドメイン名が表示され、カスタムSSL証明書にもチェックマークが付きます。

同じセクションでRoute domains to CloudFrontをクリックしてAレコードとAAAAレコードをRoute 53に追加します。

【オプション】ネームサーバー変更前の動作確認

ネームサーバーを切り替える前に、独自ドメインでAWS上のサイトにアクセスできるかテストするには、PCの hosts ファイルを編集します。

CloudFrontディストリビューションのIPアドレスを確認します。(ping your_distribution_id.cloudfront.net 等で調べられますが、IPは変動する可能性があります)

PCの hosts ファイル(Mac/Linux: /etc/hosts, Windows: C:\Windows\System32\drivers\etc\hosts)に、以下の行を追加します。

# /etc/hosts
(調べたIPアドレス) your_domain.com

Chromeのデベロッパーツール(ネットワークタブ)などでレスポンスヘッダーを確認し、Server: AmazonS3, Via: ...CloudFront... となっていれば、AWSに接続されています。

テストが終わったら、hosts ファイルに追加した行は必ず削除(またはコメントアウト)してください。

本番公開と仕上げ

ネームサーバーをRoute 53に変更

独自ドメインを取得したレジストラ(お名前.com、ムームードメインなど)の管理画面で、ネームサーバーの設定を、AWS Route 53のホストゾーンに表示されている4つのNSレコードの値に変更します。

注) ネームサーバーの変更がインターネット全体に反映されるまでには、数時間~最大72時間程度かかる場合があります。 変更が反映されるまでの間、万が一トラブルがあってもすぐに切り戻せるよう、Route 53のホストゾーン詳細でNSレコードの TTL を一時的に短い値(例:300秒 = 5分)に変更しておくことも推奨されます。

XMLサイトマップ作成

検索エンジンにサイト構造を伝えるため、XMLサイトマップを作成します。「XML Sitemap Generator for Google」プラグインがおすすめです。

注)もしJetpackプラグインなどでサイトマップを生成していた場合、競合する可能性があるため、古いプラグインのサイトマップ機能は無効化します。

有効化すると http://(ローカルのWordPress URL)/sitemap.xml にサイトマップが作成されます。

Simply Static -> Settings -> General メニューを開き、Additional URLs に、サイトマップのURL(例:sitemap.xml, post-sitemap.xml など、プラグインが生成する全ての子サイトマップのパス)を登録します。

注)Simply StaticのRewrite URLsでRelative Pathを設定していると、サイトマップにも相対URLで記載されてしまいますが、サイトマップは絶対URLで記載する必要があります。これは、後ほど絶対URLを設定する際に解消します。

robots.txt作成

WordPressのルートディレクトリ(index.php などがある場所)に robots.txt という名前のファイルを作成します。Simply Staticは静的サイト生成時にこのファイルを含めてくれます。

User-agent: *
Allow: /

Sitemap: https://your_domain.com/sitemap.xml

絶対URLで静的サイトを更新

本番サイトの動作確認が完了したら、SEO(検索エンジン最適化)のため、全てのリンクを相対URLから絶対URLに更新します。

Simply Static -> Settings -> General メニューより、REPLACING URLSAbsolute URLs に変更します。

SCHEMEhttps:// に、HOST を自身のドメイン(例:example.com)に変更して設定を保存します。

Generate ボタンで静的サイトを再生成します。この際、XMLサイトマップなども絶対URLで更新されます。

生成が完了したら、再度S3バケットへアップロード(aws s3 sync など)します。

S3のファイルが更新されても、CloudFrontには古いキャッシュが残っている場合があります。CloudFrontの管理画面で キャッシュ削除 (Invalidation) を作成し、/* (すべてのファイル)のキャッシュをクリアしてください。

ルートドメインとwwwのリダイレクト設定

サイトをルートドメイン (example.com) でホスティングしている場合、www.example.com へのアクセスをリダイレクトさせる(またはその逆)設定を行います。 ここでは、リダイレクト専用のS3バケットと、もう一つのCloudFrontディストリビューション を使う方法を紹介します。

リダイレクト元S3バケット作成

リダイレクト元S3バケットを、以下の設定で作成します。

  • バケットタイプ:汎用
  • バケット名:リダイレクト元のドメイン名(例: www.example.com)。
  • オブジェクト所有者:ACL 無効
  • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべてブロックをオフ(パブリックアクセスを有効化)
  • バケットのバージョニング:無効にする
  • 暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
  • オブジェクトロック:無効にする

S3バケットを作成後、アクセス許可タブを選択して以下のバケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*"
        }
    ]
}

Resource のバケット名はご自身のものに置き換えてください)

プロパティタブで、静的ウェブサイトホスティング設定を以下の通りにします。

  • 静的ウェブサイトホスティング:有効にする
  • ホスティングタイプ:オブジェクトのリクエストをリダイレクトする
  • ホスト名:リダイレクト先のホスト名(例:example.com)
  • プロトコル:https

保存すると表示される バケットウェブサイトエンドポイント (例: www.example.com.s3-website-....amazonaws.com) をコピーしておきます。

リダイレクト用CloudFrontディストリビューション作成

次にCloudFrontディストリビューションを以下の設定で作成します。

  • Distribution name: リダイレクト元ドメイン名など任意の名前
  • Distribution type: Single website or app
  • Origin type: Amazon S3
  • S3 Origin: S3バケット一覧には表示されません。先ほどコピーした S3のバケットウェブサイトエンドポイント を貼り付けます。(http:// は削除してください)
  • オリジン設定:use recommended settings
  • Cache settings: use recommended settings
  • Web Application Firewall: セキュリティ保護を有効にしないでください

ディストリビューションが作成されたら、一般タブより代替ドメイン名でAdd domainボタンを押し、リダイレクト元のドメイン名(例: www.example.com)を入力し、TLS証明書を選択します。TLS証明書は作成の際にルートドメインとwwwドメインを両方とも登録したため、このディストリビューションでも同じ証明書を使います。

代替ドメイン名にドメイン名を追加したら、Route domains to CloudFrontボタンでRoute 53にAレコードとAAAAレコードを追加します。

これで、ブラウザで www.example.com にアクセスすると、https://example.com へリダイレクトされるようになります。

まとめ

本記事では、ローカル環境のWordPressサイトを静的ウェブサイトに変換し、AWS(S3, CloudFront, Route 53)でホスティングする方法を紹介しました。

設定には若干の手間がかかりますが、一度設定を終えれば、WordPressのメリット(簡単な記事作成)と静的ウェブサイトのメリット(高速、セキュリティ対策不要、安価)両方を享受することができます。ぜひ試してみてはいかがでしょうか。