BluemixでDiegoを試してみる

Bluemixでこっそりと大きな変更が行われたことに気づいてしまったので、せっかくなので検証し、投稿してみました。

# はじめに
最近Bluemixのブログを確認していると、以下の記事を発見：

Bluemix Cloud Foundry upgrading from DEA to Diego architecture
https://www.ibm.com/blogs/bluemix/2016/11/bluemix-cloud-foundry-upgrading-dea-diego-architecture/

11月中旬からいつの間にかDiegoをサポートするようになったのですね。
是非とも試してみたいということで、早速動かしてみました。

Diegoについては以下の資料を参考に勉強しました:
DEAがサポートされなくなると聞いてDiego についてちょっとまとめてみた 
http://www.slideshare.net/takehikoamano/garden-introduction-for-dea-users-public

# Diegoを使う前準備
Cloud Foundryコマンドライン・ツールがPCに導入されている前提で話を進めます。

Diegoを利用する前に、現時点ではDiego-Enablerプラグインが必要です。
そのためには事前にプラグイン・リポジトリーが登録されている必要があります。cf list-plugin-reposコマンドを打ち、http://plugins.cloudfoundry.org にあたるリポジトリーが登録されていることを確認します：

>$ cf list-plugin-repos
OK
>
リポジトリー名   URL
CF-Community     http://plugins.cloudfoundry.org
bluemix          http://plugins.ng.bluemix.net/
BluemixAdmin     https://console.w3ibm.bluemix.net/cli

リポジトリーが登録されていれば準備は完了。cf install-pluginコマンドで実際にDiego-Enablerプラグインを導入します。

>$ cf install-plugin Diego-Enabler -r CF-Community
>
**Attention: Plugins are binaries written by potentially untrusted authors. Install and use plugins at your own risk.**
>
Do you want to install the plugin Diego-Enabler? (y or n)> y
Looking up 'Diego-Enabler' from repository 'CF-Community'
10370188 bytes downloaded...
Installing plugin diego-enabler_darwin_amd64...
OK
Plugin Diego-Enabler v1.2.2 successfully installed.


# Diegoを利用してみる
以下の順番で、まずは通常どおりアプリをプッシュします：

> $ cf push -p ~/Downloads/snoop.war diego-test-01
XXXX@gmail.com としてアプリ diego-test-01 を組織 
XXXX@gmail.com / スペース dev 内に作成しています...
:
要求された状態: started
インスタンス: 1/1
使用: 1G x 1 インスタンス
URL: diego-test-01.mybluemix.net
最終アップロード日時: Tue Dec 6 11:18:11 UTC 2016
スタック: cflinuxfs2
ビルドパック: Liberty for Java(TM) (WAR, liberty-16.0.1_3, buildpack-v3.5-20161114-1152, ibmjdk-1.8.0_20161019, env)
>
状態   開始日時                 CPU      メモリー         ディスク           詳細
\#0   実行   2016-12-06 08:19:03 PM   229.0%   1G の中の 185M   1G の中の 188.5M

この状態では、DiegoではなくDEAアーキテクチャーで稼働しています。以下のコマンドで有効でないことが確認できます：

> #Diegoランタイムの一覧を取得
$ cf diego-apps
Getting apps on the Diego runtime as XXXX@gmail.com...
OK
>
name   space   org
#DEAランタイムの一覧を取得
$ cf dea-apps
Getting apps on the DEA runtime as XXXX@gmail.com...
OK
>
name            space   org  
diego-test-01   dev     XXXX@gmail.com 
># アプリに対しDiegoが有効かどうかを確認
$ cf has-diego-enabled diego-test-01
false

Diegoを有効化するために、以下のコマンドを実行します:
>$ cf enable-diego diego-test-01
Setting diego-test-01 Diego support to true
OK
>
Verifying diego-test-01 Diego support is set to true
OK

上記のコマンドで準備は完了です。再度アプリケーションをプッシュしてDiegoランタイムに載せ替えます：

2016/12/13 更新
再度アプリケーションのプッシュを行わなくても、再起動だけで問題ないようです。
この記事ではプッシュ時のシーケンスの違いも見たかったので再度アプリケーションをプッシュした次第です。

>$ cf push -p ~/Downloads/snoop.war diego-test-01
XXXX@gmail.com として組織 XXXX@gmail.com / スペース dev 内のアプリ diego-test-01 を更新しています...
OK
:
XXXX@gmail.com として組織 XXXX@gmail.com / スペース dev 内のアプリ diego-test-01 を開始しています...
Downloading sdk-for-nodejs_v3_8-20161006-1211...
Downloading python_buildpack...
Downloading go_buildpack...
Downloading staticfile_buildpack...
Downloaded go_buildpack
Downloading binary_buildpack...
Downloaded xpages_buildpack_v1_0_0-20160310-1442
Downloading dotnet-core_v1_0-20160826-1345...
Downloaded sdk-for-nodejs_v3_8-20161006-1211
Downloaded python_buildpack
Downloading swift_buildpack_v2_0_1-20161103-0928...
Downloaded staticfile_buildpack
Downloading swift_buildpack...
Downloaded dotnet-core_v1_0-20160826-1345
Downloading liberty-for-java...
Downloaded swift_buildpack_v2_0_1-20161103-0928
Downloaded binary_buildpack
Downloading dotnet-core...
Downloading sdk-for-nodejs...
Downloaded swift_buildpack
Downloading xpages_buildpack...
Downloaded liberty-for-java_v3_4_1-20161030-2241
Downloading php_buildpack...
Downloaded sdk-for-nodejs
Downloaded liberty-for-java
Downloaded xpages_buildpack
Downloading noop-buildpack...
Downloading ruby_buildpack...
Downloaded php_buildpack
Downloading nodejs_buildpack...
Downloaded java_buildpack
Downloaded noop-buildpack
Downloaded liberty-for-java_v2_3-20151208-1311
Downloaded ruby_buildpack
Downloaded nodejs_buildpack
Creating container
Successfully created container
Downloading app package...
Downloaded app package (6.1K)
Downloading build artifacts cache...
Downloaded build artifacts cache (108B)
Staging...
-----> Retrieving IBM 1.8.0_20161019 JRE (ibm-java-jre-8.0-3.20-pxa6480sr3fp20-20161019_02-cloud.tgz) ... (0.0s)
         Expanding JRE to .java ... (0.8s)
:
要求された状態: started
インスタンス: 1/1
使用: 1G x 1 インスタンス
URL: diego-test-01.mybluemix.net
最終アップロード日時: Tue Dec 6 11:40:49 UTC 2016
スタック: cflinuxfs2
ビルドパック: Liberty for Java(TM) (WAR, liberty-16.0.1_3, buildpack-v3.5-20161114-1152, ibmjdk-1.8.0_20161019, env)
>
状態   開始日時                 CPU    メモリー           ディスク           詳細
\#0   実行   2016-12-06 08:41:42 PM   0.0%   1G の中の 176.2M   1G の中の 189.4M

おお、シーケンスが変わっている。

# 結局何が変わったか確認してみる
で、結局Diegoに変わって何が嬉しいのか?ですが、一般ユーザーのレベルだと真っ先に浮かぶのがランタイムへの直接SSHログインできることです。

>$ cf ssh-enabled diego-test-01
次のものに対して SSH サポートは有効になっています: 'diego-test-01'

デフォルト有効になっているようですので、そのままログインしてみたいと思います。

>$ cf ssh diego-test-01
vcap@73c5af71-0b9c-47bd-6db1-cfe31862e0a3:~$printenv
CF_INSTANCE_ADDR=169.45.162.6:64677
BLUEMIX_REGION=ibm:yp:us-south
:
CF_INSTANCE_IP=169.45.162.6
CF_INSTANCE_INDEX=0
:

おお、簡単にログインできてしまいました!!

なかなか感動が伝わりにくいかと思いますが、これまでBluemixでは、"cf set-env BLUEMIX_APP_MGMT_ENABLE shell"のように環境変数を指定してから、再ステージを行うと、"https://<アプリの経路>/bluemix-debug/shell"にアクセスすることでWebブラウザベースでランタイムにログインするのが正当なやり方でした。ただし、制約事項がいくつかあり、

- 使用できるのはLiberty for JavaかIBM SDK for Node.jsのいずれかである
- インスタンス数は1つでなくてはならない
- ターミナルのコピーはできるが、ペーストができない

といった残念仕様。。。しかし今回の基盤のアップデートは(Swiftが動かないらしいが)どの言語のビルドパックを使ったとしてもログインできるし、複数インスタンスで構成されていてもそれぞれにログインできるということです。

例えば、以下のようにインスタンスを２つにして

>$ cf scale diego-test-01 -i 2
XXXX@gmail.com として組織 XXXX@gmail.com / スペース dev 内のアプリ diego-test-01 をスケーリングしています...
OK

それぞれにログインするには-iオプションでインデックスをつければ良いです。

>$ cf ssh diego-test-01 -i 1
vcap@7fd88bbd-6ffe-4c8a-5e95-4a22b0257c89:~$ printenv
CF_INSTANCE_ADDR=184.172.114.167:60044
BLUEMIX_REGION=ibm:yp:us-south
:
CF_INSTANCE_IP=184.172.114.167
CF_INSTANCE_INDEX=1
:

また、以下のように直接scpコマンドなどを使うことも可能です

># アップロードしたいファイルを用意
$ cat hello.txt 
hello
# アプリのIDを確認
$ cf app diego-test-01 --guid
0394c7c5-4754-45e8-833f-a97dbdc63a78
# sshクライアントのワンタイム・パスワードを作成
$ cf ssh-code
<パスワード>
# scpコマンドでファイルを送信
$ scp -P 2222 -o User=cf:0394c7c5-4754-45e8-833f-a97dbdc63a78/0 hello.txt ssh.ng.bluemix.net:/tmp/
cf:0394c7c5-4754-45e8-833f-a97@ssh.ng.bluemix.net's password: <パスワードを入力>
hello.txt                                                                                                                             100%    6     0.0KB/s   00:00 

実際にログインしてみれば、ファイルがランタイム上に配布されていることが確認できます。

> $ cf ssh diego-test-01 -i 0
vcap@73c5af71-0b9c-47bd-6db1-cfe31862e0a3:~$ cat /tmp/hello.txt 
hello

今までちょっとしたファイルの変更・差し替えは面倒でしたが、静的なファイルの一斉配布など、これで運用も楽になりそうです。

#終わりに
今回はばっと試しただけですが、次回はこの機能を利用して色々試してみたいと思います。