aws Lightsail WordPressインスタンス と Route53 で Webページ を配信する

# 最終形

![AWS Networking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539175/983a712b-86f8-accc-e2f4-29e48278c56b.png)

# Lightsail WordPressインスタンスを生成する

[こちらのチュートリアル](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-tutorial-launching-and-configuring-wordpress)に従ってインスタンスをつくっていきます。ステップ５まで実施し、ステップ６以降は別の方式で進めます。

# 独自ドメインの使用と https 通信の実現

これまでの作業で、WordPressインスタンスにアタッチした静的 IP アドレスを用いて Webページを pull できるようになりました。

この状態では以下の課題が残ってしまっています。

- 独自ドメインの利用 (Must)
- https 通信を行う (Must)
  - TLS証明書を取得する (Must)
  - TLS証明書を有効期限内に自動更新する (できたら)
- CDN を使う (できたら)

Must要件のみ解決するには、WordPressプラグイン (Really Simple SSL) + Certbot + Route53 の組み合わせで完全に無料で実現できます。実際にこの組み合わせで構築し、半年間運用しましたが全く問題なく運用することができました。

しかしながら、TLS証明書は利用開始後３か月経過するごとに証明書の有効期限を迎えるので証明書の更新が必要となり、更新を怠ると http通信にダウングレードされてしまいます。Certbot を用いた方式は aws の責任共有モデルで言うところのユーザ責任での運用となり、自動更新の仕組みを作ったとしても、更新の前後では確認作業が必須になってしまいそうです。

証明書の更新を自動で安全に行うには、aws の CertificateManager を使用するのがよさそうです。CertificateManager を使用するには、aws の ELB または CloudFront を使用しなければなりません。CloudFront の利用を検討していたところ、Lightsail には ディストリビューション というサービスがあって、CloudFront と同じことをやってくれそうです。しかも WordPress に最適化されたキャッシュ機能が選択できるので、これを採用してみようと思います。

# Lightsail ディストリビューションを生成する

[こちらの一次情報](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-creating-content-delivery-network-distribution)に従ってディストリビューションを作成します。

## TLS証明書を作成する

[こちらの一次情報](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-create-a-distribution-certificate)に従ってTLS証明書を作成します。

## ディストリビューションでカスタムドメインを有効にする

[こちらの一次情報](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-enabling-distribution-custom-domains)に従って設定します。

# DNS で ドメインまたはサブドメインを ディストリビューション にポイントする

Aレコードのエイリアスを使用しました。

# ディストリビューションと連携が可能になるように WordPressインスタンス を設定する

ここまでの作業でカスタムドメインを使用して Webページが pull できるようになっています。しかし WordPress のテーマによっては画面レイアウトが崩れてしまっていて、カスタムドメインを使用して WordPress の管理画面にログインすると、ここの画面のレイアウトもおかしくなっています。

[こちらの一次情報](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-editing-wp-config-for-distribution)に従って設定を行い、サービスを再起動するとレイアウトは正常に戻ります。

# 管理メールを送信する

今の状態では管理メールを送信することができません。そのため管理メールを用いたパスワードリセットも行えないためパスワードを忘れるととても困ります。

管理メールを送信できるようにするには、以下の設定が必要です。

- Amazon SNS SMTP認証情報を取得する
- WP Mail SMTP Lite (プラグイン) をインストール
- WP Mail SMTP Lite　に Amazon SNS SMTP認証情報を設定する
- 必要に応じて Amazon SNS Verified identities を設定する

一次情報は以下にありました。

- [Amazon SES SMTP 認証情報を取得](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/smtp-credentials.html)
- [Amazon SES から「E メールアドレスが確認されていません」というメッセージと 554 または 400 の「メッセージが拒否されました」というエラーが表示される理由は何ですか。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ses-554-400-message-rejected-error/)

# おまけ

## WordPress のバックアップ

All-in-One WP Migration というプラグインがおすすめです。

## ２段階認証

Google Authenticator がおすすめです。バックアップコードは生成できないので、２段階認証を中断するには wp-content/plugins/google-authenticator フォルダをリネームするなどして対応できます。

## ユーザ名、パスワードがわからなくなったら

WordPress のログイン画面では、パスワードがわからなくなったらメールでリセットする仕組みになっています。最終手段として MySQLデータベース上のパスワードを更新する手順を持っておくと安心だと思います。

[こちらに一次情報](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-reset-wordpress-password/)がありますが、ちょっと理解するのが難しい内容でしたので、以下に手順を残しておきます。

- MySQL DB名、ユーザ名、パスワード取得
wp-config.php から取得する

- MySQL DB接続

```
mysql -u (ユーザ名) -p
```

- DB一覧取得

```
show databases;
```

- ユーザDB切替

```
use (DB名);
```

- table一覧取得

```
show tables;
```

- ユーザ情報取得 (***_ は wp-config.php で設定されているプレフィクスです)

```
select * from ***_users;
```

- パスワード変更

```
update ***_users set user_pass = MD5('NewPasswd') where ID = 'hoge';
```

# 成果物

[unremoted.com](https://unremoted.com)

# 組織

同上