ShinobiLayer: Bluemixのコンテナーにログインする方法

#はじめに
Bluemixのコンテナに直接ログインするのは本来は邪道（？）なのでしょうが、デバッグ目的でログインして実際にコマンドを叩きたい時もあります。[cf-ssh](https://github.com/cloudfoundry-community/cf-ssh) を使えばSSHでコンテナ内にログインできるのですが、

* cf-sshを事前にdownloadして配置しておかなければいけない。
* エラー発生時の原因が分かりにくい。
* cf-sshが内部的にやっているのは、以下の作業に過ぎない。
    * cf-ssh.ymlというmanifest fileを生成する。この際、cf-ssh実行時にAAAというアプリ名を指定していても、実際には"AAA-ssh"という風に名前に"-ssh"を追加したmanifest fileを生成する（名称が変更されてしまう）。<br>
[`cfssh["name"] = name + "-ssh"`](https://github.com/cloudfoundry-community/cf-ssh/blob/master/cfmanifest/ssh_manifest.go)
    * このcf-ssh.ymlを`cf push -f cf-ssh.yml`で呼び出す。<br>
    [`cmd := exec.Command("cf", "push", "-f", cfSSHYAML)` ](https://github.com/cloudfoundry-community/cf-ssh/blob/master/main.go)
    * `cf logs アプリ名 --recent`でログを呼び出し、sf.tmate.ioにSSHでログインするための情報を取得する。<br>
    [`cmd = exec.Command("cf", "logs", sshAppname, "--recent")`](https://github.com/cloudfoundry-community/cf-ssh/blob/master/main.go)
    * SSHで上記のサイトにログインする。

ということで、わざわざcf-sshに頼る必要はありません。なので、ここでは手動でログインしていく方法を紹介します。この方法の方が、ステップバイステップで実行するので、どこでエラーになっているのかを辿りやすいので、個人的には好みです。

# SSHでのログイン方法

cf pushによって現行ディレクトリ配下のファイルをuploadするので、単にSSHでログインしてみたいだけであれば、実行用ディレクトリを作ってから実行した方が良いでしょう。また、uploadするファイルがないとcf pushは失敗するので、今回はtest1.pyというファイルを作りました。また、cf pushコマンド中の"shinobilayer01"の箇所はアプリ名なので、他と重複しない名前に適当に変更して下さい。

```
[root@xxx ~]# mkdir shinobilayer
[root@xxx ~]# cd shinobilayer
[root@xxx shinobilayer]# touch test1.py
[root@xxx shinobilayer]# cf push shinobilayer01 -b python_buildpack -c "curl http://tmate-bootstrap.cfapps.io | sh" -k 256M -m 64M --no-route --no-manifest
[root@xxx shinobilayer]# cf logs shinobilayer01 --recent|grep "@sf.tmate.io"
2015-05-07T00:14:57.43-0500 [App/0]      ERR 2015/05/07 05:14:57 =====> kBkyRaLFkLuerAFluTSl6nOoa@sf.tmate.io

```
あとは、この`kBkyRaLFkLuerAFluTSl6nOoa@sf.tmate.io`にSSHでログインすればOKです。
ちなみに上記のcf pushの箇所は、以下のようなmanifestファイルを作成して、`cf push -f manifest.yml`でも問題ありません。繰り返し実行したい場合は、manifestファイルを使ってプロビジョニングしても良いでしょう。

```yaml:manifest.yml
applications:
- command: curl http://tmate-bootstrap.cfapps.io | sh
  instances: 1
  memory: 64M
  name: shinobilayer01
  no-route: true
```

なお、このSSHログイン情報はワンタイムのものなので、一回切断してしまったら、以下のようなエラーがでて利用できなくなります。もともと、コンテナーは毎回作り直すものですし、セキュリティーのことを考えると、そういうものだと受け入れるべきでしょう。

```
[root@xxx bluemix]# ssh kBkyRaLFkLuerAFluTSl6nOoa@sf.tmate.io

  Dear guest,

  The provided session token is invalid, or has expired.
  Feel free to reach out if you are having issues.

  Thanks,
  Nico

Connection to sf.tmate.io closed by remote host.
Connection to sf.tmate.io closed.
```



# Bluemixコンテナーの環境情報例
以下に実際にコマンドを叩いてみた時の実行例を挙げてみます。

```text:/etc/lsb-release
vcap@18ktpdutvbo:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"
```

```text:uname-a
vcap@18ktpdutvbo:~$ uname -a
Linux 18ktpdutvbo 3.13.0-39-generic #66-Ubuntu SMP Tue Oct 28 13:30:27 UTC 2014 x86_64 GNU/Linux
```

```text:ip情報
vcap@18ktpdutvbo:~$ ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
5712: w-18ktpdutvbo-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 2a:a2:fa:30:f7:31 brd ff:ff:ff:ff:ff:ff
    inet 10.254.2.182/30 brd 10.254.2.183 scope global w-18ktpdutvbo-1
       valid_lft forever preferred_lft forever
    inet6 fe80::28a2:faff:fe30:f731/64 scope link
       valid_lft forever preferred_lft forever
```

BluemixはSoftLayer上で構成されていますが、今回作成したコンテナーはDAL09のDARからインターネットに出て行っているので、恐らくDAL09のDCに配置されていると思われます。

```text:traceroute情報
vcap@18ktpdutvbo:~$ traceroute -A www.google.com
traceroute to www.google.com (216.58.192.4), 30 hops max, 60 byte packets
 1  10.254.2.181 (10.254.2.181) [*]  0.052 ms  0.025 ms  0.034 ms
 2  198.23.123.225-static.reverse.softlayer.com (198.23.123.225) [AS36351]  0.281 ms  0.229 ms  0.191 ms
 3  169.53.3.66-static.reverse.softlayer.com (169.53.3.66) [AS36351]  0.745 ms  0.781 ms  1.158 ms
 4  ae11.dar02.dal09.networklayer.com (198.23.118.132) [AS36351]  0.909 ms  0.856 ms ae11.dar01.dal09.networklayer.com (198.23.118.130) [AS36351]  0.809 ms
 5  ae27.bbr01.eq01.dal03.networklayer.com (50.97.19.82) [AS36351]  1.444 ms  1.219 ms ae28.bbr01.eq01.dal03.networklayer.com (50.97.19.84) [AS36351]  1.235 ms
 6  50.97.16.37-static.reverse.softlayer.com (50.97.16.37) [AS11172]  1.170 ms  1.354 ms  1.120 ms
 7  72.14.233.85 (72.14.233.85) [AS15169]  14.902 ms  14.854 ms 72.14.233.77 (72.14.233.77) [AS15169]  1.427 ms
 8  66.249.95.198 (66.249.95.198) [AS15169]  39.561 ms 72.14.237.219 (72.14.237.219) [AS15169]  1.139 ms  1.091 ms
 9  209.85.240.22 (209.85.240.22) [AS15169]  15.308 ms  15.250 ms  15.342 ms
10  216.239.46.213 (216.239.46.213) [AS15169]  38.613 ms 216.239.46.241 (216.239.46.241) [AS15169]  42.311 ms  42.160 ms
11  209.85.246.252 (209.85.246.252) [AS15169]  41.866 ms  41.721 ms  41.921 ms
12  74.125.37.41 (74.125.37.41) [AS15169]  39.072 ms  39.012 ms  38.946 ms
13  nuq04s29-in-f4.1e100.net (216.58.192.4) [AS15169]  41.592 ms  41.416 ms  41.423 ms

```