AWS CloudShellを深掘ってみる

どうも、GUIよりはCLI派の寺内です。

AWS CloudShell は、AWS Management Consoleから1クリックで起動できるシェルです。インターネットと通信もできるし、AWS CLIは使えるし、便利ですね。

今日は、このCloudShellを深堀りしてみます。
このCloudShellを正しく理解し、便利に使っていきましょう。

AWS CloudShellとは

ブラウザで使うことのできるシェル環境です。
Amazon Linux 2 がAWS環境上で起動し、その中でコマンドを実行することができます。
使えるシェルは、Bash・PowerShell・zshで、最大の特徴はシェル実行というコンピューティングパワーを無料で使えることです。

AWS CloudShell とは? - AWS CloudShell
AWS CloudShell について紹介します。

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では、ipifconfigpingといったネットワーク系コマンドは削除されています。dignslookupすら入っていません。そこは不便ですね。必要なときは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
cshは入っていません。

バージョンは、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インスタンスのコンソールを取るのがいいでしょう。

Session Manager を使用した Linux インスタンスへの接続 - Amazon Elastic Compute Cloud
AWS Systems Manager Session Manager を使用し、インタラクティブなブラウザベースのシェルを介してインスタンスに接続します。

CloudShellのグローバルIPアドレスをセキュリティグループで許可してsshログインすることもできますが、非推奨です。CloudShellのグローバルIPアドレスは起動の都度変更されます。都度セキュリティグループを修正することは、設定ミスと事故にもつながりかねません。やめましょう。

まとめ

  1. CloudShellは、AWS Management Consoleでできることの権限を継承し、AWS CLIを通じて実行可能です。
  2. 利用想定は、GUIではなくCLIでAWSを使うこと。けして無料で使えるLinuxではない。
  3. 「1GBしか保存できない」「120日間アクセスないとデータが消える」「12時間でセッションが切れる」といった制約を忘れずに。
Bashでは、Ctrl+w は1ワード削除なのですが、ブラウザベースのシェルではブラウザのタブが消える。
何度タブを消したことか。この癖をなんとかしないと・・・。

それでは、素敵なシェル生活を!

著者について
寺内康之

SF好きなインフラエンジニア。プログラミングをちゃんと学びたい。
AWS Solutions Architect-Professional、AWS_DevOpsEngineer-Professional、AWS Advanced Networking-Specialtyを保持。

寺内康之をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSその他
TechHarmony
タイトルとURLをコピーしました