Google Cloud Platformでの独自ドメイン関連まとめ

ただのメモ書き。

|略語|サービス|備考|
|:--|-------|----|
|GCP|Google Cloud Platform||
|GAE|Google App Engine|PaaS|
|GCE|Google Compute Engine|IaaS|
|GCS|Google Cloud Storage||

# 独自ドメイン

~~Google Domainsはまだ日本の住所だと契約できなかったので、適当に他のレジストラで契約する。~~
DNS設定を触れるようになったら、**Search Consoleで所有権の確認をしておくと良い**。

サブドメインを利用すれば、GCE/GAE/GCSで同じ親ドメインで運用可能。
GCE内ではバーチャルドメインでサブドメイン増やし放題。
GCSはルートドメインでの運用はできない（はず）。というか静的ファイルしか置けないので…。

流石に独自ドメイン設定の詳細は既に情報がたくさんあるのでググろう。

- GCE：インスタンスを立ち上げる際、静的IPを予約しておく。DNSのAレコードにそのIPを追加。サブドメインはバーチャルホストを使い、CNAMEで親ドメインへ向ける。メールの話はこちら→http://qiita.com/yukari-n/items/45624096582111dd25b9
- GAE：サブドメインで利用したい場合は、 *認証から* DNS設定までサブドメインで。AレコードとAAAAレコードを指示通りに追加。
- GCS：サブドメインのバケットを作成し、DNS設定で`c.storage.googleapis.com`へ向ける。あとは中身を一般公開するだけ。

# SSL化

## Google Compute Engine

### SSLの有効化

Debian/Apache2.4.10の時の情報ですが、だいたい変わっていないかと。

1. mod_sslをインストール
2. <kbd>sudo a2enmod ssl</kbd>でSSLを有効化（この時点でhttps://でアクセスしたときのブラウザのエラーが変わる）
3. Apache2.confで `LoadModule ssl_module modules/mod_ssl.so` しておく
4. <kbd>sudo a2ensite default-ssl</kbd>で読み込ませる設定を指定（confの名前は任意）
5. （申請後）/etc/apache2/sites-available/default-ssl.confに、各種.pemを読み込ませる記述を追加
6. Apacheを再起動
7. CSSなどが読み込まれなくなっった場合は、http://で読み込んでいるものが無いかチェック＆キャッシュを削除。http://でもSSLのファイルにリダイレクトしてくれるCDNもあるけど、ブラウザが読み込みブロックしている場合がある

```default-ssl.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
```

### 申請

今回は[Let's Encrypt](https://letsencrypt.org/)を使います。
サブドメインのは親ドメインのを発行しておくと楽~~、というかサブドメインのみ取得だと、親ドメインがブラウザ側にINVALIDな証明書だと思われてしまう事がある~~[^1]。

[^1]: 何故か一部のサブドメインを有効化すると、そのドメインの中身が親ドメインのサイトに表示されてしまう謎現象が起こっていた。証明書はその一環で読み込まれたもののキャッシュだけが残っていたらしい。結局、設定ファイルの名前が悪かった。https://utano.jp/entry/2016/10/amazon-linux-apache-24-virtualhost/

```
git clone https://github.com/certbot/certbot.git
cd certbot
./certbot-auto certonly -a standalone
```

の後でドメインを複数入力できるので、親ドメインを含めてまとめて申請する。

>You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/example.com.conf)
It contains these names: example.com
You requested these names for the new certificate: example.com,
sub1.example.com, sub2.example.com.
Do you want to expand and replace this existing certificate with the new
certificate?

というメッセージが出るので(E)xpandを選ぶ。

バーチャルホストのポート番号の変更と設定のリロードを忘れない。

### 更新

cloneしたcertbotフォルダで

```
sudo ./certbot-auto renew
```

Apacheやnginxなどサーバーが動いていると更新できないので止めてから実行する。

## Google App Engine

Googleが無料で自動更新してくれるようになりました。
http://www.publickey1.jp/blog/17/google_app_engine_managed_ssl.html

―――――ここから古い内容―――――

以下の記事の方法でできた。

[GAEでSSLの設定（Let’s Encrypt の導入備忘録）](http://blog1.erp2py.com/2016/06/gaessllets-encrypt.html)

但し、cloneするのは新しいcertbotの方が良いと思います。

`git clone https://github.com/certbot/certbot`

`sudo ./certbot-auto -a manual certonly`

認証ファイルを置く作業が面倒だが、とりあえず認証できればよろしい。（ちなみに、上記ページのハンドラではリダイレクトがうまくいかなかった）

```app.yaml
handlers:
- url: /.well-known/acme-challenge/?.*
  script: challenge.txt
```

この場合はルートのchallenge.txtに認証情報を置く。
このハンドラでもうまく行かない（パイソンでは500エラーが出る）場合は

```app.yaml
- url: /.well-known/acme-challenge/?.*
  static_files: challenge.txt
  upload: challenge.txt
```

「とりあえずGCEで取得する」というやり方も見かけてやってみたが、IPで弾かれてしまうので、ブラウザ上のGAEコンソールでちゃちゃっとやってしまうと良い。
GCEでまとめて取得できたら更新が楽なんだけど、GAEの場合は毎回新規取得する事になるようだ。

―――――ここまで―――――

## Google Cloud Storage

**CNAMEでの転送がHTTPSに対応していないのでまだ無理。**
ロードバランサを噛ませればなんとかなるらしい https://cloud.google.com/storage/docs/hosting-static-website?hl=ja

# 参考

- [Let's encryptで無料のSSL/TLS証明書を取得して独自ドメイン運用のGAEに入れて使う](https://koni.hateblo.jp/entry/2016/06/02/233900)
- [無料で使えるLet's EncryptをGCEに設定しよう](https://www.apps-gcp.com/lets-encrypt/)