LightSailで月3.5$のWordPressを構築。独自ドメインとSSL対応版。

2021年6月22日

こんにちわ@・ェ・)めー。

AWSのお勉強のためWordPressでこのブログを構築しましたので、作り方の手順を残しておこうと思います。ちょっと長いですが、1つの記事で必要なことは網羅できることを目指しています。

目的

AWS上にWordPressを使ったブログを構築します。独自ドメインとSSL対応を行い、構築作業はAWSで完結することとできるだけ低コストで運用することが目標です。WordPressでブログを始めてみたいけど毎月のコストをできるだけ抑えたい人を対象としています。また、WordPressの構築を通じてAWSのサーバー構築入門としても良い教材になるかと思います。

前提

でAWSのアカウントを取得していること、AWSの基本的な使い方や最低限のセキュリティに関する設定を行っていることを前提としています。

執筆時点で東京リージョンに対応していないサービスがあるため、LightSailは東京リージョン、それ以外のサービスは米国東部 (バージニア北部)のus-east-1で構築を行います。(執筆時点でCloudFrontでACM証明書を利用する場合、バージニア北部リージョンで証明書をリクエストする必要があるのがその理由です)

なお、AWSのマネジメントコンソールはデザインや構成が変わることがあります。ここに記載している文言やスクリーンショットが古い場合は適宜最新の画面に従ってください。

構築の手順は正確に記述することを努めていますが、記載の誤りやWordPress・AWSの仕様変更などにより変更が生じることがあります。ご了承くださいませ。

構築のフロー

以下のフローで構築していきます。WordPressのサーバーだけ立ててメールを使わない場合は4をスキップしても大丈夫です。

  1. Route53でドメインの取得
  2. LightSailでサーバー構築
  3. WordPressのSSL化
  4. 独自ドメインのメールをGmailで扱う

各AWSサービスのセットアップ

Route53で独自ドメインの取得

AWSでドメインを取得、管理するにはRoute53を利用します。ドメインの取得費用はお名前.comなどに対して少し高いですが、ここではブログに関する設定をAWSで一元管理できるのでRoute53でドメインを取得する方針で解説します。また、後述するメールのドメイン検証などRoute53と連携して簡単にできることも利点なのでRoute53を利用することにしました。当サイト(wolfinsheep.net)のような.netドメインであれば年間11ドルで取得できます。

代表的なドメイン販売業者と価格をリストアップします。

ドメイン取得サービス名.com.net.info
AWS (Route53)12ドル11ドル12ドル
Google Domains1400円1400円1400円
お名前.com1280円1480円1480円
ConoHa1280円1280円1380円
ドメインのおおまかな値段

※2021年5月時点の1年更新料金です。お名前.comは更新に比べて取得が安かったり、更新の複数年割引がありますので、各社最新の料金表をご確認下さい。

まずはAWSのRoute53で独自ドメインを取得します。取得したいドメインを入力して登録者・支払いの必要事項を入力していくだけなので特に難しいことはありません。なお、ドメインの取得・更新にAWSのクレジット(プロモーションコード)は使うことはできないので、初期費用・ランニングコストとしてドメイン代だけは必ずかかります。

ドメインを取得する

Route53のマネジメントコンソールを開きます。

希望するドメインを入力して取得可能であるかチェックします。希望するドメインが取得可能であれば登録者の連絡先などの必要事項を入力して進めていきます。以下の設定は必ず有効にしておきましょう。

項目設定値説明
プライバシー保護有効whoisで一部連絡先情報が非表示になります。
登録者の情報を意図せず公開してしまうことを防ぎます。
ドメインの自動更新有効ドメインの更新忘れを防ぎます。

登録を完了した後にメールで送られてきたURLにアクセスするとドメインの取得、認証完了です。

まとめ:Route53で独自ドメインの取得

Route53で年間1000円台からドメインを取得できます。メール認証を忘れずに。

LightSailでWordPressを構築

AWSにはLightSailというサービスがあり、WordPressがセットアップされたサーバーを月額3.5ドルから利用できます。このサーバーはブログを始めるには十分なスペックであり、大手レンタルサーバーよりも月額料金を抑えることが出来ます。初期構築のコストは安く済ませておいてアクセス数増加に伴いサーバーの処理能力が必要になったらその時にスケールアップ(サーバー処理能力の増強)することができます。

サーバーの作成

LightSailのマネジメントコンソールを開きます。

「インスタンスの作成」から「Linux/Unix」の「WordPress」を選択します。インスタンスプランは月額3.5ドルを選択し、「インスタンスの作成」でサーバーを作成します。

次に独自ドメインでWordPressにアクセスできるように設定を行っていきます。

まずはLightSailのネットワーク構成を設定します。

ネットワーキングから「静的IPの作成」を選択し、WordPressのインスタンスにアタッチします。これでグローバルIPアドレスでWordPressのサーバーへアクセスすることができます。

ネットワーキングから「DNSゾーンの作成」を選択し、独自ドメイン用のゾーンを作成します。

独自ドメインのネームサーバーをLightSailのネームサーバーに変更します。

Route53の登録済みドメインからネームサーバーを編集し、LightSailのネームサーバー欄に記載されている内容で上書きします。

WordPressの管理画面にアクセス

WordPressの管理画面にログインするためのユーザー名、パスワードはサーバー内のファイルにあります。

LightSailのコンソールを開き、インスタンスの接続から「SSHを使用して接続」を選択します。

以下のコマンドでホームディレクトリのbitnami_credencialsファイルに記載されているユーザーとパスワードを参照します。

cat bitnami_credencials

ブラウザで下記のURLにアクセスしてWordPressのログイン画面が表示できることを確認します。

http://[LightSailにアタッチした静的IPアドレス]/wp-admin/

先ほどのユーザー名とパスワードでログインします。

まとめ:LightSailでWordPressを構築

LightSailでWordPressのサーバーを構築することができます。最初は月3.5ドルのサーバーで十分です。

ACMとCloudFrontでWordPressをSSL化

ACMとCloudFrontでSSL証明書を管理する

WebサイトやブログをSSL化するにはSSL証明書が必要で一般的には有料の年間契約になりますが、Amazon Certificate Manager(ACM)を使用すると無料でSSL証明書の発行が可能になります。ACMで発行したSSL証明書をCloudFrontへ配置することでブログをSSL化してhttpsでアクセスできるようになります。

また、CloudFrontを使用することでwp-content配下のファイルはWordPressが稼働しているサーバーの代わりにCloudFrontから配信するようになります。そのためWordPressを稼働しているサーバーの負荷も下げることができます。

以前はこの設定を手作業で行う必要がありましたが、AWS公式の「AWS for WordPress」プラグインで自動化が可能になりました。内部的にはCloudFormationからACMとCloudFrontが使われていますが、これを意識しなくていいようになっています。AWS for WordPressプラグインを使ってSSL化を行う手順を説明します。

また、この手順はAWSの公式サイトにドキュメントがありますので、こちらのドキュメントも合わせて確認しましょう。

AWS for WordPressのドキュメント

Getting started with the AWS for WordPress plugin

※執筆時点では英語ドキュメントのみ

LightSailにオプションでCDN機能がありますが、2.5ドルの料金(50GBまで)がかかるためAWS for WordPressでCloudFrontを利用します。この方法ではほぼ無料枠内で収まります。

番外編:Let’s EncryptでSSL化する

ACMとCloudFrontを使わずにSSL化することもできます。LightSailでWordPressのサーバーを作成するとその中にBitnamiのHTTPS設定ツールが含まれています。手軽にSSL化を行いたければ下記のコマンドを叩いて案内に従って設定内容を入力していきます。

sudo /opt/bitnami/bncert-tool

AWS for WordPressのインストール

ここからはACMとCloudFrontを使ってSSL化を行う手順になります。まずはプラグインページから「AWS for WordPress」と検索してプラグインをインストールします。

AWS for WordPressを実行するにはIAMユーザーが必要になります。設定画面にはIAMユーザーのアクセスキー、アクセスシークレットを入力します。

補足として、WordPressで使用するIAMユーザーは専用のものを1つ登録すると良いかと思います。「AWSForWordPressPluginPolicy」というポリシーが存在するので利用するといいでしょう。

リージョンはデフォルトのままバージニア北部リージョンとし「変更を保存」を選択します。

一般公開するURLとオリジンサーバーのURLを入力する画面になります。ここではexample.comというドメインを持っていて、ブログを「https://www.example.com/」というURLで公開する設定を例に説明します。

項目名設定値説明
Origin Domain Nameexample.com取得したドメイン名を入力します。
CloudFrontがWordPressのコンテンツを参照するドメイン名となります。
CloudFront Alternate Domain Nameswww.example.com一般公開するドメイン名を入力します。

Origin Domain NameとCloudFront Alternate Domain Nameを入力して「Initial Setup」を選択します。

ドメイン名の認証のためのDNSレコードが表示されます。

表示されたDNSレコードをLightSailのネットワークから追加します。

「Check status of SSL/TLS certificate」を選択します。

Activate Site AccelerationのチェックをONにして「Save Changes」を選択すると設定完了です。

AWS for WordPressによるドメイン名の検証、CloudFrontの構築には時間がかかります。内部的にはCloudFormationを使って一連のサービスを構築しています。進行状況の確認やエラーが発生した場合はAWSマネジメントコンソールからCloudFormationのスタックを確認して、もし止まってしまったりエラーになってしまった場合は適宜対策した後リトライを行いましょう。

完了したらWordPressの設定を変更します。

wp-config.phpにCloudFormation用の記述を追加

LightSailのコンソールを開き、インスタンスの接続から「SSHを使用して接続」を選択します。

vi等のエディタでwp-config.phpを編集します。

vi apps/wordpress/htdocs/wp-config.php

WP_SITEURLとWP_HOMEの値をhttpからhttpsに、$_SERVER['HTTP_HOST’]の値を実際のURLに変更します。

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

define('WP_SITEURL', 'https://www.example.com/');
define('WP_HOME', 'https://www.example.com/');

CloudFront用の設定を追加します。

/* add CloudFront Settings */
if (strpos($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}

wp-config.phpの編集は以上です。変更を保存します。

ついでにBitnamiのロゴを非表示にします。

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1

Apacheを再起動して新しい設定を反映します。

sudo /opt/bitnami/ctlscript.sh restart apache
まとめ:ACMとCloudFrontでWordPressをSSL化

AWS for WordPressを使ってSSL化とCDNを使うようにします。

独自ドメインのメールをGmailで扱う

独自ドメインを取得したのでGmailとWordPressで独自ドメインのメールアドレスを使うための設定を行います。

まずはGmailで独自ドメインのメールを扱うための設定について説明します。Gmailの有料版であるGoogleWorkspaceであれば独自ドメインのメールをそのまま扱うことができますが有料で毎月680円からの料金体系になっています。GoogleWorkspaceを使用せずAWSの各サービスを連携することで通常のGmailに無料で独自ドメインのメールを扱うことができます。

ここではexample.comという独自ドメインを取得してxxxxx@example.comという独自ドメインのメールアドレスを作成、このメールをexamplecom@gmail.comに転送するという方法をとります。

メールアドレス説明
xxxxx@example.com独自ドメインのメールアドレスです。
通常のメールとして使う他に、お問い合わせフォームからの通知など
WordPress本体からの通知を受け取るアドレスを想定しています。
examplecom@gmail.comxxxxx@example.com宛てのメールを受信するGmailアドレスです。
あらかじめこのGoogleアカウントを取得しておきます。
メールの受信

SESが独自ドメインのメールを受信した際にLambdaを使ってメールを丸ごとGmailのアドレスに転送する仕組みを構築します。

メールの送信

Gmailからメール作成時に差出人を独自ドメインのメールアドレスにして送信します。メールの送信はGmailの設定を行うだけなのでLambdaは必要ありません。

SESに独自ドメインを登録

独自ドメインのメールアドレスに送られたメールの受信はAmazon Simple Email Service(SES)を使用します。

メールをSESで受信、メールの内容を丸ごとS3に保存します。そのイベントを受け取ったLambdaがGmailに転送するというフローになります。

まずはSESにドメインを登録します。SES HomeからDomainsの「Verify a New Domain」を選択します。取得したドメインを入力し、Generate DKIM Settingsにチェックを入れ、「Verify This Domain」を選択します。

SESに表示されたDNSの情報(TXTレコード、CNAMEレコード)をLightSailのDNSに追加します。

認証が完了するとAWSから「Domain Verification SUCCESS」と「DKIM setup SUCCESS」のメールが届き、それぞれverifiedのステータスになると完了です。

SESで受信したメールのルール作成

次に受信したメールをS3に保存する設定を行います。SES HomeからEmail Receivingの「Rule Sets」から「Create a New Rule Set」を選択します。

ルールの名称を入力して「Create a New Rule Set」を選択します。

Inactive Rule Setsの一覧にある作成したルールを選択して「Create Rule」を選択します。

分類項目名設定値説明
RecipientsRecipientexample.com取得したドメイン
Action-1. S3S3 bucketexample.com-mailbox分かりやすくユニークであればOK。
このバケットにメールを保存します。
Action-2. LambdaLambda functionexample.com-mail-transfer※ここは後で設定します

ルールを保存して独自ドメインのメールアドレスにメールを送信します。上記のS3バケットにオブジェクトが追加されれば成功です。

S3に保存したメールをLambda関数で転送を行いますが、今の時点ではまだLambda関数を作成していないのでAction-2はLambda関数を作成した後で設定します。

SESにメールアドレスを登録する

SESは不正利用防止のためデフォルトでサンドボックスと呼ばれる設定がされています。サンドボックス上では自分自身が所有していてSESに確認されたメールアドレスしか送受信することができません。まずはSESにメールアドレスの登録・検証を行います。

SES HomeからIdentity Managementの「Email Address」を選択します。

使用したい独自ドメインのメールアドレスを入力して「Verify This Email Address」を選択します。

ここで入力したメールアドレス宛てに確認のメールが送信されます。SESで受信したメールをS3に保存する設定を行っているのでS3のバケットを確認します。S3に保存されているメールをダウンロードしてテキストエディタで開き、文面のURLにアクセスすると認証完了です。

受信したいメールアドレス、そのメールを転送するアドレスの2つを登録する必要があります。

ドメインの一覧から「Send a Test Email」を選択して自分のメール宛てにテストメールを送信します。数分後、メールを受信できればSESのドメイン登録は完了です。

メールを転送するLambda関数を作成する

受け取ったメールを転送するLambda関数を設定します。

関数の作成を選択し、関数名には任意の名称、ランタイムはPython 3.8を選択します。コードはGithubにアップしてありますので、それをコピペすればOKです。

メールを転送するLambda関数

Lambda関数の環境変数を設定します。

キー説明
MSG_TARGETxxx@example.com転送対象とする独自ドメインのアドレス
MSG_TARGET_LISTxxx@example.com,
yyy@example.com
転送対象とする独自ドメインのアドレス(カンマ区切り)
※複数のメールアドレスを転送する場合はMSG_TARGETの代わりにこちらを利用します
MSG_TO_LISTexamplecom@gmail.com転送先のメールアドレス
SES_INCOMING_BUCKETexample.com-mailboxSESがメールを保存するS3のバケット名
SUBJECT_PREFIX[転送]転送する際にメールの件名に追加する文言
VERIFIED_FROM_EMAILxxx@example.com転送する際にFROMへ設定するアドレス

Lambda関数を保存したらSESのルール(Action-2)にLambda関数の登録を行います。

WordPressのメール送信機能で独自ドメインのメールサーバーを設定

WordPressが独自ドメインのメールを送信できるようにします。WordPress本体の更新通知やContactForm7でお問い合わせフォームを作った場合に、通知やお問い合わせの内容を独自ドメインのアドレス宛にメールで送信できるようにします。

まずはAWSでSES用のIAMユーザーを作成します。SES HomeからSMTP SettingsのCreate My SMTP Credentialsを選択します。ユーザー名はデフォルトのままでOKです。

WP Mail SMTPプラグインをインストールします。このプラグインは一部機能が有料になりますが、無料の範囲内で設定することができます。

設定で「その他のSMTP」を選び、SESの接続情報を入力します。

項目名設定値
SMTPホストemail-smtp.us-east-1.amazonaws.com
暗号化TLS
ポート587
認証ON
SMTP User NameIAMユーザーのアクセスID
SMTP PasswordIAMユーザーのアクセスシークレット

WP Mail SMTPからテストメールを送信して受信できれば成功です。

番外編:SESのSandbox制限解除

SESのSandbox制限はAWSサポートへ申請を行うことで解除することができます。Sandbox制限を解除しなくても認証済みメールアドレスを個別に登録すれば独自ドメインのメールを扱うことができますが、メールアドレスが増えたときなどにメールアドレスの都度登録が必要になって若干手間なので制限解除を申請しておきましょう。解除申請の方法を解説します。

SES HOMEからSending Statistics、Additional InformationのRequest Increased Sending Limitsを選択します。

項目名設定値
制限タイプSES送信制限
メールの種類トランザクション
ウェブサイトのURLブログのURL
AWSサービス条件とAUPを遵守しますか?はい
あなたのメールを明確にリクエストした受信者のみに
送信する方法を詳しく説明してください
<詳しい説明を記載>
バウンス通知、および苦情通知を受け取った場合に
従うプロセスを詳しく説明してください
<詳しい説明を記載>

2つの説明欄はサイト、ブログの運用に合わせて記載する必要があります。説明が不足している場合はメールで指摘が来ますので、修正の上再申請すればOKです。

Gmailを使って独自ドメインのメールを送信する

examplecom@gmail.comのGmailの設定「アカウントとインポート」から名前欄の「他のメールアドレスを追加」を選択します。

info@example.comなどの独自ドメインのメールアドレスを入力し、次へ進みます。

WP Mail SMTPプラグインと同じ接続情報を入力します。これで独自ドメインのメールをGmailから送信することができます。

まとめ:独自ドメインのメールをGmailで扱う

一番の難所です。

独自ドメイン宛てのメール→SESが受信→S3に保存→Lambdaがまるごと転送→Gmailで受信

各サービスの連携を把握して設定を取り組みましょう。

上記の構成で必要な料金

一連の手順でWordPressのサーバーを利用する場合の月額料金はおよそ500円以下になります。アクセス数の増加に伴ってデータ転送量とHTTPSリクエストに対する課金が増えますが、単価がかなり安いので気にならないレベルです。

また、後述のメルマガから支払いに使えるクレジットをもらうことができるので実質ドメイン代だけでブログを運用することもできます。

料金種別AWSのサービス金額
ドメインの管理Route530.50ドル/月
WordPressのサーバーLightSail3.5ドル/月
SSL証明書ACM無料
データ転送量[画像やCSS] CloudFront0.114ドル/GB
データ転送量[管理画面]CloudFront0.060ドル/GB
HTTPSリクエストCloudFront0.0120ドル/1万件
HTTPSリクエスト[管理画面]CloudFront0.0120ドル/1万件
メール送受信SES無料枠内
メール転送Lambda無料枠内
メール保存容量S30.025ドル/1GB
合計約470円/月

番外編:AWSのクレジットをもらう方法

builders.flashのメルマガを購読する

AWS公式のウェブマガジンにbuilders.flashというものがあります。メールメンバーの登録ページに「無料でハンズオン記事をお試しいただける AWS 無料クーポンをプレゼント」と明記されていますので、メールマガジンやWebでAWSを学びつつ毎月25ドル分のクレジットもいただくことができます。

イベントに参加してアンケートに回答する

AWS Innovateなどのイベントに参加した際にセミナー視聴後のアンケートでクレジットをもらえる場合があります。以前参加したイベントではアンケート回答後に25ドル分のクレジットをいただきました。

AWSのイベント