さくらのクラウドシェルを触ってみた

:::note warn
本記事は、2023/05/26時点の確認情報であり、今後の運営アップデートにより内容が大きく変わっている可能性があります。
:::

## さくらのクラウドシェルって何？
昨日（2023/05/25）さくらインターネット社から提供が開始された、[会員登録不要で無償利用可能なオンラインシェル環境](https://www.sakura.ad.jp/information/newsreleases/2023/05/25/1968211581/)です。

## どうやって使うの？
[さくらのクラウドシェルのサービスページ](https://www.sakura.ad.jp/services/cloudshell/)から「無料で試す」ボタンをクリックし、その後表示されるポップアップの「約款に同意する」にチェックを付けて「すぐに利用する」ボタンをクリックするだけです。
![start_popup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/5f2d401c-14a1-51c9-f74e-6e5b2784ddd4.png)
初期画面は、以下のような形です。
![initial_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/d4d6e383-2f0c-b139-696b-e13ee12d07f4.png)

## 何が出来るの？
サービス提供側の一番の目的は「さくらのクラウドをコマンドラインから操作できる」だと思うのですが、無償の範囲では外部との通信が完全に制限/遮断されている（インターネットに繋がらない）ため、いわゆるLinuxのスタンドアローンマシンのサンドボックス環境として、無茶な触り方をして壊してはまたゼロから始めることが可能になるので、特にLinuxをあまり触ってこなかった方にとっては絶好の学習環境になり得ると思いました。

### ネットに繋がらない／ローカルマシンとファイルやり取り出来ないと何も出来ないのでは...？
プリインストールされているツールは割と豊富なので、追加でインストールするようなパッケージ管理の知識は学べないものの、初学者にとって的を絞って学ぶ用途としては色々出来ると思います。

## クラウドシェル環境をリセットする方法
画面最下部の右端に「Reset」ボタンが表示されている場合はボタンをクリック、表示されていない（表示されなくなる条件が分かっていないですが消えたりする）場合はブラウザのページリロードするだけで環境がリセットされ（初期状態に戻り）ます。
逆に言うと、どれだけ色々試していた最中でも、リロードすると無に帰すので注意。
また、何らかの要因（コンテナが強制終了/停止したり、未入力状態が20分続くなど）でキー入力が受け付けなくなった場合は、リロードしてリセットするしか無いので注意。
サンドボックスとして試す際にも、どんな内容を試したか後から見返したいと思うので、別の場所にメモを取りながらをお勧めします。

## クラウドシェル環境の中では何が使えるか

### まずは現在地の確認から

```zsh
sakura@cloud-shell% pwd
/home/sakura

sakura@cloud-shell% ls
README-cloud-shell.txt
```
親切なことにREADMEが置いてあります。
コマンド入力時はタブ補完が効くので「vim R」まで入力してtabキーを押下すると補完してくれます。
```zsh
sakura@cloud-shell% vim README-cloud-shell.txt
```
>〜READ MEテキスト内容の引用〜
>ようこそ さくらのクラウドシェルへ。
>
>クラウドシェルはブラウザから利用可能なシェル環境であり、
>あなたのリソースを効果的にマネジメントできます。
>また、エディタといくつかのプログラミング言語もインストール済みなので、
>ちょっとした時間にアルゴリズムを考えて試すこともできます。
>
>本サービスは認証なしまたは会員認証によってご利用いただけます。
>認証なしでご利用する場合は全ての通信やボリュームが制限されますが、
>会員認証を行うとその一部が緩和され多様な使い方が可能になります。
>
>ボリュームはサービス終了後にリセットされるため、
>作業に用いた秘密情報が外部に流出することはありません（セキュア！）。

:::note info
〜vim（エディタ）を使ったことの無い人のための注釈〜
このような文章（READ MEの内容）が表示されたら、キーボードのJキーを押下し続けることでカーソルを下に移動し画面下まで行くとスクロールされていきます。戻りたい時はKキーを押下し続けることでカーソルが上に移動します。
全て読み終えてエディタのテキスト表示を閉じたい時は「:（コロン）キー」を押下した後に「q（キュー）キー」を押下し、Enterキーを押下することで元の画面に戻れます。
※「:（コロン）キー」を押下した後でq以外の不要なキーを押してしまった場合は「ESCキー」押下で、:キーの入力前に戻れます。
:::

### シェル
初期画面のホスト名末尾の%でお気づきの方も居るかもですが、デフォルトはzshです。
zshの他には、sh／bash／dashが使えます（Cシェル系は入っていない）。
```zsh
sakura@cloud-shell% echo $0
/bin/zsh
```

### OS
[Ubuntu 22.04.2 LTS](https://help.ubuntu.com/) がベース(*)になっているようです。
*：全てが入っている訳では無さそうという意味
```zsh
sakura@cloud-shell% cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

### エディタ
nano、vi、vim、emacsは使えるようです。
※GUIが使えないのでgeditは入っていない

### コマンド
どんなコマンドが存在するかを眺めつつ、一文字打ってタブ補完で確認が吉。
```zsh
sakura@cloud-shell% run-help
※出力結果は長いので割愛

sakura@cloud-shell% ls /usr/bin
※出力結果は長いので割愛
```

## スペックを確認する

### CPU
vCPUが4つ
```zsh
sakura@cloud-shell% cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
stepping        : 7
microcode       : 0x1
cpu MHz         : 2400.000
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 pku ospke avx512_vnni md_clear arch_capabilities
bugs            : spectre_v1 spectre_v2 spec_store_bypass swapgs taa
bogomips        : 4800.00
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
stepping        : 7
microcode       : 0x1
cpu MHz         : 2400.000
cache size      : 4096 KB
physical id     : 1
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 pku ospke avx512_vnni md_clear arch_capabilities
bugs            : spectre_v1 spectre_v2 spec_store_bypass swapgs taa
bogomips        : 4800.00
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
stepping        : 7
microcode       : 0x1
cpu MHz         : 2400.000
cache size      : 4096 KB
physical id     : 2
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 pku ospke avx512_vnni md_clear arch_capabilities
bugs            : spectre_v1 spectre_v2 spec_store_bypass swapgs taa
bogomips        : 4800.00
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
stepping        : 7
microcode       : 0x1
cpu MHz         : 2400.000
cache size      : 4096 KB
physical id     : 3
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 pku ospke avx512_vnni md_clear arch_capabilities
bugs            : spectre_v1 spectre_v2 spec_store_bypass swapgs taa
bogomips        : 4800.00
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:
```

### メモリ
約8GB
```zsh
sakura@cloud-shell% cat /proc/meminfo
MemTotal:        8152908 kB
MemFree:         1530804 kB
MemAvailable:    6884232 kB
Buffers:         1615740 kB
Cached:          3272792 kB
SwapCached:            0 kB
Active:          4319644 kB
Inactive:        1282456 kB
Active(anon):     715012 kB
Inactive(anon):      932 kB
Active(file):    3604632 kB
Inactive(file):  1281524 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:             39616 kB
Writeback:             0 kB
AnonPages:        623592 kB
Mapped:           485756 kB
Shmem:              2404 kB
KReclaimable:     773076 kB
Slab:             947516 kB
SReclaimable:     773076 kB
SUnreclaim:       174440 kB
KernelStack:        8416 kB
PageTables:         7688 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4076452 kB
Committed_AS:    2996688 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       25652 kB
VmallocChunk:          0 kB
Percpu:            10528 kB
HardwareCorrupted:     0 kB
AnonHugePages:    237568 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      780264 kB
DirectMap2M:     7608320 kB
DirectMap1G:     2097152 kB
```

### ディスク容量
約30GBくらい使える？（恒久的に保存は出来ないけど）
```zsh
sakura@cloud-shell% df
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   36G   22G   13G  63% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda3      ext4      36G   22G   13G  63% /etc/hosts
shm            tmpfs     64M     0   64M   0% /dev/shm
tmpfs          tmpfs    3.9G     0  3.9G   0% /proc/acpi
tmpfs          tmpfs    3.9G     0  3.9G   0% /proc/scsi
tmpfs          tmpfs    3.9G     0  3.9G   0% /sys/firmware
```

## 環境を眺めるだけじゃなく何かやってみる

### ユーザー切り替え
`su`だけだとパスワードを聞かれるけど、`sudo`を付けると無条件にroot権限で実行でき、rootも取れる。
```zsh
sakura@cloud-shell% sudo su root
root@cloud-shell:/home/sakura#
```

### 時刻を確認する
ネットワークに繋がっていないと時刻同期はどうなってるんだ？と気になりますよね。
当然コンテナが毎回立ち上げ直されるので大きく狂うことは無いと思われます。
※終了したい時はCtrlキー+Cキーを押下
```zsh
sakura@cloud-shell% watch -n 1 date


Every 1.0s: date
                                        cloud-shell: Fri May 26 21:35:55 2023

2023年  5月 26日 金曜日 21:35:55 JST
```

### HTTPサーバーを立ててアクセスしてみる
pythonで簡単に立てられる。コマンド末尾に「&」を付けることでバックグラウンド実行が出来る。
誤って「&」を付けなかった場合は、フォアグラウンドの入力が奪われて操作できなくなってしまうので、一旦Ctrlキー+Cキーを押下してHTTPサーバーを強制終了できる。
立ててみたものの、ブラウザアプリが入っておらず。。。
```zsh
sakura@cloud-shell% python3 -m http.server 8000 &

sakura@cloud-shell% Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

sakura@cloud-shell% curl http://0.0.0.0:8000/
127.0.0.1 - - [26/May/2023 21:23:19] "GET / HTTP/1.1" 200 -
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href=".bash_logout">.bash_logout</a></li>
<li><a href=".bashrc">.bashrc</a></li>
<li><a href=".nvm/">.nvm/</a></li>
<li><a href=".profile">.profile</a></li>
<li><a href=".pyenv/">.pyenv/</a></li>
<li><a href=".rbenv/">.rbenv/</a></li>
<li><a href=".sudo_as_admin_successful">.sudo_as_admin_successful</a></li>
<li><a href=".zcompdump">.zcompdump</a></li>
<li><a href=".zplug/">.zplug/</a></li>
<li><a href=".zsh_history">.zsh_history</a></li>
<li><a href=".zshrc">.zshrc</a></li>
<li><a href="README-cloud-shell.txt">README-cloud-shell.txt</a></li>
</ul>
<hr>
</body>
</html>
```

node.jsも使える。
```js:vim - simple_web.js
var http = require('http');
var server = http.createServer(function(req, res) {
    res.end("Hello world!\n");
}).listen(8001);
```
```zsh:zsh
sakura@cloud-shell% node simple_web.js &
※起動したプロセスIDが表示される

sakura@cloud-shell% curl localhost:8001
Hello world!

sakura@cloud-shell% nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2023-05-27 12:32 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
8001/tcp open  vcom-tunnel
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
```
※[nmapは対象ホストに対してポートスキャンする](https://knowledge.sakura.ad.jp/97/)ので自らが管理する環境以外に対して実行すると不正アクセスとみなされる恐れがあるので注意。

Go言語も使える。
```golang:vim - simple_web.go
package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello, World!!!\n")
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":8002", nil)
}
```

```zsh:zsh
sakura@cloud-shell% go run simple_web.go &
※起動したプロセスIDが表示される

sakura@cloud-shell% curl localhost:8002
Hello world!!!
```

### バルス後の荒廃した世界を確認する
:::note alert
壊して大丈夫な環境だと理解した上で細心の注意を払って試しています。
間違っても他の環境で同様のことは絶対にしないで下さい（ダメ絶対）。
:::
20秒かからずに、消せない設定になっているファイル以外は消失。
意外と`ls`は消せないコアなコマンド扱いじゃない。
```zsh
sakura@cloud-shell% sudo rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

sakura@cloud-shell% sudo rm -rf --no-preserve-root /

〜〜〜削除出来なかったファイルのエラーログの嵐〜〜〜

sakura@cloud-shell% ls
zsh: command not found: ls
_zsh_highlight_main__precmd_hook:4: permission denied: /dev/null

sakura@cloud-shell% pwd
/home/sakura
_zsh_highlight_main__precmd_hook:4: permission denied: /dev/null

sakura@cloud-shell% cd /
_zsh_highlight_main__precmd_hook:4: permission denied: /dev/null

sakura@cloud-shell% echo *
dev/ etc/ proc/ sys/
_zsh_highlight_main__precmd_hook:4: permission denied: /dev/null
```

## 最後に
ChatGPTのPluginが使えるようになったりiOSアプリ化されたりしている大AI時代に、全く通信が出来ない環境に惹かれて色々試してみました。
さくらのクラウドそのものをこれまで触ったことが無かったのですが、これを期に時間が出来たら触ってみたいなと思いました。

皆さんもご興味が湧きましたらぜひ触ってみて下さい。


## 参考書籍
* [zshの本](https://amzn.to/3MG7OEz)
* [ViIMproved‐Vim完全バイブル](https://amzn.to/3qclvn2)