IBM Cloud Shellを触ってみた

# 1. はじめに
IBM Cloud ShellというIBM Cloud上で動くブラウザーベースのshell環境が提供されるようになったので、その特徴を紹介したいと思います。

- [紹介Blog](https://www.ibm.com/blog/announcement/ibm-cloud-shell-is-now-generally-available/)
- [IBM Cloud docs](https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-getting-started)

# 2. IBM Cloud Shellの起動方法
IBM Cloud Portalのここから選ぶだけです。
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/064c8ff8-4cab-31bb-0a5f-76351221717d.png">
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/141da9dc-9cf6-abe3-78e2-6c8d13db03ac.png">

# 3. 特徴
いくつか知っておくと便利な機能などを紹介します。

## 3.1 デフォルトの機能

- （少なくともいまのところは）課金は発生しない。
- インターネットにアクセスすることはできるが、各アカウントのPrivate NWには繋がっていない。
- 各種コマンドがプリインストールされている。詳細は、[こちら](https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-plugins-tools)を参照。
- 5つまでセッションが開ける
- ワークスペース用ストレージ(500MB)はセッション間で共有されているだけでなく、同一ユーザーであればアカウントをまたがっても共有されている。

```shell-session:session1
xxxxxxx@cloudshell:~$ touch hoge
```

```shell-session:session2
xxxxxxx@cloudshell:~$ ls hoge
hoge
```

https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-files#file-persistence
>Your IBM Cloud Shell workspace includes **500 MB** of temporary secure storage per region that you can access through your personal home directory, /home/<user-name>. **This storage space is provided at the user level rather than the account level**. This means that only you can access your storage, and you can access it from any of your accounts. No one else in your accounts can access your workspace storage.


## 3.2 Locationの選択
IBM Cloud Shellが内部的に動く場所を明示的に選択できます。一応アクセスしている環境によって自動選択されるらしいので、日本のユーザーであればTokyoが選択されるでしょう。今は、Dallas/Frankfurt/Tokyoが選択できるようです。
<img width="653" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/aeaa8245-cb3a-aa9b-dd30-94bc8df79149.png">

<img width="641" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/38cf9a4b-1a04-e6bb-4ac3-f2209c3fcfaf.png">

## 3.3 ローカル端末からのファイルのアップロード・ダウンロード
IBM Cloud Shellはインターネットに繋がっているため、インターネット上のファイルサーバーにアクセスすることでファイルをダウンロードすることができますが、ローカル端末から直接ファイルをアップロードすることが可能です。もちろんIBM Cloud Shell上の環境からローカル端末にファイルをダウンロードすることも可能です。
<img width="653" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4c93d017-ea71-50cf-e11d-e1ffa21c5866.png">

## 3.4 ローカルで稼働するサービスアクセスする方法
IBM Cloud Shell上に例えばnode.jsやapacheなどでローカルWeb Serviceを立てておくと、この`preview on port`の機能でアクセスすることができます。

```shell-session:Webサーバーを作成
xxxxxxx@cloudshell:~$ git clone https://github.com/IBM/nodejs-express-app.git
xxxxxxx@cloudshell:~$ cd nodejs-express-app
xxxxxxx@cloudshell:~/nodejs-express-app$ npm install
xxxxxxx@cloudshell:~/nodejs-express-app$ npm run start

> nodejsexpressapp@1.0.0 start /home/shiyasu/nodejs-express-app
> node server/server.js

App UI available http://localhost:3000
Swagger UI available http://localhost:3000/swagger/api-docs

```

- Port 3000を選択する<br><img width="341" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5fa9b49c-e048-ac67-b4d8-208ac849ffb0.png">
- サービスが表示された<br><img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/68833ba9-86dc-4ac6-3e1b-76114ea502f8.png">

- （この稼動確認の後、cloud foundryにpushするなどの作業を行うことが可能）


## 3.5 リモートで稼働するサービスにアクセスする方法
ssh port forwardingを利用したり、`kubectl port-forward`や`oc port-forward`などを利用すれば、リモート環境で動いているサービスをローカルポートにアクセスすることで転送されるようになります。これを前節のようにIBM Cloud Shell経由でアクセスすれば、例えばリモート環境で動いているPodに対して、直接利用者端末のブラウザから稼働確認することができます。。
https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-preview-apps#preview-kube-cluster

```shell-session:session1（ローカルポート3000をリモートポート8080に転送）
xxxxxxx@cloudshell:~$ oc get pods -n syasuda
NAME                                       READY   STATUS      RESTARTS   AGE
nodejs-ex-1-build                          0/1     Completed   0          15d
nodejs-ex-649bd6778d-wrznm                 1/1     Running     0          15d

xxxxxxx@cloudshell:~$ oc port-forward pod/nodejs-ex-649bd6778d-wrznm -n syasuda 3000:8080
Forwarding from 127.0.0.1:3000 -> 8080
Forwarding from [::1]:3000 -> 8080
```
```shell-session:session2（ローカルポート3000にアクセスすると、リモートサービスに接続される）
xxxxxxx@cloudshell:~$ ss -anpt|grep 3000
LISTEN     0      0      127.0.0.1:3000                     *:*                   users:(("oc",pid=305,fd=7))
LISTEN     0      0          ::1:3000                    :::*                   users:(("oc",pid=305,fd=8))

xxxxxxx@cloudshell:~$ curl -I http://localhost:3000
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 40430
ETag: W/"9dee-3nm2OJV/pDUlKWUTQSk1Z/pOG6E"
Date: Fri, 26 Jun 2020 00:09:56 GMT
Connection: keep-alive
```

- Port 3000を選択すると・・・<br><img width="341" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5fa9b49c-e048-ac67-b4d8-208ac849ffb0.png">
- Podに直接アクセスできた！<br><img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c723dae5-ba49-9237-a9f6-6c60794dce7e.png">


# 4. 注意点

- 利用時間はリージョンあたり週に30時間まで。30時間を超えると、リセットされるまで5分しか使えなくなる。
    - https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-faqs#what-usage-length
- セッションは、1時間利用しないと自動的にcloseされて、データも消去される。
    - https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-shell-ui#multi-shell
    - https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-files#file-persistence
- セッションがopen中は利用中とカウントされるので、使っていない時間はcloseすること
- 利用時間の確認方法は以下の通り
    - コンソールから"Usage quota"を選択<br><img width="401" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2f4d0063-59e7-6b13-c25c-a618e6b8cc6c.png">
    - 30時間中51分利用している。<br><img width="769" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/36e9ae96-22cd-a34f-05c1-cefc42efbb30.png">
- IBM Cloud Shellはあくまで管理コンソール経由で起動するため、Private NW経由では利用できない。