GAE（Google AppEngine）でのカスタムドメインと無料SSL証明書を設定してみた

アプリケーションをGAE（Google AppEngine）で構築し、独自ドメインでアクセスできるように設定してみました。
GAEは、HTTPS通信に必要なSSL証明書を無料で、かつ面倒な更新作業などもフルマネージドしてくれる機能が提供されており、その設定方法も記載しました。管理の煩わしさから解放され、非常に便利です。
下記のような流れで設定していきます。

1.ゾーン追加（CloudDNS）
2.レジストラ登録（各レジストラ）
3.ドメイン所有権の証明（ウェブマスターセントラル、CloudDNS）
4.カスタムドメインの追加（GAE）
5.カスタムドメインのレコード登録（CloudDNS）

※ ドメインは取得している前提です。
※ 以下、スクショは分かりやすくするために hogehoge と書き換えています。

# ゾーン追加
CloudDNSにてゾーンを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/b1d7dae5-9117-7178-a884-a8cd02c8275b.png)

# レジストラの登録
ゾーンを追加した後、下記NSレコードのネームサーバーをレジストラ（お名前.comとか）に登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/bf93ebc9-5894-852b-79a2-ab364c16683e.png)

下記NSレコードをコピーして貼り付けるように指示されます。

```
ns-cloud-a1.googledomains.com.
ns-cloud-a2.googledomains.com.
ns-cloud-a3.googledomains.com.
ns-cloud-a4.googledomains.com.
```

# ドメイン所有権の証明
## サイト追加
ウェブマスターセントラルを利用して、ドメインを所有していることを証明します。 https://www.google.com/webmasters/verification/home?hl=ja&authuser=0
ドメインを選択、「別の方法タグ -> ドメイン名プロバイダ -> その他※」を指定します。ドメインの所有者であることを証明するため、指定された値のDNSレコード（TXT）を設定するように指示されます。この値をメモしておき、画面は閉じずにCloudDNSの画面に移動します。
※ CloudDNSではなく、レジストラのDNSを使う場合は、その他ではなく、例えばonamae.comなどを選択して指示通りに登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/1456504e-25b0-b510-04e4-403fdf46381d.png)

# TXTレコードのCloudDNS登録
ウェブマスターセントラルに表示されていた値を、Cloud DNSで作成したゾーンのTXTレコードに追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/6f827c8d-295b-b347-3e44-45aea4651355.png)

ウェブマスターセントラルに戻り、「確認」ボタンを押します。TXTレコードが反映されて確認がとれれば、証明されたこととなり、下記画面になります。
※ 反映が未だの場合、「プロパティを確認できませんでした」となるので、しばらく時間をおいて「確認」を実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/8f18a81c-d005-3c84-2841-ce04faba02e9.png)

「確認が完了しました。」と表示されれば、正常終了です。ウェブマスターセントラル上のサイトにも確認結果の履歴（成功/失敗）が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/f216bc80-b25d-2f69-9590-eb001165da33.png)

# GAEのカスタムドメイン追加
GAEの各サービスに、カスタムドメインをマッピングさせます。今回はGAEのサービスdefaultにカスタムドメイン（www.hogehoge.com）を設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/17514374-5723-7607-d09b-46b9ab8dea86.png)


AppEngineの設定より、「カスタムドメイン -> カスタムドメインの追加」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/f1efcf7b-7d7b-bd17-097a-de1a7b74694d.png)

使用するドメインを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/7484da2e-1bcb-c69f-5418-e8b5400f7dae.png)

マッピングするドメインを指定し、保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/0caba279-5c5c-0c77-01b7-b8f8d559138c.png)

保存が完了すると、CloudDNSにレコードを登録するように指示されます。レコードの内容をメモしておき、完了を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/34409792-20e2-0801-8db0-61b61ebbfc36.png)

下記のように、GAEのカスタムドメインにwww.hogehoge.comが追加されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/aa8f9c75-9852-b3d3-627f-97ed263e6306.png)


# CloudDNSのレコード登録
ドメインマッピングの保存後にメモしておいたレコード（A、AAAA、CNAME）を登録します。
「レコードセット追加」より、各レコードを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122233/8776e2ab-ea27-6d86-f6b0-da2a8ca80b01.png)


これで http://www.hogehoge.com はGAEの default サービスにマッピングされ、ドメイン名でアクセスできるようになります。
このとき、SSL証明書はGoogleが無料で発行してくれるので、https通信も可能になります。（GAEの設定で、SSLセキュリティ「Googleが自動管理、更新」と表示されていれば、OKです。）SSL証明書はLet's Encryptを使っているようです。また、通常は3か月で更新しなければいけませんが、これもGoogleが自動で更新作業を行ってくれます。面倒な初期設定も煩雑な管理もなく、これはかなり便利です。（マネージドセキュリティを無効にすれば、発行したSSL証明書を利用することもできます。）

ワイルドカードマッピング（*.hogehoge.com）を使って設定すると、サブドメイン名と一致するGAEのサービスがマッピングされます。（例えば、http://console.hogehoge.com はGAEのconsoleサービスにマッピングされることになります。）

ただし、ワイルドカードマッピングはSSL証明書の自動更新機能が利用できません。Let's Encryptが2017年12月にワイルドカード対応するようですので、GAEでの対応はもう少し先になりそうです。現時点では、別途SSL証明書を発行し、アップロードすることでHTTPS通信ができます。

# 参考
参考ドキュメント
ルーティングについて
https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed

カスタムドメインとSSLについて
https://cloud.google.com/appengine/docs/standard/python/console/using-custom-domains-and-ssl