CLIプラグインでBluemixのアプリにssh接続


## 1.  はじめに

Bluemixで作業していると、これもうインスタンスに直接ログインできれば早いのにーと思うことがよくあります。そのような使い方はBluemixの仕様に合わないとしても、デバッグのためにちょっとsshで繋いでコマンドを叩けるといろいろと捗りそうです。

BluemixのベースになっているCloud Foundryでは、以前はCLI(Command Line Interface)でcf tunnel というコマンドが使えて、直接コンテナにログインすることができたと聞きます。しかし、現在のversion 6のCLIではサポートされていません。

SDK for Node.js の環境であれば、ライブ編集のモードをONにしてシェルでのアクセスが可能です。これは非常に便利です。他のランタイムでも同様の機能を使うにはどうすればいいのでしょうか。


## 2.  CF CLIプラグインでコンテナアクセス

コンテナにアクセスできるように作られたビルドパックは存在します。しかしシェルでアクセスすること自体が目的ではなく、あくまでもアプリのデバッグのための手段と考えると、構築済みのインスタンスに手軽にアクセスできることが求められます。

そこで見つけたのは標準のcfコマンドの機能を拡張するプラグイン。Cloud Foundryが公開している[コミュニティプラグイン](http://plugins.cloudfoundry.org/ui/)の一覧にある、cf console というプラグインを使うとコンテナにアクセスできると書かれています。 [tmate.io](http://tmate.io/)という外部のサービスを中継点として、Bluemix上のコンテナと繋がる仕組みのようです。早速試してみしまょう。

![cfconsole.jpg](https://qiita-image-store.s3.amazonaws.com/0/86120/5dafab3d-0d94-7288-a81a-e2f9ab56b410.jpeg)

CLIのプラグインについては、以前の記事 [CLIプラグインでもっと快適にBluemixを操る](http://qiita.com/KenichiSekine/items/021087ece37084a94162) を参照してください。


## 3.  cf consoleのセットアップから接続まで

それでは cf console を導入してみましょう。下記の例は、CF-communityという名前のプラグインリポジトリが設定されている前提です。

```bash:install-plugin
letsfacethefact@instance-1:~/tmp$ cf install-plugin Console -r CF-community
**Attention: Plugins are binaries written by potentially untrusted authors. Install and use plugins at your own r
isk.**
Do you want to install the plugin Console? (y or n)> y
Looking up 'Console' from repository 'CF-community'
7984168 bytes downloaded...
Installing plugin /tmp/cf-plugin-console...
OK
Plugin Console v0.0.0 successfully installed.

letsfacethefact@instance-1:~$ cf plugins
Listing Installed Plugins...
OK
Plugin Name   Version   Command Name   Command Help   
Console       N/A       console        Start a live console   

letsfacethefact@instance-1:~$ 
```

導入ができたので、cf consoleプラグインを使ってBluemix上のコンテナに接続してみましょう。接続先は何でもいいのですが、ここでは下記のようなPHPのインスタンスをターゲットにします。

```bash:PHP

letsfacethefact@instance-1:~$ cf apps
Getting apps in org xxx@xxx.com / space Sandbox as xxx@xxx.com...
OK
name         requested state   instances   memory   disk   urls   
PHPAppUSDC   started           1/1         128M     1G     phpappusdc.mybluemix.net   
letsfacethefact@instance-1:~$ cf app PHPAppUSDC
Showing health and status for app PHPAppUSDC in org xxx@xxx.com / space Sandbox as xxx@xxx.com...
OK
requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: phpappusdc.mybluemix.net
last uploaded: Sat Dec 5 23:27:27 UTC 2015
stack: cflinuxfs2
buildpack: php_buildpack
     state     since                    cpu    memory          disk           details   
#0   running   2015-12-05 11:28:19 PM   0.3%   58.9M of 128M   124.3M of 1G      
letsfacethefact@instance-1:~$ 
```

PHPのインスタンスに向けて cf console を実行。

```bash:console
letsfacethefact@instance-1:~$ cf console PHPAppUSDC
> Finding app guid for PHPAppUSDC ... bbb121f2-7b11-498d-90b4-ad1923219481 
{bbb121f2-7b11-498d-90b4-ad1923219481 PHPAppUSDC false} 
> Updating app to connect to tmate.
> Updating app start command to 'curl -s https://raw.githubusercontent.com/danhigham/cf-console/master/install.s
h > /tmp/install.sh && bash /tmp/install.sh && sleep 3600'.
> Changing instance count to 2.
> Checking app log datestamps.

letsfacethefact@instance-1:~$ cf app PHPAppUSDC
Showing health and status for app PHPAppUSDC in org xxx@xxx.com / space Sandbox as xxx@xxx.com...
OK

requested state: started
instances: 2/2
usage: 128M x 2 instances
urls: phpappusdc.mybluemix.net
last uploaded: Sat Dec 5 23:27:27 UTC 2015
stack: cflinuxfs2
buildpack: php_buildpack

state     since                    cpu    memory          disk           details   
#0   running   2015-12-05 11:28:19 PM   0.3%   58.9M of 128M   124.3M of 1G      
#1   running   2015-12-06 12:18:19 AM   0.4%   63.1M of 128M   135.5M of 1G      
letsfacethefact@instance-1:~$ 
```

PHPのインスタンスに tmate.io に接続するためのモジュールが導入されるとともに、インスタンスが一つ追加されたようです。
接続に必要な情報を取得するためにアプリケーションのログを確認してみます。

```bash:log確認
letsfacethefact@instance-1:~$ cf logs PHPAppUSDC --recent | more

(省略)

2015-12-06T00:18:17.76+0000 [App/1]      OUT ./include/event2/thread.h
2015-12-06T00:18:17.76+0000 [App/1]      OUT ./include/event2/util.h
2015-12-06T00:18:17.76+0000 [App/1]      OUT ./bin/tmate
2015-12-06T00:18:18.65+0000 [App/1]      OUT 3ezDwQr220BXfcvYRo8BX4U8x@sf1.tmate.io
letsfacethefact@instance-1:~$ 
```

ログの一番下にtmate.io への接続情報が出力されていますね。
この情報を使って sshで接続してみましょう。

```bash:ssh接続
letsfacethefact@instance-1:~$ ssh 3ezDwQr220BXfcvYRo8BX4U8x@sf1.tmate.io

```
```bash:接続完了！ 
vcap@194mt78p9ai:~$ stty -echo; ps_orig=`echo $PS1`; PS1=""
       __                             _
  ___ / _|   ___ ___  _ __  ___  ___ | | ___
 / __| |_   / __/ _ \| '_ \/ __|/ _ \| |/ _ \
| (__|  _| | (_| (_) | | | \__ \ (_) | |  __/
 \___|_|    \___\___/|_| |_|___/\___/|_|\___|

3ezDwQr220BXfcvYRo8BX4U8x@sf1.tmate.io

vcap@194mt78p9ai:~$ 

────────────────────────────────────────────────────────────────────────────────────────────────────────────────
vcap@194mt78p9ai:~$ $HOME/.bp/bin/start
00:18:18 httpd   | [Sun Dec 06 00:18:18.918515 2015] [mpm_event:notice] [pid 77:tid 140482411562816] AH00489: Ap
ache/2.4.16 (Unix) configured -- resuming normal operations
00:18:18 httpd   | [Sun Dec 06 00:18:18.918721 2015] [mpm_event:info] [pid 77:tid 140482411562816] AH00490: Serv
er built: Jul 22 2015 20:20:52
00:18:18 httpd   | [Sun Dec 06 00:18:18.918747 2015] [core:notice] [pid 77:tid 140482411562816] AH00094: Command
 line: '/app/httpd/bin/httpd -f /home/vcap/app/httpd/conf/httpd.conf -D FOREGROUND'
00:18:18 php-fpm | [06-Dec-2015 00:18:18] NOTICE: fpm is running, pid 80
00:18:18 php-fpm | [06-Dec-2015 00:18:18] NOTICE: ready to handle connections
01:07:11 httpd   | [Sun Dec 06 01:07:11.126478 2015] [core:info] [pid 77:tid 140482411562816] AH00096: removed P
ID file /home/vcap/app/httpd/logs/httpd.pid (pid=77)
01:07:11 httpd   | [Sun Dec 06 01:07:11.126506 2015] [mpm_event:notice] [pid 77:tid 140482411562816] AH00492: ca
ught SIGWINCH, shutting down gracefully
vcap@194mt78p9ai:~$ 

0:bash*                                                                                                         
```

接続成功！
BluemixのPHPのコンテナにsshで入れました。簡単ですね。繋がってしまえば後はご自由に。vcapというユーザーの権限の範囲でコマンド叩き放題です:grinning:


## 4.  注意点とまとめ

- cf console プラグインを使えば、簡単にBluemixのコンテナにログインできることが確認できました。ただし、このプラグインは osx および linux64 プラットフォーム用です。Windows環境は正式にはサポートされていません。

- ログに出力されるsshのログイン情報は ephemeral なもの、とのこと。つまりすぐに失効してしまいます。必要な都度、接続情報を確認してください。

- cf console を実行するとインスタンスが一つ追加されます。作業後は元に戻しておきましょう。

- 今回試した方法は tmate.io という外部サービスを利用した方法です。実際の使用にあたっては、そのリスクも勘案する必要があります。