Bluemix Public のスペースにクォータを設定する

Cloud Foundry Command Line Interface (cf CLI)を利用して、Bluemix Public のスペースにクォータを設定してみました。

---

# はじめに

クォータは Bluemix Doc では割り当て量と表現されているのですが、Bluemix Public に関しては組織に対する割り当て量の記載があるのみでスペースに関しては記述がありません。

そこで Cloud Foundry のドキュメントをご覧ください。

Cloud Foundry Documentation - Creating and Modifying Quota Plans
https://docs.cloudfoundry.org/adminguide/quota-plans.html

スペース単位でもクォータが設定できそうですね。
以下では、Bluemix Public でも使えるか確認していきます。

# スペースに設定されたクォータと定義の確認

まずは初期状態でスペースに設定されたクォータと定義を確認してみましょう。

```
$ cf space dev
id@example.com として組織 id@example.com 内のスペース dev の情報を取得しています...
OK

dev                               
      組織:                       id@example.com
      アプリ:                     nodejs
      ドメイン:                   mybluemix.net
      サービス:                   availability-monitoring-auto, Cloudant NoSQL DB, Continuous Delivery, Object Storage
      セキュリティー・グループ:   bluemix_cf_api_4, dns, bluemix_cf_api_3, bluemix_cf_api_1, bluemix_cf_api_2
      スペース割り当て量:
$
```

```
$ cf space-quotas
id@example.com としてスペース割り当て量を取得しています...
OK

名前   合計メモリー   インスタンス・メモリー   経路   サービス・インスタンス   有料プラン   アプリ・インスタンス   経路ポート
$
```

初期状態では設定も定義も無いみたいですね。

# クォータの定義

次は実際にクォータの定義を作ってみます。

参考のため組織のクォータの定義を確認してみます。

```
$ cf quotas
id@example.com として割り当て量を取得しています...
OK

名前     合計メモリー   インスタンス・メモリー   経路   サービス・インスタンス   有料プラン       アプリ・インスタンス   経路ポート
q2GB     2G             2G                       500    10                       許可されました   制限なし               0
q4GB     4G             4G                       500    20                       許可されました   制限なし               0
q8GB     8G             4G                       500    40                       許可されました   制限なし               0
q16GB    16G            4G                       1000   80                       許可されました   制限なし               0
q32GB    32G            4G                       1000   160                      許可されました   制限なし               0
q64GB    64G            4G                       1500   320                      許可されました   制限なし               0
q128GB   128G           8G                       2000   640                      許可されました   制限なし               0
q256GB   256G           8G                       4000   1024                     許可されました   制限なし               0
q512GB   512G           8G                       8000   2000                     許可されました   制限なし               0
qIBM     1G             1G                       100    4                        許可されました   制限なし               0
q256MB   256M           制限なし                 100    100                      不許可           制限なし               0
$
```

q512GB というのがコンソールの「アカウント」>「組織の管理」ページで確認できるあれですね。

折角なので操作をミスしても課金されずに済むような sandbox 用の定義を作りましょう。
インスタンス・メモリーを 512MB に制限して有料プランを不許可にすれば実現できそうな気がします。その他は q512GB の設定を上限にしておきます。

コマンドのヘルプを確認します。

```
$ cf help create-space-quota 
名前:
   create-space-quota - 新しいスペース・リソース割り当て量を定義します

使用法:
   cf create-space-quota QUOTA [-i INSTANCE_MEMORY] [-m MEMORY] [-r ROUTES] [-s SERVICE_INSTANCES] [-a APP_INSTANCES] [--allow-paid-service-plans] [--reserved-route-ports RESERVED_ROUTE_PORTS]

オプション:
   -a                              アプリケーション・インスタンスの合計数 -1 は量に制限がないことを表します。 (デフォルト: 制限なし)
   --allow-paid-service-plans      有料サービス・プランのインスタンスをプロビジョンできます (デフォルト: 不許可)
   -i                              1 つのアプリケーション・インスタンスが占有できる最大メモリー量 (例: 1024M、1G、10G)。 -1 は量に制限がないことを表します。 (デフォルト: 制限なし)
   -m                              1 つのスペースが占有できる合計メモリー量 (例: 1024M、1G、10G)
   -r                              経路の合計数
   --reserved-route-ports          予約されたポートで作成される可能性のある経路の最大数 (デフォルト: 0)
   -s                              サービス・インスタンスの合計数

関連項目:
   quotas, space-quotas
```

では作成します。

```
cf create-space-quota sandbox -i 512M -r 8000 -m 512G -s 2000
id@example.com として組織 id@example.com のスペース割り当て量 sandbox を作成しています...
OK
$ cf space-quotas
id@example.com としてスペース割り当て量を取得しています...
OK

名前      合計メモリー   インスタンス・メモリー   経路   サービス・インスタンス   有料プラン   アプリ・インスタンス   経路ポート
sandbox   512G           512M                     8000   2000                     不許可       制限なし

```

作成できました。

## スペースへの設定

スペース dev に設定して実験していきましょう。

```
cf set-space-quota dev sandbox
id@example.com としてスペース割り当て量 sandbox をスペース dev に割り当てています...
OK
$
```

```
$ cf space dev
id@example.com として組織 id@example.com 内のスペース dev の情報を取得しています...
OK

dev                               
      組織:                       id@example.com
      アプリ:                     nodejs
      ドメイン:                   mybluemix.net
      サービス:                   availability-monitoring-auto, Cloudant NoSQL DB, Continuous Delivery, Object Storage
      セキュリティー・グループ:   bluemix_cf_api_4, dns, bluemix_cf_api_3, bluemix_cf_api_1, bluemix_cf_api_2
      スペース割り当て量:         sandbox (512G メモリー制限, 512M インスタンス・メモリー制限, 8000 経路, 2000 サービス, 有料サービス 不許可, 制限なし アプリのインスタンス制限)
$
```

## 確認

さて、どうでしょうか。
コンソールから確認します。

まずはランタイムのメモリをいじってみます。
512MB から増加させます。

![メモリ増加.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/77847d9a-9cb1-3968-dd88-6eb462ef80c2.png)

このようなエラーになりました。

![メモリ増加エラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/c26ab5dd-d616-8eef-8bcd-5ca7b4c66804.png)

>BXNUI0020E: Cloud Foundry へのコンタクトで問題が発生したため、'nodejs' アプリの設定は更新されませんでした。

それとわかるメッセージではありませんが、256MB への変更は成功しましたので効いていると考えてよいと思います。

次に有料のサービスが作成できるか試してみます。
ちょっと怖いので作成するのは固定の支払いの無い「Push Notifications」にしてみます。

![サービス.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/e521ad87-b9b9-9ffd-2c5e-2771e3858d85.png)

無事にエラーになりました。

![サービス作成エラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/3fbe7091-3a27-a771-fd76-8ee5168e6151.png)

> The service instance cannot be created because paid service plans are not allowed for your space.

こちらのメッセージはそれっぽいですね。

# クォータの定義の更新

定義の更新をしてみます。

ここまでの sandbox の例ではアプリケーション・インスタンスの合計数を無制限にしていますが、1 にすれば確実ですね。そのように変更してみます。

```
$ cf update-space-quota sandbox -a 1
id@example.com としてスペース割り当て量 sandbox を更新しています...
OK
$ cf space-quota sandbox
id@example.com としてスペース割り当て量 sandbox 情報を取得しています...
OK

                             
合計メモリー制限             512G
インスタンス・メモリー制限   512M
経路                         8000
サービス                     2000
非基本サービス               不許可
アプリのインスタンス制限     1
予約された経路ポート
$
```

## 確認

確認します。
インスタンス数3だったアプリケーションを開始してみます。

![インスタンス数制限.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/afc8e7eb-98e5-31c3-e585-439e73686d58.png)

エラーになりました。

![インスタンス数制限エラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/2aa5c85b-f562-0cc0-b79b-a09cce55e162.png)

なお、停止状態であればインスタンス数の変更は制限を超えた値にも可能でした。
開始するときにエラーになるようです。

# 合計メモリー制限の動作

ここまでの例の中で「インスタンス・メモリー制限」と「非基本サービス(有料プラン)」の動作を確認しましたが、「合計メモリー制限」についても確認してみます。

まず、クォータはこのようにしました。

```
$ cf space-quota sandbox
id@example.com としてスペース割り当て量 sandbox 情報を取得しています...
OK

                             
合計メモリー制限             512M
インスタンス・メモリー制限   制限なし
経路                         8000
サービス                     2000
非基本サービス               不許可
アプリのインスタンス制限     制限なし
予約された経路ポート
$
```

コンソールからメモリーを増やします。

![合計メモリー制限でメモリーを増やす.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/c96fb808-3f7e-3eca-3a19-03acd4d1a15d.png)

今回はエラーにならずに更新できました。
開始してみます。

![合計メモリー制限で起動.PNG](https://qiita-image-store.s3.amazonaws.com/0/175677/fdcdc94d-d36c-cf04-a40f-d73f544c3af1.png)

開始時にエラーになるようです。
インスタンス数制限と同様の動きですね。

## 余談: Cloud Foundry アプリの無料枠に関して

従量課金アカウント入りしたのが今月なので手探りなのですが、[Bluemix Doc の料金ページ](https://console.ng.bluemix.net/docs/pricing/index.html) には「Bluemix ランタイムを通して共有される 」とか「すべてのランタイム間で共有」とあるものの、料金カリキュレーターで見積もった結果と、Bluemix Blog の [Bluemix UI Updates: August 2014](https://www.ibm.com/blogs/bluemix/2014/09/bluemix-ui-updates-august-2014/#RuntimeAllowances) の記載を鑑みて、無料枠は Node.js や Liberty for Java といったランタイム(の種別)毎に割り当ててもらえているものと理解しています。(ただし、カリキュレーターにあるようにコミュニティーのビルドパックは一括りで同一枠。たとえば Tomcat と PHP は同じ枠。)

それを踏まえて、私は無料枠で遊ぶにあたり、ランタイムの種別でスペースを分け、ここで試した合計メモリー制限を設定することにしました。
Node.js や Liberty for Java、Community といった名前のスペースを作って、それぞれに合計メモリー制限 512MB と有料プランの制限を設定しています。これで安心！・・・なはず！

コマンドの例

```
$ cf create-space-quota sandbox -r 8000 -m 512M -s 2000
id@example.com として組織 id@example.com のスペース割り当て量 sandbox を作成しています...
OK
$ cf space-quota sandbox
id@example.com としてスペース割り当て量 sandbox 情報を取得しています...
OK

                             
合計メモリー制限             512M
インスタンス・メモリー制限   制限なし
経路                         8000
サービス                     2000
非基本サービス               不許可
アプリのインスタンス制限     制限なし
予約された経路ポート
$ cf create-space "Liberty for Java" -q sandbox
(以下略)
```


# 最後に

スペースへのクォータ設定が使えそうなことがわかりました。
組織に対するクォータ(割り当て量)のほうは、上限ではなく消費量の通知用のトリガーであるとドキュメントにありますが、スペースへのクォータは上限として働くようです。

しかしながら、Bluemix Doc に記述が無いですし、IBM からの各種案内では制限できないようなことが書いていることが多いので実際に運用する場合にはサポートに確認したいところです。

上限としての効き方も今回はコンソールからの確認だけ行いましたが、manifest.yml を使ったデプロイの場合なども確認したいですね。