GAEのカスタムドメインにサブドメインを設定する＋CloudflareのDNSを使用するメモ

ちょっとハマったので自分用の備忘録。
タイトルの通りの内容です。

## 1. サブドメインの所有権を証明

GAEの設定＞カスタムドメインのタブから、「カスタムドメインを追加」ボタンを押す
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/acb88ba1-d575-5292-f0a5-3129f8238338.png)

新しいドメインの所有権を証明を押す
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/e44e8fdf-28d1-46a9-d129-068af83419f8.png)

ここに**サブドメインを**入力する。
余談だが、なぜか最初、ここにはネイキッドドメインしか入力できないもんだと勘違いしていた。そんなことはなく、普通にサブドメインも入力できる。
使いたいサブドメインがsub.example.comならsub.example.comと入力する
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/34bd3381-6be6-a1fa-b0db-de3acbe6b0b2.png)

ウェブセンターセントラルに移動する。
2022年5月時点ではドメイン名プロバイダにCloudflareがないので「その他」を選択
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/bd2f9e38-e1dd-d31f-166f-692ccf1f5c3e.png)

TXTレコードの情報が出てくるのでコピー
このウェブセンターセントラルの画面はそのまま開いておくこと。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/4da2018f-4b92-fb51-0ebb-d3c8f2501743.png)

CloudflareのDNS設定画面へ移動。
レコードの追加ボタンを押す。
レコードタイプは「TXT」、使いたいサブドメインがsub.example.comなら名前に「sub」、コンテンツに↑でコピったTXTレコードの値（`google-site-verification=...`みたいな値）を入力
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/5ed57d47-d506-8df7-9e68-2d570b8688a0.png)

ウェブセンターセントラルへ戻り、「確認」ボタンを押す。
ちゃんと設定できていれば速攻でチェックが終了する
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/926f71b5-7cd4-29e8-6aa1-6dfcce3183ce.png)

## 2. サブドメインの設定

GAEのカスタムドメインの追加画面へ戻る。
「使用するドメインを選択」のプルダウンから、↑で設定したカスタムドメインが選べるようになっている。
ので、選ぶ。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/94762f97-54eb-4369-9775-5d52b40d6e81.png)

この後、マッピングするドメインとして、`sub.example.com` と `www.sub.example.com` の２つが入力済みの状態で出てくると思うが、特に何もせずにそのまま進む。
なお、マッピング対象ドメインから`www`付きのやつをここで消してしまった場合、CNAMEの設定先がサブドメインと同じになるため（sub.example.comならsub）、Aレコード・AAAAレコードと重複して登録できなくなり、少なくともCloudflareのDNSを使っている場合は、DNSレコードが設定できなくて、この後詰むことになる。（他のDNSでなら登録できるのかもしれないが、試してないので良く知らない）

AレコードとAAAAレコードとCNAMEレコードの情報が表示される。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/98025f96-5083-d7da-b735-a1ab8099e1e9.png)

↑の情報をコピーしながらCloudflareのDNSに登録していく。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/572b4fa5-d98a-27b6-0eae-44da0f746f93.png)

なお、この↑スクリーンショット上では「プロキシステータス」を「プロキシ済」にしているが、**これは間違いである**。
**プロキシの設定は外して、「DNSのみ」にする必要がある。**
プロキシ設定を施していると、後のマネージド証明書の発行シーンで詰まる。
全部設定するとこんな感じ
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/52beded3-1be2-5e8e-a448-ba94fbd085d4.png)

## 3. 証明書発行を待つ

このあと、GAEによるマネージドの証明書発行処理が走る。
これは結構時間がかかる。
なので、気長に待つ。
なお、上にも書いた通り、Cloudflare DNSを「プロキシ済」に設定している場合、散々待たされた挙句処理が失敗するので注意。

私の場合は、↑でCloudflareを「プロキシ済」にしていて、失敗してからやり直したので、最初から「DNSのみ」で登録していればもっとスムーズに（短時間で）完了するのかもしれない。
ちゃんと計ってはいないけど、「DNSのみ」に設定してから体感で30分～1時間くらいは待った気がする。
発行が終わると「証明書ID」のところに数字が入る。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/6084e123-4ead-6877-d207-021e714f75a0.png)

## 4. dispatch.yamlをdeploy

[ここに書いてある内容](https://cloud.google.com/appengine/docs/flexible/python/reference/dispatch-yaml)に従って、dispatch.yamlを書く。
sub.example.comを相手にするなら以下のような感じ。
`service`のところは実際に使っているGAEのサービス名を記述する。

```yaml
dispatch:
  - url: "*sub.example.com/*"
    service: sub-example
```

書き終わったら`gcloud app deploy dispatch.yaml`でdeployする。
実行時の標準出力例は以下

```sh
> gcloud app deploy dispatch.yaml
Configurations to update:

descriptor:      [/xxx/yyy/zzz/dispatch.yaml]
type:            [routing rules]
target project:  [example]


Do you want to continue (Y/n)?  Y

Waiting for operation [apps/example/operations/87a40077-25a8-4c19-be96-8a05caa4c0f5] to complete...done.                                    
Updating config [dispatch]...done.                                                                                                                

Custom routings have been updated.
```

成功するとGAEの「サービス」メニューで「送信ルート」の欄に↑で記述したルート設定が表示される。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/6b6c11d2-0b69-abf1-99e4-82a03245d463.png)

余談だが、最初、 `dispatch.yaml` はGithubリポに含めて一緒にdeployすれば、GAEのdeploy時に勝手にやってくれるもんだと、何故か勘違いしていた。
このファイル自体は`gcloud app deploy dispatch.yaml` でしか反映できない。
冒頭の公式ドキュメントにもある通り、`dispatch.yaml` はGAEのアプリケーションに対して1つなので、複数サービスを扱う場合は、このファイルをどこかのリポで管理するという発想自体がそもそも多分ちょっとズレている。
まあ代表として複数あるサービスのリポのどこかに置いといてもいいのかもしれないけど。

## 5. CloudflareのSSL設定

[このページ](https://support.cloudflare.com/hc/ja/articles/360020991331-%E3%83%99%E3%83%B3%E3%83%80%E3%83%BC%E5%9B%BA%E6%9C%89%E3%81%AEDNS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92Cloudflare%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)に記載がある通り、GAEをオリジンにする場合、Cloudflare→GAE間もSSL通信が必要になるらしい。
というわけでCloudflareのSSL/TLSメニューに入って、「フル」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392942/e2160350-3da9-de15-77bc-7dd1d9f65828.png)

4.項でちゃんとした証明書が出来てる感じがするので、「フル（厳密）」でも動く気がするが、試してないのでわからない。

## 以上

おわり。