GCEでゲロ吐くほど負荷をかける構成の作り方

![virus_outo.png](https://qiita-image-store.s3.amazonaws.com/0/51208/b80c181c-9f87-b11a-e454-212279494812.png)

**Google Cloud Platform(2) Advent Calendar 2016** 1日目を担当する[kumanoryo](https://twitter.com/ryok0607)です。

先日、GoogleCloudSQLに限界まで負荷をかけるべく、[こんな記事](http://qiita.com/kumanoryo/items/7141cbe4fe4d0a6f1de4)を書いた時に構築したclient側の手順・ノウハウを本エントリで紹介させてください。

# 構成図
**起動時に自動でターゲットに対して負荷をかけるVM(ComputeEngine)を好きな台数で構築する**構成を構築します。
また、構築作業は**Cloud Console**(Webブラウザ)およびCloud Consoleから起動させる**Cloud Shell**から実施するので、OSやソフトウェアに依存せず作業することができます。
![Untitled (3).png](https://qiita-image-store.s3.amazonaws.com/0/51208/93e034c6-1313-52a8-cefd-76f0185c9fda.png)

# 利用機能・技術要素
- [Google Cloud Platform](https://cloud.google.com/docs/)
  - [Google Cloud Console](https://cloud.google.com/cloud-console/)
  - [Google Cloud Shell](https://cloud.google.com/shell/docs/)  
  - [Google Cloud Deployment Manager](https://cloud.google.com/deployment-manager/docs/)
  - [Google Cloud Storage](https://cloud.google.com/storage/docs/)
  - [Google Compute Engine](https://cloud.google.com/compute/docs/)
      - [Startup Script](https://cloud.google.com/compute/docs/startupscript)
      - [Instance Group] (https://cloud.google.com/compute/docs/instance-groups/)
- [Ansible](https://www.ansible.com/)
- [Packer](https://www.packer.io/)
- [Git](https://git-scm.com/)
- [Docker](https://www.docker.com/)

# 構築手順
## GCP Porjectの作成
**※既に自前でご利用中のGCP Projectをお持ちの方は省略可能です。**

### Google Accountの新規取得
[Googleアカウントの作成](https://accounts.google.com/SignUp?hl=ja)ページでGoogleアカウントを作成します。

### 新規GCP Projectの作成
上記作成したアカウントでログインした状態で[Google Cloud Console](https://console.cloud.google.com/)ページにアクセスします。
アクセス後、`Project`部分をクリックし、`プロジェクトを作成`をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/a4ade6b9-b30c-e4aa-fc8d-acd220743a41.png)
任意のプロジェクト名・プロジェクトIDでGCP Projectを作成してください。

## 請求情報の登録
各機能のAPIを有効にするために必要な手順となります。
**カード情報が必要ですが、無料試用終了後に勝手に有償に移行したり引き落とされるわけではありません。**
無料試用期間終了 or $300使い切った後、アップグレード手続きを行った後に課金運用が発生します。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/e5ca2b90-58db-bb37-c996-b0d07531f5dc.png)

### 無料試用に登録
ブラウザ右上の `無料試用に登録` をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/8c6e0158-4ca5-0658-8485-f99d0bb4e3ab.png)

情報を入力し、`同意して続行`をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/fe6eb095-8398-8d58-855b-733008588c33.png)

口座の種類、名前と住所、カード情報を入力します。個人情報の為スクリーンショットを掲載できず、すいません。
（画面右に記載されているとおり、自動的に請求されることはありません）
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/74f826e9-e0cc-539f-fa08-44682cba0df3.png)

### 請求先アカウントの設定
[お支払い](https://console.developers.google.com/billing)ページで請求先アカウントを有効にしてください。
（こちらも個人情報（請求先アカウントID)が含まれるのでスクリーンショットの掲載ができません。すいません。）

## Cloud Shellの起動
Cloud Console上部にあるCloud Shellボタンを押下して起動してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/8a3c5a27-08f2-4130-f167-c6f2def7d9f4.png)
ブラウザでコマンドラインプロンプトが起動しますので、次以降の手順はコマンドラインプロンプトで実施してください。

## 構築スクリプト群の取得
今回githubにスクリプト一式ご用意させていただきました。
Cloud Shellにgitがinstall済みなので、git cloneしてください。

```shell-session
mkdir -p ~/src/github.com/kumanoryo
cd ~/src/github.com/kumanoryo/
git clone https://github.com/kumanoryo/gero-bench.git
```

## Deployment Managerr APIを有効にする
環境構築に必要なスクリプトを実行する際に、Deployment Managerを使用しているので、実行の際にProjectでAPIを有効にしてやる必要があります。

[Google Cloud Deployment Manager V2 API](https://console.developers.google.com/apis/api/deploymentmanager)ページににアクセスし `有効にする` をクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/e52c0e0d-fb81-4376-7ab2-0e3833010a5c.png)

## GCS bucketの作成
APIを有効にし、deployment managerからGCS bucketが作成できるようにしてから
shell scriptを実行してGCS bucketを作成します。

### Cloud StorageのAPIを有効にする
左のメニューからAPI Manager画面を表示させる。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/dced6bb0-f424-099b-2f87-17b637af8efb.png)

### Google Cloud Storageを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/b074927f-ba50-7cb3-30b1-1cae38ce84f5.png)

### 認証情報入力画面へ遷移する
「認証情報に進む」ボタンを押下する。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/1cdd6930-aa2a-05b4-515e-3f27761716ae.png)

### 認証情報・データの種類の設定
画面のとおり入力し、`必要な認証情報`ボタンを押下する。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/51bbafd2-04f1-0464-3aac-bc81ce3f3439.png)

### 認証情報追加処理の完了
画面の指示に従い `完了` ボタンを押下する。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/be719800-2fa1-3ace-d068-776ea8ff4f65.png)

### startup scriptなどを格納するGCS bucketの作成
shell ｓcriptを実行してbucketを作成します。
以下をCloud Shellで実行してください。

```shell-session
cd ~/src/github.com/kumanoryo/gero-bench
sh scripts/create_bucket.sh
```

実行後、[Storage](https://console.cloud.google.com/storage/browser)のページに移動し
**`PROJECT_ID`-gero-bench** という名前のbucketが作成されていることを確認してください。

## network・firewall ruleの作成
shell scriptを実行してnetworkおよびfirewall ruleを作成します。
以下をCloud Shellで実行してください。

```
cd ~/src/github.com/kumanoryo/gero-bench
sh scripts/create_network.sh
```

実行後、[Network](https://console.cloud.google.com/networking/networks/details/network-gero-bench)ページに移動し
**`network-gero-bench`** が作成されていること、および **`firewall-gero-bench-allow-ssh`** が作成されていることを確認してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/9b5145e2-7c8c-8486-2787-26de16f0485a.png)

## Imageの作成
負荷をかけるclientのVM Imageを作成します。
以下をCloud Shellで実行してください。（そこそこ時間かかります。）

```shell-session
cd ~/src/github.com/kumanoryo/gero-bench
sh scripts/create_image.sh
```

実行後、[Compute Engine - イメージ](https://console.cloud.google.com/compute/images)に移動し**`image-gero-bench-client`** が作成されていることを確認してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/5c699f28-eea4-e695-0015-5851b690438b.png)

## Instance Groupの作成
負荷をかけるVMをInstance Groupで構築・設定します。
この時点でVM自体は構築しません。

```shell-session
cd ~/src/github.com/kumanoryo/gero-bench
sh scripts/create_gero-bench-client.sh 
```

実行後、[Compute Engine - インスタンステンプレート](https://console.cloud.google.com/compute/instanceTemplates/list)に移動し**`template-gero-bench`** が作成されていること
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/f96a130c-b73b-2af2-89ca-1388f6300233.png)

および[Compute Engine - インスタンスグループ](https://console.cloud.google.com/compute/instanceGroups/list)に移動し**`instance-group-manager-gero-bench`** が作成されていることを確認してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/c5caae53-4350-6706-788d-db6ce8c805f8.png)

また、このタイミングでstartup scriptがGCSにデプロイされます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/41b0e8a4-30fe-dda6-b036-4ac528731d00.png)

# 負荷開始(VM構築)
VMを起動させてstartup-scriptより負荷をかけます。
GCSに配置するstartup script [startup.sh](https://github.com/kumanoryo/gero-bench/blob/master/startup-script/start.sh#L12-L21) を弄ることで、sysbenchであったり、apache benchなど任意の負荷試験ツールを実行することが可能です。
起動方法は、インスタンスグループ数を0から任意の数に変更します。
お好みの台数で負荷をかけてください。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/b8e8e152-6ca0-f434-5e96-91f2316d25c2.png)
一応、こちらで準備したスクリプトに関しては終了後GCSにログファイルをcpするようにしています。
負荷試験、ずっと見てるのしんどいのでオススメです。

# 負荷停止(VM削除)
逆にインスタンスの数を0にすることで負荷を中断させることができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/baef01a5-abd9-062e-1443-8726cfd71a59.png)

# VMのマシンスペックを上げたい場合（スケールオーバー）
まず[~src/github.com/kumanoryo/gero-bench/scripts/conf/common.conf](https://github.com/kumanoryo/gero-bench/blob/master/scripts/conf/common.conf#L17)を変更。
次に[Deployment Manager](https://console.cloud.google.com/deployments)のページから**`instance-group-gero-bench`**を削除。
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/18993a46-0ebf-340a-0991-2a3def4dde76.png)

削除後、Instance Groupを再作成してください。

# おわりに
なんやかんやで長くなってしまってすいません。
結果、今年GAリリースされたGCEの機能に関していい感じでまとめられたのではないでしょうか。
無料試用状態では8vCPUが上限なので、課金してガンガン負荷かけちゃいましょう！
それこそ**ゲロ吐くくらい**に！（他の方の環境にかけちゃダメですよ、ゼッタイ！！）

明日(12/2)はstrskさんがGKEに関してなんかしら発表いただけると思います。
[日本有数の動画配信サービス](https://abema.tv/)という大規模環境でバリバリGKE使われているので、**きっと面白いお話が伺えると思います！！**

ということで、お付き合いありがとうございましたー。
メリークリスマス！！