IDCF Cloud が個人向けサービスを終了する
IDCF Cloud の個人向けサービスが終了することとなりました。これまで IDCF Cloud の500円/月サーバーで WordPress を運用していたため、他のクラウドサービスなどへ移す必要がでてきました。まあ、みんな500円インスタンスだけつかって儲からないとか、脆弱性放置で乗っ取られるとかありそうだからね。
引越し先選定
時代はコンテナだし、Kubernetes の勉強がてら出たばかりの DigitalOcean の Managed Kubernetes を使って構築しようかとも思ったのだけれど、最小インスタンス1つだけで $10/月 かかり、Load Balancer でさらに $10/月、加えて Block storage も必要になります。これはちょっと高すぎだなあということで、AWS Lightsail の $3.5/月インスタンスを使うことにしました。CloudFront は以前から導入済みでした。DigitalOcean の Kubernetes は日本から一番近いシンガポールリージョンではまだ提供されていない(まだ Beta だしね)という理由もあります。
Lightsail には他の VPC サービスの様な(あ、EC2 にもありますね)アプリインストール済みイメージも選択可能なのでここから WordPress を選択します。Version が 4.9.8 となっていますが、起動後に更新可能です。
Lightsail の WordPress は Bitnami のパッケージが使われています。(Get Started With Bitnami Applications Using Amazon Lightsail)
データ移行
移行元の WordPress で Tools → Export で All content を選択して Export し、新しい WordPress で Tools → Import で WordPress Importer をインストールして取り込むだけです。画像も直接旧サイトから取り込んでくれます。 ということなのでインポートをする時点では DNS や CloudFront の Origin サイトを切り替えたりしてはいけませんん。
Bitnami の WordPress を使うにあたっていじったところのメモ
mod_expires 設定
/opt/bitnami/apache2/conf/expires.conf
を次の内容で作成。
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>
/opt/bitnami/apache2/conf/httpd.conf
でコメントアウトされている行をアンコメントします。
#LoadModule expires_module modules/mod_expires.so
↓
LoadModule expires_module modules/mod_expires.so
先程作成した expires.conf
を Include する。
Include conf/expires.conf
を /opt/bitnami/apache2/conf/httpd.conf
の末尾に追加。 Apache の再起動
sudo /opt/bitnami/ctlscript.sh restart apache
mod_pagespeed の無効化
mod_expires 設定を行っても mod_pagespeed が
Cache-Control: max-age=0, no-cache, s-maxage=10
をセットしてしまうので無効にする。 /opt/bitnami/apache2/conf/httpd.conf
の当該行をコメントアウト。
Include conf/pagespeed.conf
Include conf/pagespeed_libraries.conf
↓
#Include conf/pagespeed.conf
#Include conf/pagespeed_libraries.conf
Apache の再起動
sudo /opt/bitnami/ctlscript.sh restart apache
php.ini の変更
/opt/bitnami/php/etc/php.ini
にあるので変更の必要があればここを書き換えて wordpress の再起動
/opt/bitnami/ctlscript.sh restart php-fpm
Response Header に PHP の Version を入れたくない場合は expose_php
を Off
にする。
expose_php = Off
https 対応
/opt/bitnami/apps/wordpress/htdocs/wp-config.php
の WP_SITEURL
, WP_HOME
を https
に変更
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');
↓
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');
この行の下に CloudFront 版の X-Forwarded-Proto
対応設定を挿入
if (strpos($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
WordPress の再起動
/opt/bitnami/ctlscript.sh restart php-fpm
CloudFront を使って困ること
WordPress の preview は通常の URL に QUERY STRING がついているだけなので、投稿のプレビューができない or キャッシュされて機能しないという状況に陥ります。 URL の path にプレビュー用の prefix を入れるプラグインとかないかな?
https://gist.github.com/wokamoto/ecfd3a7ea9ef80ea1628 というのは見つけたけど。
現状は投稿する PC では hosts でサーバーに直接アクセスするようにして回避しています。
サーバー直でも https でアクセスできるようにする
サーバーに直接アクセスするために Apache にも TLS の証明書をセットする必要があります。/opt/bitnami/apache2/conf/bitnami/bitnami.conf
に
SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"
とあるのでここに Let’s Encrypt で取得した証明書と鍵をコピペして apache を再起動します。
sudo /opt/bitnami/ctlscript.sh restart apache
DNS は Route53 を使っているため Let’s Encrypt の証明書は lego で次のようにして取得することがます。
lego \
--domains blog.1q77.com \
--accept-tos \
--path . \
--email 自分のメールアドレス \
--dns route53 \
--pem \
run
データのバックアップ
Lightsail インスタンスはスナップショットを作成することができます。 https://github.com/amazon-archives/lightsail-auto-snapshots という SAM を使った Lambda Function で自動化する方法があるようです
追記
「AWS Lightsail の snapshot 取得を自動化する」に上記の Lambda を使って自動化する手順を書きました。