HTTP(S)ロードバランサー構築・リージョン超えロードバランシング

東京リージョンリリースの噂があった頃からGCPをちょっとだけ触っていたのですが、業務も含めメインはAWSでした。
この度GCP検証でまとまった時間が取れたため、初投稿となりますが以下に記載させて頂きます。
マサカリはやさしく投げてくださいｗ

クラウドはAWSの方が長く触っていることもあり、GCPでのHTTP(S)ロードバランサー構築に必要な工程をAWSでのALB/CLB構築工程に当てはめて記載しました。

なお、構築する中でAWSで言うところのAutoScalingの設定も必要だったのでまとめて記載します。(1.～5.)
そして、リージョン超えロードバランシングはGCPにしか出来ない機能なので重点的に記載します。(6.以降～)

※あらかじめVMインスタンスがある前提です。
　1.～5.の工程まで『Google Compute Engine(GCE)』内での操作になります。

![compute_engine.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/44044f7e-177d-fa33-46b3-cd6b2b3e8d7d.png)

下記の手順は、4.インスタンステンプレートの作成時に起動イメージを指定するのですが、
前工程として1～3が必要となっています。

# 1.スナップショット取得
　AWSでは可能な3.のイメージ作成を最初から取得できれば良いのですが、GCPでは2.のディスク作成、またそのためにスナップショット取得が必要になります。最終的に各リージョンで起動させたいVMインスタンスのスナップショットを取得しましょう。

![snapshot.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/f04541f2-c68a-61c1-a437-596ed2800fb7.png)


# 2.ディスク作成
　続いてディスクの作成です。
　先ほど取得したスナップショットを[ソースの種類]>[ソーススナップショット]を選択した後に、[ソース スナップショット]から指定します。
　※お気づきの方もいらっしゃると思いますが、左欄の[ディスク]をクリックすると先ほどスナップショットを取得したVMインスタンスのディスクが既にあります。後述するのですが、ワケあってこの工程を実施しています。
　※また、ゾーンの指定があるのですがここは何を選んでも大丈夫なのでは、、と思っています。念のためVMインスタンスと同じリージョンにしました。

![disk.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/128d725a-e0e3-ccb2-fd7c-69703b45e51a.png)

# 3.イメージ作成(AWSでのAMI取得と同義)
　はい、やっとここまで来ました。
　ここで2.で作成したディスクを指定するのですが、注意書きで『VMインスタンスに関連付けられているディスクからイメージを作成することはできません』と書かれている通り、2.でディスクを明示的に作成しなかったものは選択できません。
　この辺はAWSのAMI取得と大きな違いがあると思いました。
　※ソースの指定で[CloudStorageファイル]を指定することもできるのですが、こちらはまだ試していません。。

![image.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/d91160ab-3031-bf53-2de1-9e9f0380ef5d.png)

# 4.インスタンステンプレート(AWSでのAutoScalingの起動設定と同義)
　余計な切り分けポイントを増やさないために権限はゆるゆるにしました。(たいしたデータ入ってないし大丈夫、大丈夫ｗ)
　下部の[管理、ディスク、ネットワーキング、SSH 認証鍵]もデフォルトでOKです。
　※外部IPが自動で割当らなかったらすいません。エフェメラルになっていればOKです。

![instance-template.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/b3be0389-660f-1d10-c8cd-664f5e016dc7.png)

　ブートディスクの指定は以下のようになります。ここで3.にて作成したイメージを指定します。

![boot-image.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/a8a14806-53f8-4115-4fb9-451bd611e5f1.png)

# 5.インスタンスグループ作成(AWSでのAutoScalingグループ設定と同義)
　最後に4.で作成したインスタンステンプレートをインスタンスグループに割り当てます。
　実は、[既存のインスタンスを選択]という選択肢もあるのですが、こちらをクリックすると「使用できるインスタンスがありません」と出力されるので[インスタンステンプレートを使用]を選んだという背景があります。

![instance-group1.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/58726d05-689d-bf91-aa2f-21342f916526.png)

　※マルチゾーンを選択するとリージョン内で各ゾーンに分散可能です。(AWSで言うところのAZ)
　　東京リージョンはa,b,cの3つのゾーンがあります。(AWSの東京リージョンのAZはa,cの2つ)

　まだ続きがあって、自動スケーリングの台数や閾値指定など色々あるのですが、リージョン超えロードバランシングの確認には支障が無いものの、今後の負荷試験を考慮してオンにしました。
　インスタンスの最小値、最大値を1にしておけば台数が増えて料金がかかるといったことも発生しません。
　※負荷試験の際は最大値を増やしていきます。

![instance-group2.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/971087ad-77b2-47c4-a1c4-e06b9226dfaa.png)

　ヘルスチェックも中身はデフォルトです。

![healthcheck.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/2efa0511-5f12-688d-1343-64b38e198b35.png)

　そうすると値が厳しすぎると注意書きが出てきたので指定値に合わせました。

![healthcheck2.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/66058d81-a94a-c506-f7e4-12d17208a195.png)

　VMインスタンス画面に自動でインスタンスが立ち上がっていればOKです。
　インスタンス名の末尾にランダムで文字列入ります。

![vm-instance-check.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/aaf846ec-2d8a-04d9-be15-a8d97a3e38a3.png)

# 6.HTTP(S)ロードバランサー構築
　やっとタイトルの登場です。
　ここからは『ネットワーキング』内での操作になります。

![networking.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/50e76899-23b7-f06c-6263-d585c0702336.png)

　負荷分散の中にもTCP負荷分散やUDP負荷分散がありますが、HTTP(S)負荷分散を選択します。
　(いわずもがなですが、、)

![loadbalance.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/118d42f3-b5dc-f3e7-f8b5-5f95ef54c6f5.png)

　この3つを作成しないと最終的に機能しません。

![loadbalance-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/78740224-96e5-edab-61ae-f5cbdd1f7087.png)

## 6-1.バックエンドの設定
　ロードバランサー配下の転送先になります。5.で作成したインスタンスグループを選択します。
　ここではリージョン超え分散を実現するために、tokyoとus-eastのインスタンスグループを紐付けました。
　(ずっとtokyoという名前で記述しておりましたが、us-eastというものも同様に作成しております。)

![http-tokyo.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/b9ba7632-baf5-7381-423f-a7b8714e9f66.png)

## 6-2.ホストのパスとルール
　ロードバランサーに払い出される一つのIPアドレスに対して、柔軟に設定することが可能でした。

■異なるURLに対してそれぞれのバックエンドに振り分ける(VirtualDomain的な動き)
tokyo.ほげほげ.com➝バックエンド：http-tokyo
us-east.ほげほげ.com➝バックエンド：http-us-east

■同じURLに対してパスを指定することにより、それぞれのバックエンドに振り分ける(AWSのALB的な動き)
test.ほげほげ.com/tokyo/* ➝バックエンド：http-tokyo
test.ほげほげ.com/us-east/* ➝バックエンド：http-us-east
あとは、どれにも一致しなかった時のバックエンドも指定できます。(デフォルトで存在します。)➝バックエンド：http-tokyo

設定は、こんな感じになります。

![loadbalance-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/c2dbc80a-3b13-a64b-3395-3a533a188666.png)

~~ひとつ想定外だったのが、同じURL・同じパスに対してリージョン間で分散するためのバックエンド設定ができなかったこと。(設定入れると怒られました。。)~~
が、これも得た情報だと指定したリージョンで処理できなくなったら、よしなに他リージョンに転送してくれる、もしくは近いリージョンを判断して転送してくれるとか・・今後の負荷試験が楽しみです。

【2/3追記】
完全に誤ってました。↑の設定は可能です！！

私が設定できない！と記載していた原因は、バックエンドの設定を個別に作成していて(http-tokyoやhttp-us-east)、同じURL・パスに対して、2つのバックエンドの設定をぶら下げようとしていたからでした。。orz
なので、同じバックエンドの設定で(下記の例だとhttp-api)配下に2つのインスタンスグループ(instance-group-tokyo,instance-group-us-east)を指定すれば設定可能でした。(http-webも同様の設定です。)

![6-1-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/385cf671-8309-e8da-86ab-0f0224050297.png)

※(2017/02/03)
　バックエンドの設定画面で『バックエンドバケットを作成または選択』が設定できるようになってました。
　GCSの静的コンテンツを指定する際に利用するのかなと思います。(余談です。)

ということで以下の設定が可能となりました。

![6-2-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/f6305ad6-5b1b-afad-f80e-244a4fc81e8a.png)

これで、test.ほげほげ.com/* や/web/* , /api/* というアクセスをすれば、
tokyoリージョンに近ければ ➝バックエンド：http-tokyoに
us-eastリージョンに近ければ➝バックエンド：http-us-eastになるはずです。(動作確認結果は、7-1.)

## 6-3.フロントエンドの設定
　こちらはロードバランサーのインターネット側の設定です。デフォルトでOKです。
　※HTTPSを使用したい場合は証明書の用意が必要です。
　グローバルIPが払い出されますので、上記URLのAレコード追加の際に必要になるため控えておきましょう。

![loadbalance-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/8ef22099-b949-f5a6-0c75-5a06e4af9e53.png)

# 7.リージョン超えロードバランシング動作確認
　実際にやってみた
　※アクセスログを見るとなお良し。

tokyo.ほげほげ.com→バックエンド：http-tokyo
![url_tokyo.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/015a7dd7-cdd4-e30b-eac6-f9fd4f8fd16e.png)

us-east.ほげほげ.com→バックエンド：http-us-east
![url_us-east.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/dfc70175-9524-b3ec-e4be-1699d0d3c628.png)

test.ほげほげ.com/tokyo/* →バックエンド：http-tokyo
![url_test-tokyo.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/8d938c67-ae10-ff84-2edf-1d8d455d7879.png)

test.ほげほげ.com/us-east/* →バックエンド：http-us-east
![url_test-us-east.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/12990d0f-4d8c-1b73-0135-395a9700597f.png)

どれにも一致しなかった時
![url_default.PNG](https://qiita-image-store.s3.amazonaws.com/0/133856/0cebff74-66f6-6319-101d-d232844c2eb9.png)

全て想定通りの動きになりましたね！
1つのロードバランサーで複数のリージョンに分散できることが確認できました。

## 7.1リージョン超えロードバランシング動作確認(その2)

アクセス元の確認と、手間を省くためcurlで確認しました。

■asia-east(台湾)リージョンからのアクセス

```
[XXX@instance-asia-east ~]$ curl "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google"
projects/xxxxxxxxxxxx/zones/asia-east1-b

[XXX@instance-asia-east ~]$ curl http://test.ほげほげ.com/
This is Tokyo page.
```

■us-west(オレゴン)リージョンからのアクセス

```
[XXX@instance-us-west ~]$ curl "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google"
projects/xxxxxxxxxxxx/zones/us-west1-b

[XXX@instance-us-west ~]$ curl http://test.ほげほげ.com/
This is US-east page.
```

できました。。
やっとやりたいことができました。

これができればかなり実用的ですし、あとは負荷試験次第です。
※負荷をかける側の準備で手間取ってます。。

--------------------------------------------
<所感>
ロードバランサーに割り当てられるIPアドレスたった1つでさまざまな処理をしていることから
どこまで負荷に耐えられるか非常に気になります。

ということで、次回はHTTP(S)ロードバランサーに高負荷をかけた時の検証結果を記載予定です。
AWSのロードバランサー(ALB/ELB)の場合、スケールアウトするのに時間がかかるため、
GCPのHTTP(S)ロードバランサーが1つでどれだけ処理できるのか検証結果が楽しみです。

(100万/秒処理できるんだとか！？)
https://cloudplatform.googleblog.com/2013/11/compute-engine-load-balancing-hits-1-million-requests-per-second.html

--------------------------------------------
【誤字脱字修正】
・エフェラメル→エフェメラル
・VirtualServer→VirtualDomain
・2つ目の動作確認画面
　test.ほげほげ.com/us-east/* →バックエンド：http-us-east
　↓
　us-east.ほげほげ.com→バックエンド：http-us-east

(2017/2/3)
・バックエンド設定全般の修正