VagrantでローカルにCloud Foundry v2を構築(2)


さて、挫折しかけたCloud FoundryのシングルVM版をついに起動させることができました([こちらの記事](http://qiita.com/us10096698/items/8e1e995d7bbb591368a6)をご参照ください)。今回は簡単なアプリをデプロイして動かしてみたいと思います。

## SSHログインの設定
Vagrantの機能を使ってSSHログインできるようにしておきます。

```
$ cd path/to/cf-vagrant-installer
$ vagrant ssh-config -host cf-host >> ~/.ssh/config
$ ssh cf-host
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-virtual x86_64)

 * Documentation:  https://help.ubuntu.com/

98 packages can be updated.
41 updates are security updates.

Last login: Thu Jan 31 13:48:53 2013
vagrant@cf:~$
```

## Cloud Foundryコンポーネントの初期化

```
$ cd /vagrant
$ rake cf:init_f_cli
```
## サンプルアプリを動かしてみる

このリポジトリに入っているSinatraのサンプルアプリをPushしてみましょう。Cloud Foundry上にアプリをデプロイして動かすことを"Push"といいます。
`cf`というのはCloud FoundryのCLI (Command Line Interface)です。
v1 APIの時から名前が変わりました(v1のときは`vmc`)。

```
$ cd test/fixtures/apps/sinatra
$ cf push
Using manifest file manifest.yml

Creating hello... OK

Creating route hello.192.168.12.34.xip.io... OK
Binding hello.192.168.12.34.xip.io to hello... OK
Uploading hello... OK
Preparing to start hello... OK
Checking status of app 'hello'...
  0 of 1 instances running (1 starting)
  0 of 1 instances running (1 starting)
  1 of 1 instances running (1 running)
Push successful! App 'hello' available at hello.192.168.12.34.xip.io
```

ホストのブラウザから`http://hello.192.168.12.34.xip.io/`にアクセスしてみることで、動作が確認できます。Cloud Foundry環境変数の出力一覧になっているみたいです。ちなみに環境変数の内容の説明は[公式ドキュメント](http://docs.cloudfoundry.com/docs/using/deploying-apps/environment-variable.html)を参照ください。

## アプリインスタンスに対するコマンドライン操作

[Getting Started](http://docs.cloudfoundry.com/docs/dotcom/getting-started.html)に記載されている代表的なアプリインスタンス操作コマンドの出力を確認してみます。

### 起動中のアプリインスタンスの確認

```
$ cf apps
Getting applications in myspace... OK

name    status    usage      url                       
hello   running   1 x 256M   hello.192.168.12.34.xip.io
```

### 特定のアプリインスタンスのヘルスチェック

```
$ cf health hello
Using manifest file manifest.yml

Getting health status... OK

hello: running
```
###特定のアプリインスタンスのメモリ使用状況を表示

```
$ cf stats hello
Using manifest file manifest.yml

Getting stats for hello... OK

instance   cpu    memory          disk       
#0         0.0%   20.7M of 256M   48.5M of 1G
```
###特定のアプリインスタンスの環境変数とログを表示

```
Using manifest file manifest.yml

Getting logs for hello #0... OK

Reading logs/env.log... OK
TMPDIR=/home/vcap/tmp
VCAP_APP_PORT=61003
VCAP_CONSOLE_IP=0.0.0.0
USER=vcap
VCAP_APPLICATION={"application_users":[],"instance_id":"a67ad5c602427860688260c15b0bd3dc","instance_index":0,"application_version":"339ab2e8-062b-4242-885c-416fe696876c","application_name":"hello","application_uris":["hello.192.168.12.34.xip.io"],"started_at":"2013-11-01 07:00:02 -0700","started_at_timestamp":1383314402,"host":"0.0.0.0","port":61003,"limits":{"mem":256,"disk":1024,"fds":16384},"version":"339ab2e8-062b-4242-885c-416fe696876c","name":"hello","uris":["hello.192.168.12.34.xip.io"],"users":[],"start":"2013-11-01 07:00:02 -0700","state_timestamp":1383314402}
RACK_ENV=production
PATH=/home/vcap/app/bin:/home/vcap/app/vendor/bundle/ruby/1.9.1/bin:/bin:/usr/bin:/bin:/usr/bin
PWD=/home/vcap
LANG=en_US.UTF-8
VCAP_SERVICES={}
HOME=/home/vcap/app
SHLVL=2
GEM_PATH=/home/vcap/app/vendor/bundle/ruby/1.9.1:
PORT=61003
VCAP_APP_HOST=0.0.0.0
MEMORY_LIMIT=256m
VCAP_CONSOLE_PORT=61004
_=/usr/bin/env



Reading logs/staging_task.log... OK
-----> Downloaded app package (4.0K)
Installing ruby.
-----> Using Ruby version: ruby-1.9.2
-----> Installing dependencies using Bundler version 1.3.2
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin --deployment
       Fetching gem metadata from http://rubygems.org/..........
       Fetching gem metadata from http://rubygems.org/..
       Installing rack (1.5.1)
       Installing rack-protection (1.3.2)
       Installing tilt (1.3.3)
       Installing sinatra (1.3.4)
       Using bundler (1.3.2)
       Your bundle is complete! It was installed into ./vendor/bundle
       Cleaning up the bundler cache.



Reading logs/stderr.log... OK
[2013-11-01 14:00:04] INFO  WEBrick 1.3.1
[2013-11-01 14:00:04] INFO  ruby 1.9.2 (2012-04-20) [x86_64-linux]
[2013-11-01 14:00:04] INFO  WEBrick::HTTPServer#start: pid=25 port=61003
192.168.12.1 - - [01/Nov/2013 14:01:19] "GET / HTTP/1.1" 200 1172 0.0018
192.168.12.1 - - [01/Nov/2013 14:01:19] "GET /favicon.ico HTTP/1.1" 404 18 0.0004



Reading logs/stdout.log... OK
```
### 特定のアプリインスタンスを止める

```
$ cf stop hello
Using manifest file manifest.yml

Stopping hello... OK
$ cf apps
Getting applications in myspace... OK

name    status    usage      url                       
hello   stopped   1 x 256M   hello.192.168.12.34.xip.io
```

### アプリを削除する

```
$ cf delete hello
Using manifest file manifest.yml

Really delete hello?> y

Deleting hello... OK
$ cf apps
Getting applications in myspace... OK

No applications.
```


### その他
このアプリでは出力を確認できませんが他にもあります。

* ログをtailして出力 `cf tail appname`
* クラッシュログを表示 `cf crashlogs appname`

もちろん他にもあります。詳細は[cfコマンドのドキュメント](http://docs.cloudfoundry.com/docs/using/managing-apps/cf/)に記載されています。

##アプリ設定ファイルを見てみる
このサンプルアプリの設定ファイルを見てみましょう。デフォルトではアプリのルートディレクトリ直下に`manifest.yml`という名前で置かれています。

```manifest.yml
---
applications:
- name: hello
  memory: 256M
  instances: 1
  host: hello
  domain: 192.168.12.34.xip.io
  path: .
```

各項目の内容は以下です(見りゃ分かるよ、というツッコミが聞こえてきそうですが)。

|key|keyの説明|value|
|----|----|----|
|name|アプリ名|hello|
|memory|使用可能上限メモリ|256M|
|instances|インスタンス数|1|
|host|ホスト名|hello|
|domain|ドメイン名|192.168.12.34.xip.io|
|path|パス|.|

アプリのURLは`hello.192.168.12.34.xip.io`になります。

`manifest.yml`をリネームなり削除して再度`cf push`をすると、Cloud Foundryは対話的にパラメータを聞いてきます。
指定したパラメータは、最後に`manifest.yml`として保存することができます。以下のように指定すれば元々あったものと全く同じ`manifest.yml`ができます。

```
$ mv manifest.yml manifest.yml.backup
$ cf push
Name> hello

Instances> 1

1: 128M
2: 256M
3: 512M
4: 1G
Memory Limit> 2   

Creating hello... OK

1: hello
2: none
Subdomain> 1    

1: 192.168.12.34.xip.io
2: none
Domain> 1                   

Binding hello.192.168.12.34.xip.io to hello... OK

Create services for application?> n

Save configuration?> y

Saving to manifest.yml... OK
Uploading hello... OK
Preparing to start hello... OK
Checking status of app 'hello'...
  0 of 1 instances running (1 starting)
  0 of 1 instances running (1 starting)
  1 of 1 instances running (1 running)
Push successful! App 'hello' available at hello.192.168.12.34.xip.io
```

今日はここまで。
VM動かすまでが予想外に大変でしたので、普通に動いてくれてよかったです。
次はサービスのバインドに挑戦してみたいと思います。