HerokuアプリにExpedited WAF導入

# 前提
1. Windows
1. NodeJSアプリ
1. Heroku CLIインストール済 & `heroku login` 実行済
1. Expedited WAFのプラン決定済 → https://elements.heroku.com/addons/expeditedwaf#pricing
1. 当該アプリに付与するカスタムドメイン名決定済
1. 当該ドメインのDNSへのCNAMEレコード・Aレコードの追加・削除が可能

# 手順その1（Expedited WAF導入前に最低限のアプリを作成して`https://カスタムドメイン名`にアクセス可能としておく）

1. Herokuダッシュボードにブラウザでアクセス
1. Herokuアプリを作る
1. 当該アプリのSettingsタブを開く
1. Buildpacks欄のAdd buildpackボタンからnodejsを追加（他にも追加予定のビルドパックがある場合は先に追加しておく）
1. コマンドプロンプトで任意のフォルダに移動し、以下を実行して最低限のアプリを作成
    ```dos
    heroku git:clone -a ＜アプリ名＞
    cd ＜アプリ名＞
    echo { ^"scripts^": { ^"start^": ^"node index.js^" } } > package.json
    echo require('http').createServer((_, res) =^> res.end('ok')).listen(process.env.PORT) > index.js
    git add .
    git commit -m "minimum app"
    git push heroku master
    ```
1. ブラウザに戻り、SSL Certificates欄のConfigure SSLボタンからACMを有効化
1. Domains欄のAdd domainボタンから使用予定のカスタムドメイン名を追加
1. 表示されたDNS Target（`app-xxx.xxx.herokuspace.com`形式）を使用して、DNSにCNAMEレコード（★1）を一時的に追加
    - Record Name：＜カスタムドメイン名＞
    - TTL：60（後で本レコードを削除する予定があるため短めにしておく）
    - Class：IN
    - Type：CNAME
    - Canonical Name：＜DNS Target＞
1. Domains欄のACM Statusが`Dns Verified`になることを確認
1. ブラウザまたはコマンドプロンプトで`curl -I https://＜カスタムドメイン名＞`を実行し、HTTPステータス`200 OK`が返ることを確認

# 手順その2（Expedited WAFインストール・セットアップ）

1. ブラウザに戻り、Resourcesタブを開く
1. Add-on Services欄でExpedited WAFを検索して押下、プランを選択してインストール
1. アドオン名Expedited WAFを押下
1. Select Domainボタンを押下
1. 表示されたドメイン所有者確認用のCNAME NAME・CNAME CONTENTを使用して、DNSにCNAMEレコード（★2）を一時的に追加
    - Record Name：＜CNAME NAME＞（枠外に表示されるTLDを含めたFQDNで指定）
    - TTL：60（後で本レコードを削除する予定があるため短めにしておく）
    - Class：IN
    - Type：CNAME
    - Canonical Name：＜CNAME CONTENT＞
1. 「Check for DNS CName」ボタンを押下（★2を検知して勝手に画面が進むかも）
1. WAF Buildingが終了してメールが届く＆次の画面が表示されるまで待つ（約11分）
1. 表示されたAレコード値（IPアドレス）を使用して、DNSに以下の操作を行う
    - ★1のCNAMEレコードを削除
    - ★2のCNAMEレコードを削除
    - 以下のAレコードを追加
        - Record Name：＜カスタムドメイン名＞
        - TTL：3600（標準的な値）
        - Class：IN
        - Type：A
        - Value（IPアドレス）：＜表示されたAレコード値＞
1. 「Refresh DNS Results」ボタンを押下し、完了メッセージが表示されることを確認
1. コマンドプロンプトで`nslookup -type=CNAME ＜カスタムドメイン名＞`を実行し、結果が当該ドメインのDNSサーバ情報のみであることを確認 (削除後2〜5分してから実行)
1. コマンドプロンプトで`nslookup -type=CNAME ＜★2のRecord Name＞`を実行し、`Non-existent domain`になることを確認 (削除後2〜5分してから実行)
1. コマンドプロンプトで`nslookup -type=A ＜カスタムドメイン名＞`を実行し、結果が表示されたAレコード値であることを確認
1. コマンドプロンプトで`curl -v https://＜カスタムドメイン名＞`を実行し、結果がok、かつHTTPステータスが200、かつServerヘッダがSucuri/Cloudproxyである(WAF経由での応答)ことを確認

# 手順その3（Expedited WAF設定）
1. Manage your WAFボタン押下
1. Home画面で各種設定のサマリが見れる、ACTIVE/Inactiveを押下して詳細設定画面に入れる項目もある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/e7dac254-ec60-4bc3-9d44-64fe1fabe88f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/1f6d104e-3be6-43b8-b0f0-b496d9afcb11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/42f7885a-c1ed-4f54-abe0-2b6513f856e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/3640b0e2-4dcb-4692-bbb3-c6987cca6421.png)

文中のLearn Moreとかは以下やその子ページへのリンク
https://expeditedsecurity.com/
https://expeditedsecurity.com/heroku/

以下、ブラウザの機能で翻訳
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/a53d8588-e2e6-4821-9e81-e32e2e7ea419.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/90f89bb2-cd42-4eee-b5a1-d3523c20298d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/335d3b25-5f2e-4374-9821-a2b0abd76134.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/bd79b892-ef97-4dbd-9557-08b48ae21415.png)

# 注意事項
1. カスタムドメイン・SSL証明書は削除しないこと
(WAFからの通信が通らなくなる)
1. WAFで`/.well-known/acme-challenge/`をブロックしないこと
(Let's Encryptからの証明書有効性確認が失敗する)

以上