LightsailでWordPressを設置してみた

はじめに

 2021年11月、サークル『Recollection』参加に先んじて過去作品掲載に使っていたブログを綺麗にしとこうと思い立ちまして、せっかくなので独自ドメインを取ってAWSでサーバを立ててみようかとLightsailでWordPressサイトを作ってみた際の手順の覚え書きです。きっと何かの役に立つから。

 その性質上、このブログがどういう風に動いているかわかってしまうので「あれ? おやおやおや?」ってなるところがあるかもしれませんが、そんなときはこっそり教えてくださいませ。埋めておきます。

Lightsailとは

 LightsailはAWSの提供する仮想サーバサービスのひとつで、以下の特徴があり、高度なことを勉強せずともサーバ技術者っぽいことをなんとなくやることができます。

・サーバ利用量、転送費、静的IPの割り当てまで含めたほぼ月額固定サービスであり、想定以上の出費を覚悟しなくてよい。価格も最小なら多くのレンタルサーバより安い
・WordPressなどのよくある構成をメニューから選択して起動する形式になっており、直感的に選ぶだけでソフトウェアのインストール操作をしなくてもよい
・レンタルスペースではないので、起動後はちゃんとSSHターミナルで好き放題できる。その割にブラウザベースの SSH クライアントが用意されているのでputtyとか触らなくて済む

 最終的にはAWSの他のサービスであるEC2のほうがサーバ編成やスケーリングなど柔軟に構築できるので、小規模でもウェブサービスを設計しようとなるとそちらになるのですが、単に個人ウェブサイトを立てたいくらいの要望であればLightsailを使うのがちょうどよいでしょう。

※転送費はデータ転送枠の上限を超過した部分が従量課金になります。ただ、最小でも1TBあるので今回のような用途において超過することはないと思います。
※レンタルサーバは管理やセキュリティを任せてしまえる面もあるので、どちらが良い悪いというのはちょっと言いづらいところ。

AWSに登録しよう

 まずはみんな大好きAWSのユーザー登録をします。従量課金サービスのためいきなりクレジットカードの登録が必要になりますが、こればかりは回避できないので覚悟を決めて登録しましょう。詳しい手順は割愛しますが、以下の基本設定あたりはしておくといいと思います。

・rootユーザーで操作せず、IAMユーザーを作成してそちらで操作を行う
本当はIAMユーザーに適用するロール(どの操作を解禁するしないの設定)をきちんと精査して初めて意味のあることなのですが、個人用のAWSアカウントなら程々でもいいかな……

・rootユーザー、IAMユーザーどちらにもそれぞれMFA(多要素認証)を有効にする
今回はAndroidスマートフォンに仮想MFAのひとつ「Google認証アプリ」をインストールして対応しました。いわゆるワンタイムパスワードってやつです。

・ClowdWatchに支払い額アラームを付けておき、月の支払額が一定値を超えたらメール通知が行くようにする
とりあえず100ドル/月にしておきましたが、後述の価格感からするともっと低い設定でもよいと思います。またBillingに対するアラームは米国バージニア北部(us-east-1)リージョンを選んでいるときしか設定できないことに注意。

 なお、通販大手のAmazonとAWSは大まかには分かれていますが、全く関係ないとまでは言わないのでちゃんとAmazon側も2段階認証くらいは設定しておきます。

Lightsailを起動させる

 Lightsailのページを開き「インスタンス作成」から必要事項を入力していくだけで5分も掛からずに仮想サーバが誕生します。

・インスタンスロケーションは東京A(ap-northeast-1a)
基本的に近いロケーションにしておいたほうが転送速度の面で有利なはずなので、東京以外の選択肢は基本的にないでしょう。

・インスタンスイメージは「Linux/Unix」の「WordPress」
今回はまずWordPressサイトを作ろうと決めていましたので、選択肢は迷いなくこれを選びます。OSのみで起動することもできますが、これらの設計図はBitnamiの動作検証済パッケージでインストールされますので単純に後からインストールするより総合的には楽ができるかなと思います。

・起動スクリプトとSSHキーペアの変更は触れず
SSHキーペアについては趣味なところありますが、最初の1件なのでセキュリティ上の差はほとんどないものと思います。

・インスタンスプランは$3.50USDのもの
月額$3.50USD、メモリ512MB、バーチャルCPUが1、ストレージが20GBのSSD、転送量が1TBまで。実は中身的にはEC2のt2.nanoに相当するそうです。一番下というとスペックが足りるのかと思われるかもしれませんが、個人のテキストサイトのスペックとしては十分すぎるくらいのものです。本当に。

 起動すると数分でサーバが起動しLightsailのページに現れます。他のことを始めるにあたって静的IP(固定のIP)が必要なことも多いので、まずは設定から静的IPを「アタッチ」してしまいます。それが完了したら、ブラウザのURL欄にそのIPを入力してみます。WordPressのデフォルト画面が出ます。これで様々な問題は残しつつもウェブサーバ管理者になれました。簡単ですね。

 Lightsailのページからは「ブラウザベースの SSH クライアント」が使用でき、ワンクリックでターミナルアクセスできます。なんとログインまで全部やってくれる便利な子です。ターミナルが開きましたらまずさっそくホームディレクトリに用事のあるファイルがありますので次を入力します。

cat bitnami_application_password

 すると何やら妙な文字列が表示されます。これがデフォルトでインストールされているWordPressの「user」ユーザーのパスワードです。WordPressを開いているブラウザのほうでログインをしてみて、さっそくユーザーを整理します。ユーザー名「user」はセキュリティ的というより見栄え的にもあまりにもあんまりなので……

独自ドメインに変更する

 まずはどこかのドメイン購入サイトで好きなドメインを買ってきます。AWSにもRoute53というドメイン購入できるサービスがありますが、.jpドメインが他より高額だったり取り扱っていないドメインがあったり等ありますので、何ドメインを買うかからサイトを選んだ方が良いと思います。

 今回は前身となったブログが timeworn.blog.shinobi.jp だったことからそのまま timeworn.blog にしちゃうかという安直な気持ちで「.blogドメインを取り扱っている」「Whois公開代行をやっているので名前が全世界に公開されない」から絞っていき、結果、スタードメイン(ネットオウル)を利用することにします。

 購入の流れは割愛しますが、購入完了しましたら各社の操作画面でDNSレコードを設定できるようになります。先ほどアタッチした静的IPを指すように「このドメインにアクセスされたらこのIPだよー」という指定を書き入れます。設定完了後しばらくすると晴れて独自ドメインでアクセスができるようになり、これで独自ドメインへの変更は完了となります。DNS周りはややこしいんですが、やること自体はシンプルですね。

SSL証明書を適用する

 BitnamiのパッケージにはSSL証明書関連をやってくれるツールが入っており、Let’s Encryptでの無料SSL証明書の取得~サーバへの設定~期限迫ったら更新まで全部やってくれます。便利ですね。

 操作としては、ドメインが適用できてブラウザアクセスが確かめられた以降の段階で、ターミナルから以下の入力を行うだけです。

sudo /opt/bitnami/bncert-tool

 英語で色々聞かれますので、適宜入力したりY/nで返答したりします。
・SSLを適用するドメイン → timeworn.blog
・www付きのアドレスもSSL証明書発行するかどうか → 不要
・HTTPでアクセスされたらHTTPSにリダイレクトするかどうか → する
・www付きのアドレスから/へのリダイレクトをするかどうか → 不要
・メールアドレス → なくても動くけど入力しておいたほうがよい。先日Let’s Encryptが証明書発行でやらかしてさっそく通知が来たし

 上記が終わればあっさりサイトがHTTPSになります。無料で得られるSSL証明書ですので信頼性という意味ではちょっと懸念がありますが、あくまでHTTPS通信にしたいだけの個人サイトですので有料のSSL証明書を用意してまで導入する必要はないでしょう。

セキュリティのために(プラグイン)

 WordPressはメジャーなソフトウェアなので様々なところで利用されている反面、それゆえに攻撃者の格好の標的になります。Lightsailで起動した瞬間からいつ攻撃されてもおかしくないくらいに考えてもいいくらいです。なので、セキュリティを固めておくことは大前提として考えておきます。

 WordPressのセキュリティはプラグインを導入するのが近道なのですが、bitnamiパッケージのWordPressはデフォルトの状態で.htaccessを無効にしているため、.htaccessの設定を代行するやり方で機能を実現しているプラグインは効果がありません。困ったものです。そこらへんを考慮しまして、とりあえず以下の構成で運用することにしました。

・WPS Hide Login
 ログインページのURLを変更するだけのシンプルなプラグインです。何に変更したかはもちろん秘密ですが、このプラグインのおかげでこのサイトのそれっぽいURLを叩いてもログインページは出てこなくなっています。
 .htaccessを使って実現していないようでbitnamiパッケージでも動作するのがポイントです。美学にあってない動きがちょっとあるので正直もにょりますが…

・SiteGuard WP Plugin
 とりあえずセキュリティをと考えたらこれを入れておけばというプラグインです。ただし.htaccessを使って実現している機能「管理ページアクセス制限」「ログインページ変更」「XMLRPC防御」はONにしても動きません。変な動作し始めるだけなのでOFFにしておいて他の手を打ちましょう。
 また「更新通知」は後述のwp-cron.phpを止めた関連で動かないのでこれもOFFにしています。

・WP Mail SMTP
 WordPressからメールを送る場合に必要です。今回はコメント欄を潰しているためSiteGuardの「ログインアラート」を動かすためくらいですね。Bitnamiのパッケージからであればデフォルトでインストールされています。
 ただこのプラグインはあくまでWordPressとSMTPサーバの仲立ちをしてくれるだけですので、動かすためには別途SMTPサーバが必要になります。AWSでAmazon Simple Email Serviceをセットアップして実現しましたが、説明は割愛。

セキュリティのために(htaccess)

 Wordpressには攻撃対象にされやすいなどの理由でアクセスしてほしくないファイルがまだまだノーガードで存在するのでそちらへの対策を講じます。ONにできなかったSiteGuardの機能でも一部抑えられるのですが、やや不足があるように思うので別途手を打つ必要はあるかと思います。

 ファイルへのアクセス制限というと.htaccessを有効にしてしまうアプローチもあるのですが、代用となるコンフィグファイルがありますので、今回はそちらを操作する方向で対応することにします。

 コンソールから

sudo vi /opt/bitnami/apache/conf/vhosts/htaccess/wordpress-htaccess.conf

でwordpressディレクトリの.htaccessの代わりとなるコンフィグファイルがviテキストエディタで開けますので以下の記述を追加しておきます。

<Directory "/opt/bitnami/wordpress/">
  <Files xmlrpc.php>
    Order allow,deny
    Deny from all
  </Files>

  <Files wp-config.php>
    Order allow,deny
    Deny from all
  </Files>

  <Files readme.html>
    Order allow,deny
    Deny from all
  </Files>

  <Files wp-cron.php>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

それぞれ
xmlrpc.php:攻撃対象としてメジャーどころ。SiteGuardの「XMLRPC防御」の防御対象
wp-config.php:攻撃対象としてメジャーどころ
readme.html:あんまり意味はないんですがWordPressのバージョンがバレる
wp-cron.php: 攻撃対象としてメジャーどころ。ただし、これを止めると自動更新・予約投稿も止まるので注意
についてアクセスを全面的に止める記述です。設定ファイルの保存が完了しましたら

sudo /opt/bitnami/ctlscript.sh restart apache

でサーバを再起動すれば適用完了です。ブラウザからアクセスしてみて403 Forbiddenになっていれば大丈夫です。

※この件に関して検索すると技術情報がいくらか出てきますが、wordpressディレクトリが /opt/bitnami/apps/wordpress ではなく /opt/bitnami/wordpress に移動していいたり、そのディレクトリにそもそも /conf/htaccess.conf がなくなっていたりします。Lightsailで提供しているbitnamiパッケージが変わりでもしたのか……?

利用料金の話

 実のところ、Lightsailは初めて利用したインスタンスが3か月無料になっているため、2022年1月まで1円も掛かっておらず、未だに最終的な料金の落ち着きどころが結果として見えていなかったりします。が、見込みは次の通りになります。

AWS利用料金:
 $3.50USD/月 ※3か月無料
ドメイン料金(ネットオウル、.blogドメイン)
 3280円/年 ※初年630円

 最終的にはおおよそ700円/月くらいですね。.blogドメインは比較的お高いドメインなので、伊達でこういうドメインを使わず.comや.net、.infoなどの安いドメインを使うなら550円くらいまで抑えられると思います。あとは見た目にこだわらないなら無料ドメインなんていうのも一応世の中にはあります…

 なお、この構成をEC2で実現しようとした場合、t2.nanoインスタンスをオンデマンドで1か月およそ730時間借りると$5.548USDほど掛かるそうです。リザーブドインスタンスで全額前払い1年にすれば$3.50USD/月ほど、3年にすれば$2.39USD/月ほどにはなるようですが、とりあえず試してみようの域であれば一括でお金を出すのもためらわれるところですね。またデータ転送費の無料枠も違うので場合によってはひっくり返ることもあると思います。