Oracle Cloud InfrastructureでCloud Shellがリリースされたよ

2023/04 Cloud Shellにチュートリアル機能が搭載されました。久しぶりに触ってみると、いろいろ機能拡張されていてビックリ。
* [Introducing the user tutorial for Cloud Shell](https://blogs.oracle.com/oracle4engineer/post/ja-introducing-tutorial-for-cloud-shell)

# Cloud Shellがリリース！

Oracle Cloud InfrastructureでCloud Shellがリリースされた。ブラウザ・ベースのターミナルで、AWSのSession ManagerやAzure Cloud Shellに相当するものだ。PuTTYやTera Termを使わずにOCI上のインスタンスに接続したり、すぐにOCI CLIを実行したりできる。

* [Announcing Oracle Cloud Shell](https://blogs.oracle.com/cloud-infrastructure/announcing-oracle-cloud-shell)
* [OCI Manual: Cloud Shell](https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/cloudshellintro.htm)
* [Developer Guide: SDK Quick Starts with Cloud Shell](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/developerquickstarts.htm)
* [Developer Guide: Cloud Shell](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/devcloudshellintro.htm)

マニュアルから主要な項目をピックアップしたのが次のとおり。

### おもな特徴

* OCI CLIやTerraform、SQL*Plusなどの開発者ツールがセットアップ済み
* 1ユーザーあたり5GBの永続的なストレージを利用可能。つまりファイルを保存可能
* Cloud Shellからインターネットにアクセスできる。つまり、パブリックIPを持ったOCI Computeにssh接続できる
* 無料で使用可能

※ユーザーとは、OCI管理コンソールにログインできるユーザーアカウントのこと。

### おもな制限事項

* ~~有償アカウントのみ利用可能。~~2020/03/10現在Always Freeでも使用可能
* 利用可能な数は[サービス・リミット](https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/servicelimits.htm)で制限される
* セッションは最長24時間。20分間使っていないと切断される 
* 半年間使用しないとメール通知され、60日以内にストレージが削除される
* 外部からCloud Shell自体にssh接続できない
* Cloud Shellを使うには以下のポリシーが必要

```
allow group <GROUP-NAME> to use cloud-shell in tenancy
```

<font color="red">※インターネットへのアクセスを許可しないときは、Cloud Shellのポリシーを与えないこと。</font>


# Cloud Shellをさわってみる

実際にCloud Shellを利用して、どのようなことができるのか確認する。

1. 管理コンソール右上のアイコンをクリックする。
![cloudshell01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/71acaf30-3689-0db4-6dcd-bd48f8e5dc12.png)

2. ブラウザの下にコンソールが表示される。
![cloudshell02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ac342a62-f218-15e3-9572-e1ae8b489d7e.png)

3. dfコマンドを実行すると、ホームディレクトリが5GBあることがわかる。

```shell-session
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          39G  6.3G   33G  17% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
/dev/sdb1       5.0G   33M  5.0G   1% /home/yamadas ★ここ
/dev/sda3        39G  6.3G   33G  17% /etc/hosts
shm              64M     0   64M   0% /dev/shm
```

4.コンテナで動いている。[Katacoda](https://www.katacoda.com/)のような、コンテナ型のハンズオン環境と似た仕組みなのだろう。こちらは永続的なストレージ付き。

```shell-session
$ id
uid-1101(yamadas) gid=1101(oci) groups=1101(oci),995(docker)

$ ls -la /
total 32
drwxr-xr-x.   1 root root   73 Feb 12 08:16 .
drwxr-xr-x.   1 root root   73 Feb 12 08:16 ..
lrwxrwxrwx.   1 root root    7 Jan 27 21:59 bin -> usr/bin
dr-xr-xr-x.   2 root root    6 Apr 11  2018 boot
drwxr-xr-x.  15 root root 2940 Feb 12 08:16 dev
-rwxr-xr-x.   1 root root    0 Feb 12 08:16 .dockerenv ★これがdockerコンテナの証拠
```

5.sudoコマンド自体が無く、root権限が必要な操作は実行できない。sudo以外にも、いくつかのシステム系コマンドは利用できない。

```shell-session
$ sudo su -
bash: sudo: command not found
```

6.コピー＆ペーストは「Ctrl-c」or「Ctrl+Insert」と「Shift-Insert」を使える。Mac OSでは「Cmd-C」と「Cmd-V」。「Ctrl-c」が使えないときは「Ctrl+Insert」を試してみること。
![cloudshell04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/3419422c-1ea6-6b6b-ca53-ecf9593cc5f8.png)

7.パブリックIPを持っているOCI Computeにssh接続できる。`/var/log/secure`でアクセス元IPを確認したところAshburnのパブリックIPだった。ホームリージョンの[IPアドレスレンジ](https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/addressranges.htm)が使用されるのかもしれない。

```shell-session
$ ssh -i ~/.ssh/private-key.pem ＜PublicIP＞ -l opc
```

8.通常OCI CLIを使用するには、インストールと設定ファイルの構成が必要だ。しかし、Cloud Shellでは何もしなくても利用できる。

```shell-session
$ oci iam region list
$ oci iam availability-domain list
```

9.tmux（terminal multiplexer）がインストールされているので、20分間のセッションインアクティブ時間を気にしないで実行できる。tmuxの詳細は検索のこと。

```shell-session
$ which tmux
/usr/bin/tmux
```

10.OCI CLIでアクセスするリージョンを切り替えるときは、管理コンソールで切り替える必要はあるが、ストレージは共有されている。

```shell-session
★プロンプトが現在のリージョン
(ap-tokyo-1)$ touch region
(ap-tokyo-1)$ ls
region

★管理コンソールでリージョンを変更してCloud Shellを再起動する
★phoenixに切り替えても、tokyoで作成したファイルを参照できる
(us-phoenix-1)$ ls
region
```

11.設定ファイルは`/etc/oci/config`と`/etc/bashrc.cloudshell`にある。

```shell-session:/etc/oci/config
[DEFAULT]
tenancy=ocid1.tenancy.oc1..aaaaaaaadncnkgbka335dzmirsejerkp7vsyfw445mt7x43ea3qf3oktfrma
authentication_type=instance_principal
delegation_token_file=/etc/oci/delegation_token

[eu-amsterdam-1]
tenancy=ocid1.tenancy.oc1..aaaaaaaadncnkgbka335dzmirsejerkp7vsyfw445mt7x43ea3qf3oktfrma
region=eu-amsterdam-1
delegation_token_file=/etc/oci/delegation_token

[ap-mumbai-1]
tenancy=ocid1.tenancy.oc1..aaaaaaaadncnkgbka335dzmirsejerkp7vsyfw445mt7x43ea3qf3oktfrma
region=ap-mumbai-1
delegation_token_file=/etc/oci/delegation_token
★以降続く
```

```shell-session:/etc/bashrc.cloudshell
export PATH=/home/oci/bin:${PATH}
export OCI_CLI_AUTH=instance_obo_user
export OCI_ANSIBLE_AUTH_TYPE=instance_obo_user
export LANG="${LANG:-en_US.UTF-8}"
export OCI_obo_token=`cat /etc/oci/delegation_token`
alias help='cat /etc/cloudshell-help.txt'
★以降続く
```

12.以下のような環境変数が定義されている。

```shell-session
$ env | grep OCI
OCI_ANSIBLE_AUTH_TYPE=instance_obo_user
OCI_CLI_AUTH=instance_obo_user
OCI_AUTH=InstancePrincipal
OCI_CONFIG_PROFILE=ap-tokyo-1
OCI_use_obo_token=true
OCI_CONFIG_FILE=/etc/oci/config
OCI_obo_token=xxxxxxxxx
OCI_CLI_CONFIG_FILE=/etc/oci/config
OCI_CLI_PROFILE=ap-tokyo-1
```

13.OCI CLIをカスタマイズするときは設定ファイルを作成する。

```shell-session
$ oci setup oci-cli-rc --file path/to/target/file
```

14.利用可能な最大数はサービス・リミットで制限される。[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/servicelimits.htm)の記載は以下のとおり。

| Resource | Monthly or Annual Universal Credits | Pay-as-You-Go or Promo |
|:-:|:-:|:-:|
| Active User Count | 75 | 50 |
| Usage Hours Count | 400  | 240 |


# まとめ

冒頭に一通りまとめを書いているので、ここでは検証結果を中心に記す。

* **Cloud Shellを利用するとブラウザ・ベースのターミナルを利用できる**
* **OCI CLIやTerraformなどがセットアップ済みで、すぐに利用できる**
* **インターネットにアクセスできるので、パブリックIPを持ったインスタンスにssh接続できる（要SSH秘密鍵）**
* **外部にSSHできないネットワークでも、OCIコンソールに接続できればSSHを利用できる**
* **ユーザーごとに5GBの永続的ストレージを利用できる**
* **Cloud Shellはコンテナとして実装され、ホームリージョンで起動する。インスタンスにはroot権限がなく、利用できないコマンドもある**
* **20分以上インアクティブだとセッションは切断されるがtmuxで回避できる**
* **コピー＆ペースト機能はあるが、実際に使えるかはブラウザに依存する**

**ぼやき**
~~Azure Cloud Shellにはファイルのアップロード／ダウンロード機能があるのでOCIにも実装してほしいところ。TerraformのファイルをやりとりするのにObject Storageを経由するのは面倒。~~
<font color="red">2021/3/23 ファイル転送機能が追加されました</font>