HTTP LBにLet's EncryptでSSL設定したよ


とりあえずHTTP LBとSSLを試したいという欲求のもと、試しました。
別にLBである必要はないけどやりたいからやりました。

すでに立ててたowncloudをバックエンドにします。
その時の記事は[コチラ](http://qiita.com/tora470/items/0917b6d137712b9535be)

今回の要素としてはこんな感じです。

- Google Cloud Platform
	- Compute Engine
	- Cloud Storage
	- HTTP Load Balancer
- Docker
	- Docker Compose
- Let's Encrypt


### インスタンスグループ作成

バックエンドにするためにグループ作ります。

```pc
gcloud compute instance-groups unmanaged create "owncloud-group" --zone "asia-east1-a"

gcloud compute instance-groups unmanaged add-instances "owncloud-group" \
    --zone "asia-east1-a" \
    --instances "owncloud-1-vm"
```

## ロードバランサーの設定

とりあえずHTTPのみ有効にしときましょう。
コマンドのっけようと思ったんだけど、LBの画面はコマンドラインの生成をしてくれないので画面のSSいれます。

もうできちゃってますけど、ロードバランサーの作成

![ネットワーキング_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/cc457e48-41ae-2e56-3e8e-9fe317e68ddc.png "ネットワーキング_-_ragnarok.png")

HTTP(S) 負荷分散の設定を開始

![ネットワーキング_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/66ab0934-2301-1a38-f369-7fa4bd914ccc.png "ネットワーキング_-_ragnarok.png")

上から順に設定していきます。

![ネットワーキング_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/caf728c7-0905-480a-ece4-12da31898bee.png "ネットワーキング_-_ragnarok.png")

バックエンドサービス作ります。
さっき作ったインスタンスグループを入れて下さい。
あとは基本デフォルトで問題ないはず。
ヘルスチェックも80番ポートのチェックしときましょう。

![ネットワーキング_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/57a8a27c-b551-215e-6e61-211d16bcc928.png "ネットワーキング_-_ragnarok.png")

パスのルールとかはとりあず全部通しとけばいいです。
カスタマイズしたい人はどうぞ。
フロントエンドの設定でとりあえずHTTPだけなので、そのまんまで良いですけど、ドメインのAレコード設定しなきゃいけないのでIPはエフェメラルじゃなくて静的IPを振ってあげましょう。

![ネットワーキング_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/301a95cd-266e-8097-7dd2-14f54f4ec056.png "ネットワーキング_-_ragnarok.png")

これで一旦終わり。

## Let's Encrypt

証明書作りましょう。
今回は他に実行する場所もないのでowncloud動かしてるサーバ上で実行します。
更新の自動化もしちゃいます。

### Certbotインストール

https://github.com/certbot/certbot

### 証明書の作成

基本は[総合ポータル](https://letsencrypt.jp/usage/)呼んでやれば問題なしです。
ただ、最初書いてるとおり`standalone`でやったんですがサーバ止めろと言われでもサーバ動かしてないといけなくてツラくてどうしようもなくて`webroot`にしました。
証明書作成できればいいんです。

webrootについては[こちら](https://letsencrypt.jp/docs/using.html#webroot)を見てください。

```host
certbot-auto certonly --webroot -w WEBROOT_DIR -m MAIL_ADDRESS -d DOMAIN --agree-tos
```

`MAIL_ADDRESS`にはドメインの管理用のメールアドレス、`DOMAIN`は証明書を作成するドメインを指定してください。
これで証明書ができます。
別にこのowncloudサーバに直接インストールするわけではないので、`WEBROOT_DIR`は書き込み可能な場所ならどこでもいいと思います。

`/etc/letsencrypt/`に証明書吐き出されてるので後で使います。

## LBの設定

LBの設定をしましょう。

まずは証明書リソースの作成

```host
sudo gcloud compute ssl-certificates create owncloud-cert \
    --certificate /etc/letsencrypt/live/DOMAIN/cert.pem \
    --private-key /etc/letsencrypt/live/DOMAIN/privkey.pem \
    --description "owncloud certification."
```

んで、LBのターゲットプロキシに証明書を設定

```host
gcloud compute target-https-proxies create owncloud-https-lb-target-proxy \
    --ssl-certificate owncloud-cert \
    --url-map owncloud-http-lb
```

ああ、あとフロントエンドの設定もHTTPのみ設定してたんでHTTPSを追加しときましょう。
HTTPSオンリーにしてHTTPがいらなければHTTPの方は消して下さい。

## 証明書の更新を自動化

Let's Encryptの証明書は3ヶ月で切れるので、更新を自動化しとくといいです。

たぶんこんな感じで行けると思います。

```host
certbot-auto renew
gcloud compute ssl-certificates update owncloud-cert \
    --certificate /etc/letsencrypt/live/DOMAIN/cert.pem \
    --private-key /etc/letsencrypt/live/DOMAIN/privkey.pem \
    --description "owncloud certification."
```

更新されてなかったらgcloudも実行しないようにしといた方がいい気もする。

## まとめ

HTTP LB、ほとんど使わなくても素で18ドルくらいかかります。
なので今回構築だけしてSSLのインストールして満足したので消しましたｗ