Lightsailを用いてWordPressのインスタンスを構築する

# はじめに
LightsailでWordPress環境を構築した際のメモです。

## Lightsailについて
###いいところ
* 月額$5からと圧倒的に安い
    * $5/monthのプランでも1TBの転送量込み
* すぐに構築できる
    * OSイメージはAmazon LinuxとUbuntuが用意されている
    * 加えてbitnamiの提供するWordPressやRedmine、GitLab、Magentoなどを設定済みの*Stack*イメージが用意されている
* 設定が簡単
* 固定IPを無料で利用できる
    * Static IPと呼ばれている。（Elastic IPかな？）
    * インスタンス1つに対し1個、無料で利用できる。
* DNSも利用できる
    * 今回は試していない。

### わるいところ（留意しておくこと）
* 2017年3月2日現在で、利用できるリージョンは`us-east-1`のみ。
* Shadow VPC と呼ばれる、コンソールからは見えないVPCの中で実行される。
    * RDSなどを使おうとすると、VPC Peering が必要になる。
        * もちろん課金される。
        * Peeringできる先は、現在のところ**us-east-1のデフォルトVPC**のみ。
* Firewallの設定が、開放するポートしか設定できない。
    * それ以上はOS側で。
* スナップショットの自動取得はWebコンソールから設定できない。
    * 別途、Lambda等からAPIを叩く必要がある。
    * なお、公式で公開しているLambdaのコードがあります。スライド参照。
        * こちらはまた別記事を書く予定。
* インスタンスのサイズを変更する際には、スナップショットを取得し、スナップショットからインスタンスを再作成する必要がある。
    * オンラインのままスケールアップはできない。
* Auto ScalingやAuto Healingのような便利なものはない。
* Lightsailというよりbitnamiの話だが、内部で使用されるApacheやMySQLなどのプログラムは、aptやyumなどのパッケージマネージャで管理されているわけではなく、`/opt/bitnami`というディレクトリにすべてインストールされている。
    * そのため、セキュリティパッチが当たりません。
    * この点が引っかかるなら、Amazon Linux等に自分でインストールして構築していく感じ。

# 手順
## Lightsailコンソールで
### Lightsailコンソールを開く
2. AWSコンソールで`lightsail`と検索する。  
   もしくは、 https://lightsail.aws.amazon.com/ から。

### インスタンスを作成する
4. コンソール右上の`Create Instance`をクリック
    5. 以下の通り設定する
        * Pick your instance image: `Apps + OS` -> `Word Press`

            > 小さくて見逃しやすいが、**Change SSH key pair**をクリックすると、SSHログイン時に使用するキーペアを変更することができる。必要に応じて変更する。
（`Create key pair`から新しいキーペアを作成することもできるが、作成した時一度だけしかダウンロードできないので注意する。）
        * Choose your instance plan: 今回は`$5/month`を選択
        * Select Availability Zone: 今はus-east-1?しか選べないので、今回はそのままで
        * Name your instance: 後から**変更できない**のでちゃんと悩む。
           > なお、インスタンス自動取得プログラムで、指定した接頭辞(`AS-`)から始まるインスタンス名を対象にしているので、今回はAS-test-blog とした。
また、スナップショットを取得、スナップショットからインスタンスを作成することで名前の変更のようなことはできる。
    4. `Create`をクリック

### 焦らず5分待つ
インスタンス作成後すぐアクセスすると、インストール処理中なのか、ホームディレクトリにあるはずの初期パスワードが記載されたファイルが存在しないことがあるので、5分ほどはおとなしく待つ。

### Static IPを割り当てる
Static IPの設定をしないと、インスタンス再起動時にIPが開放→別のIPが割り当てされるので、IPが変動する。

1. コンソール右上の`Create other resources`をクリック、`Static IP`をクリック
    * Instance location: 今はus-east-1しか選べないのでこのまま。
    * Attach to an instance: 前の手順で作成したインスタンスを選択。
    * Name your static IP: やっぱり**変更できない**のである程度悩んで決める。
2. `Create`をクリック

### LightsailのFW設定を確認する
6. コンソール上で、作成したインスタンスをクリック
7. `Networking`タブをクリック
8. `Firewall`の項目が、`SSH,HTTP,HTTPS`のみになっていることを確認

### 割り当てたIPにアクセスし、WordPressが表示されるか確認する
> 割り当てたStatic IPは、ダッシュボードに表示されているインスタンス名の右下から確認できる。

7. ブラウザで、`http://<Static IP>/`にアクセスする。
   WordPressの画面が表示されればここまでは成功。

       > ちなみに、自己署名証明書ながらHTTPSでの通信もできる。

## Lightsailインスタンスで
### SSH接続する
コンソールからはキーペアやパスワードを使用せずにターミナルにSSH経由でログインできます。
ただし、接続に時間がかかったり、コピペできなかったりと不便なので、今回は従来通りターミナルソフトからSSH接続して設定しました。

8. お好みの方法で接続してください。ログイン時の情報は以下の通り。
    * ユーザ名：`bitnami`
    * パスワード：なし
    * 鍵：設定したキーペア

        > デフォルトのキーペアは、ダッシュボード右上`Account` -> `Account` の、`Download default private key`からダウンロードできます。

### 初期パスワードを確認する
> 初期パスワードは、WordPressやMySQLのログイン時に使用します。

```bash:bash
$ cat bitnami_application_password
<初期パスワード>
```

### ページ右下に出るbitnamiのロゴをdisableする

```bash:bash
$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
$ sudo /opt/bitnami/ctlscript.sh restart apache
```

### bitnamiのロゴが消えたか確認する
11. WordPressのページをリロードして確認する。

## WordPressで
### WordPressにログインする
3. http://\<IP\>/wp-login.phpを開く

    >* ID: `user`
    >* パスワード: 先ほど確認した初期パスワード

### 本体・プラグイン・テーマの更新を適用する
更新がある場合はダッシュボードに通知される。

3. ダッシュボード左側のメニューの、`Updates`をクリック。
    4. WordPress本体の更新がある場合は適用する。
    5. プラグインの更新がある場合は適用する。
    6. テーマの更新がある場合は適用する。

### タイムゾーン・言語を変更する
4. ダッシュボード左側のメニューから`Settings` -> `General` をクリック
5. 以下の通り変更する
    * Timezone を`UTC+9`に
    * Site Language を`日本語`に
7. `Save Changes` をクリック

### 翻訳の更新を適用する
3. ダッシュボード左側のメニューの、`更新`をクリック。
4. 翻訳の更新がある場合は適用する。

### 本体の更新（ローカライズ版）を適用する
日本語ローカライズ版に更新可能なので、必要に応じて更新する。
3. ダッシュボード左側のメニューの、`更新`をクリック。
4. WordPressの更新を適用する。

### 管理者のパスワードを変更する
5. ダッシュボード左側のメニューの、`ユーザー`  -> `あなたのプロフィール`をクリック
6. ページ下部のアカウント管理の、新しいパスワードの横にある`パスワードを生成する`をクリック
7. 生成されたパスワードを消し、設定したいパスワードを入力する  
  （確認で入力したりしないので、間違えないようにする。）
8. `プロフィールを更新`をクリック

    > 次回ログイン時から設定したパスワードが有効になる。
      ダッシュボード右上の「こんにちは、`user`さん」の上にカーソルをかざし、出てきたメニューから`サインアウト`して、変更後のパスワードでログインできるか確認する。

### 投稿用のユーザを作成する
5. `ユーザー` -> `新規追加`をクリック
6. 以下の項目を入力する
    * ユーザー名
    * メールアドレス
    * 権限グループを`編集者`に

        > 権限グループは適切なものを設定する。

7. `新規ユーザーを追加` をクリック

    > 管理者ユーザと間際らしいので、投稿用ユーザの配色を変更しておくことをおすすめ。
ユーザー一覧でユーザをクリック、`管理画面の配色`を適当なものに変更。

### テスト投稿をし、正しく表示されるか確認する
1. 投稿用のユーザでログインし、テスト投稿をする。  
   日本語・4バイト絵文字（🍣など）が正しく表示されるかを確認する。
1. ブラウザで開いて確認する。

## （以下は必要に応じて）
### iptablesで指定したIPアドレスからのアクセスに限定する
* HTTP,HTTPSには、指定したIPアドレスからのみアクセスできるようにしたい。
* LightsailのFirewall機能では、「どのポートを開放するか」のみ設定できる。  
そのため、インスタンス側のiptablesを用いて設定する。
* ufwというiptablesのフロントエンドツールを用いて、iptablesのルールを設定する。  
iptablesのコマンドを直接実行するよりも簡単で、設定後の確認もしやすい。  
また、設定は**即時反映**され、設定は**自動的に保存**されて、**次回システム起動時にも反映**される。

1. ufwが有効か無効かを確認する

    ```bash:bash
    $ sudo ufw status
    Status: inactive
    ```
    おそらく*inactive*と表示される。

1. すべてのIPからSSHを許可するルールを追加する

    > すべてのIPからSSHを許可している理由は以下の通り
    >
    >* LightsailのWebコンソールから使えるターミナルが、グローバルIP経由でSSH接続をしているため。
    >* 上記ターミナルで接続元IPとなるレンジが公開されていないため。  
    >  （実際には、AWSで使用されるIPのレンジは公開されているけれど、Lightsailのドキュメントとしては明記されていないため。変更されるかもしれない。）
    >* もし、「特定のIPからのみ」のルールを追加しようとして、間違えたとする。すると新規にSSHでセッションが張れなくなる。この状態で既存のSSHセッションを閉じてしまうと、LightsailインスタンスにはSSH接続以外に接続する方法が用意されていないので詰む。前述の通り、ufwは即時反映・恒久化されるため、再起動しても回復できない。

    **ここをすっ飛ばして先にufwを有効にすると、それ以降新規にSSHセッションを張れなくなる。もし有効にしてしまったときはそのセッションを絶対に閉じないように。**  

    ```bash:bash
    $ sudo ufw allow ssh
    Rules updated
    Rules updated (v6)
    ```

1. ufwを有効にする

    ```bash:bash
    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    ```

    *Command may disrupt existing ssh connections. Proceed with operation (y|n)?* と聞かれます。yキーを押下。
    *Firewall is active and enabled on system startup* と表示されれば成功

1. ufwに登録されているルール・初期設定を確認する

    ```bash:bash
    $ sudo ufw status verbose
    Status: active
    Logging: on (low)
    Default: deny (incoming), allow (outgoing), disabled (routed)
    New profiles: skip

    To                         Action      From
    --                         ------      ----
    22                         ALLOW IN    Anywhere
    22 (v6)                    ALLOW IN    Anywhere (v6)
    ```

1. 指定したIPからはすべての通信を許可するルールを追加する

    ```bash:bash
    $ sudo ufw allow from <指定のIP>
    Rule added
    ```

    > WordPressで、**StaticPress**というプラグインを用いてS3バケットにHTMLを吐き出したい場合、**LightsailインスタンスのグローバルIP(Static IP)も、同様に設定する必要がある**。
（設定しないと、StaticPressが正常に動作しない。）

1. ufwに登録されているルールを確認する

    ```bash:bash
    $ sudo ufw status numbered
    Status: active

         To                         Action      From
         --                         ------      ----
    [ 1] 22                         ALLOW IN    Anywhere
    [ 2] Anywhere                   ALLOW IN    <指定のIP>
    [ 3] 22 (v6)                    ALLOW IN    Anywhere (v6)
    ```

### 正しく設定されているか確認する
1. 先ほどの設定後に
    * LightsailのWebコンソールからターミナルが開けること
    * 指定したIPアドレス下の端末から
        * SSHセッションが張れること
        * WordPressが開けること
    * スマホなど別回線の端末から
        * SSHセッションが張れること
        * WordPressが**開けない**こと
1. `sudo ufw disable`して
    * スマホなど別回線の端末から
        * WordPressが**開ける**こと
1. `sudo ufw enable`→`yキー`して
    * スマホなど別回線の端末から
        * WordPressが**開けない**こと

を確認する。

# おわりに
安くて簡単で便利だと思いました。
軽めのもの、社内向けのもの を動かすには十分かなと思います。
また別の記事を書きますが、CloudFrontとも連携可能です。

# 参考に
* WordPressインスタンスを構築する流れと、簡単なLightsailの紹介
    * Amazon Lightsail – AWSの力、VPSの簡単さ  
    https://aws.amazon.com/jp/blogs/news/amazon-lightsail-the-power-of-aws-the-simplicity-of-a-vps/
* Lightsailについて紹介した公式のスライド（よくまとまっています）
    * AWS Black Belt Online Seminar 2017 Amazon Lightsail 
    https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-lightsail
* WordPressのユーザー権限について
    * 覚えておきたいWordPressのユーザー権限の種類と登録・管理方法
    http://bazubu.com/how-to-setup-wp-users-23705.html
* ufwについて
    * 第76回　Ubuntuのソフトウェアファイアウォール：UFWの利用（1）
    http://gihyo.jp/admin/serial/01/ubuntu-recipe/0076
    * 第77回　Ubuntuのソフトウェアファイアウォール：ufwの利用（2）
    http://gihyo.jp/admin/serial/01/ubuntu-recipe/0077