どうも、GUIよりはCLI派の寺内です。
AWS CloudShell は、AWS Management Consoleから1クリックで起動できるシェルです。インターネットと通信もできるし、AWS CLIは使えるし、便利ですね。
今日は、このCloudShellを深堀りしてみます。
このCloudShellを正しく理解し、便利に使っていきましょう。
AWS CloudShellとは
ブラウザで使うことのできるシェル環境です。
Amazon Linux 2 がAWS環境上で起動し、その中でコマンドを実行することができます。
使えるシェルは、Bash・PowerShell・zshで、最大の特徴はシェル実行というコンピューティングパワーを無料で使えることです。
AWS CloudShellの起動方法
AWS Management Consoleの右上に、プロンプトな感じのアイコンがあります。
これを1クリックするだけで起動できます。
起動する前に、リージョンを確認しましょう。
認証と権限について
AWS CloudShellはAWS Management Consoleと同じ権限情報を引き継ぎます。
そのため、Management Console上でできることは、CloudShell上のAWS CLIで実施可能です。
仮想OS内にクレデンシャル情報は持ちません。(アクセスキーとシークレットキーを持たせて実行することもできます)
[cloudshell-user@ip-10-0-XX-YY ~]$ export declare -x AWS_CONTAINER_AUTHORIZATION_TOKEN="12ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO=" declare -x AWS_CONTAINER_CREDENTIALS_FULL_URI="http://localhost:1338/latest/meta-data/container/security-credentials" declare -x AWS_DEFAULT_REGION="ap-northeast-1" declare -x AWS_EXECUTION_ENV="CloudShell" declare -x AWS_REGION="ap-northeast-1" (以下略)
AWS CloudShellのインフラ
実行基盤はECS
CloudShellを開始すると、数十秒待たされた後シェルが使えるようになります。この時間、EC2インスタンスが起動するには早すぎますね。
CloudShellの基盤については非公開ですが、おそらくAWSが管理するECS+Fargateでコンテナとして起動しているようです。コンテナ環境なので、以下でメタデータが取得でき、そこでECS環境を見ることができます。
[cloudshell-user@ip-10-0-XX-YY ~]$ curl http://169.254.170.2/v2/metadata [cloudshell-user@ip-10-0-XX-YY ~]$ curl http://169.254.170.2/v2/stats
このコンテナに対して、SSM経由でアクセスしているものと思われます。
CPU
CPUは、こちらのドキュメントには、1vCPUとあります。
論理プロセッサは2つに見えていますが、”physical id”が同じなのでOSからみた物理CPU(vCPU)は1つです。
2コアあるということでしょう。
[cloudshell-user@ip-10-0-XX-YY ~]$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz stepping : 4 microcode : 0x2006c0a cpu MHz : 3401.479 cache size : 25344 KB physical id : 0 (以下略) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz stepping : 4 microcode : 0x2006c0a cpu MHz : 3401.493 cache size : 25344 KB physical id : 0 (以下略)
メモリ
メモリサイズは、こちらのドキュメントには、2GBとあります。でも、3.5GBくらいあるように見えますね。
[cloudshell-user@ip-10-0-XX-YY ~]$ cat /proc/meminfo MemTotal: 3792716 kB MemFree: 1493096 kB MemAvailable: 3273708 kB Buffers: 42372 kB Cached: 1849164 kB SwapCached: 0 kB (以下略)
ネットワーク
基盤となっているECSクラスタはプライベートサブネットにあり、NATを経由してインターネットへの接続が許可されていると推測されます。内部からインターネット方向への通信は自由にできますが、インターネットから内部へのインバウンド通信は許可されていません。
CloudShellでは、ip
やifconfig
、ping
といったネットワーク系コマンドは削除されています。dig
やnslookup
すら入っていません。そこは不便ですね。必要なときはyum
しましょう。
以下の通りNICは2つあり、eth0はリンクローカル用です。
[cloudshell-user@ip-10-0-XX-YY ~]$ cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo: 10229 74 0 0 0 0 0 0 10229 74 0 0 0 0 0 0 eth1: 357771471 251524 0 0 0 0 0 0 2768965 23460 0 0 0 0 0 0 eth0: 103248 144 0 0 0 0 0 0 14528 148 0 0 0 0 0 0
自分のグローバルIPは、以下で取得できます。
[cloudshell-user@ip-10-0-XX-YY ~]$ curl http://checkip.amazonaws.com/
ストレージ
ストレージは、以下の通り/home
領域が1GBあります。ただしこの/home
領域は120日アクセスがないと自動的に削除されます。永続ストレージといっても期限がありますので、注意が必要です。
[cloudshell-user@ip-10-0-XX-YY ~]$ df -k Filesystem 1K-blocks Used Available Use% Mounted on overlay 30832548 9710264 19533036 34% / tmpfs 65536 0 65536 0% /dev shm 1896356 0 1896356 0% /dev/shm tmpfs 1896356 0 1896356 0% /sys/fs/cgroup /dev/nvme1n1 30832548 9710264 19533036 34% /aws/mde /dev/loop0 999320 2596 927912 1% /home tmpfs 1896356 0 1896356 0% /proc/acpi tmpfs 1896356 0 1896356 0% /sys/firmware
AWS CloudShellのシェル環境
OS
では、OSの中を見ていきましょう。Amazon Linux 2 であることがわかります。
# Karooという名前が付いていたんですね・・・。
2022/02/10時点でのOSバージョンです。
[cloudshell-user@ip-10-0-XX-YY ~]$ cat /etc/system-release Amazon Linux release 2 (Karoo) [cloudshell-user@ip-10-0-XX-YY ~]$ uname -a Linux ip-10-0-XX-YY.ap-northeast-1.compute.internal 4.14.252-195.483.amzn2.x86_64 #1 SMP Mon Nov 1 20:58:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
シェル
こちらにあるドキュメントどおり、以下のシェルが使えます。
- Bash
- PowerShell
- zsh
バージョンは、2022/02/10時点のものです。
[cloudshell-user@ip-10-0-XX-YY ~]$ bash --version GNU bash, version 4.2.46(2)-release (x86_64-koji-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [cloudshell-user@ip-10-0-XX-YY ~]$ zsh --version zsh 5.7.1 (x86_64-koji-linux-gnu) [cloudshell-user@ip-10-0-XX-YY ~]$ pwsh --version PowerShell 7.1.4
AWS関連のコマンド
AWS CLIをはじめとして、各種AWSが提供するサービス操作コマンドが入っています。
- AWS CLI
- AWS Elastic Beanstalk CLI
- Amazon ECS CLI
- AWS SAM
バージョンは、2022/02/10時点のものです。
[cloudshell-user@ip-10-0-XX-YY ~]$ aws --version aws-cli/2.4.15 Python/3.8.8 Linux/4.14.252-195.483.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off [cloudshell-user@ip-10-0-XX-YY ~]$ eb --version EB CLI 3.20.2 (Python 3.7.1) [cloudshell-user@ip-10-0-XX-YY ~]$ ecs-cli --version ecs-cli version 1.21.0 (bb0b8f0) [cloudshell-user@ip-10-0-XX-YY ~]$ sam --version SAM CLI, version 1.33.0
ランタイム
プログラム実行環境は、Node.js とPython2および3が入っています。
ruby、gccは入っていないようです。
バージョンは、2022/02/10時点のものです。
[cloudshell-user@ip-10-0-XX-YY ~]$ node --version v14.18.3 [cloudshell-user@ip-10-0-XX-YY ~]$ npm --version 6.14.15 [cloudshell-user@ip-10-0-XX-YY ~]$ npm -g ls --depth 0 2>/dev/null | grep aws-sdk ├── aws-sdk@2.1000.0 [cloudshell-user@ip-10-0-XX-YY ~]$ python --version Python 2.7.18 [cloudshell-user@ip-10-0-XX-YY ~]$ python3 --version Python 3.7.10 [cloudshell-user@ip-10-0-XX-YY ~]$ pip3 --version pip 20.2.2 from /usr/lib/python3.7/site-packages/pip (python 3.7) [cloudshell-user@ip-10-0-XX-YY ~]$ pip3 list | grep boto3 boto3 1.18.54
AWS CloudShellでのファイルの扱い方
ファイルの保存について
ホームディレクトリに記録されたファイルは、永続保存されます。ただし、CloudShellに120日間アクセスがない場合、ホームディレクトリは削除されます。ディスク容量は1GBで、拡張できません。
ホームディレクトリ以外は、環境が終了するとディスクは破棄されます。次回起動時には保存されていません。つまり、yum等でツールをインストールした場合、そのツールは次回は使えません。都度インストールする必要があります。
ファイルアップロードとダウンロード
CloudShellの右上にある「アクション」ボタンから、ローカルPCとのファイルアップロードとダウンロードができます。
PCがWindowsであるときは、漢字コードをUTF-8にするように気をつけましょう。
AWS CloudShellのセッションについて
CloudShellを起動したあと、無操作状態が20~30分続くと、セッションが終了します。
その後、しばらくすると環境が終了します。
また、セッション開始後12時間経つと、操作中であったとしても強制的にセッションが終了します。長時間利用には向きません。
EC2インスタンスへのログイン
CloudShellからEC2インスタンスにアクセスするには、AWS Systems ManagerのSession Managerを使用して、EC2インスタンスのコンソールを取るのがいいでしょう。
CloudShellのグローバルIPアドレスをセキュリティグループで許可してsshログインすることもできますが、非推奨です。CloudShellのグローバルIPアドレスは起動の都度変更されます。都度セキュリティグループを修正することは、設定ミスと事故にもつながりかねません。やめましょう。
まとめ
- CloudShellは、AWS Management Consoleでできることの権限を継承し、AWS CLIを通じて実行可能です。
- 利用想定は、GUIではなくCLIでAWSを使うこと。けして無料で使えるLinuxではない。
- 「1GBしか保存できない」「120日間アクセスないとデータが消える」「12時間でセッションが切れる」といった制約を忘れずに。
Ctrl+w
は1ワード削除なのですが、ブラウザベースのシェルではブラウザのタブが消える。何度タブを消したことか。この癖をなんとかしないと・・・。
それでは、素敵なシェル生活を!