[アップデート] AWS CloudShell が組み込みのビジュアルファイルエディタをサポートしたので試してみた
クラウド事業統括本部の石川です。AWS CloudShell に組み込みのビジュアルファイルエディタが追加され、シェルから edit コマンドを実行するだけでブラウザ上の GUI エディタが起動するようになりましたので、実際にマネジメントコンソールから試してみました。
AWS CloudShell は、マネジメントコンソールの認証情報をそのまま引き継いで使えるブラウザベースのシェル環境です。AWS CLI やスクリプトの実行、IaC テンプレートの調整といった用途で利用されています。
これまで CloudShell 上でファイルを編集するには、Vim や Emacs といったターミナルベースのエディタを使うか、ファイルをローカルにダウンロードして編集し再アップロードする必要がありました。今回追加されたビジュアルファイルエディタは、この手間を解消するものです。シンタックスハイライト、検索・置換、複数行選択、コピー&ペースト、undo/redo をブラウザセッション内で完結して利用できます。
公式ドキュメントのチュートリアルにも、edit コマンドを使う手順が追加されています。
組み込みビジュアルファイルエディタとは
CloudShell のシェルから edit <ファイルパス> を実行すると、CloudShell のタブが GUI エディタに切り替わり、ファイルをその場で編集できます。追加のインストールや設定は不要です。
編集内容の保存は、macOS では Cmd+S、Windows では Ctrl+S のキーボードショートカット、または画面右上の保存アイコンから行います。保存せずにタブを閉じようとした場合は、確認ダイアログが表示されます。
やってみた
前提条件
- AWS アカウントと、
AWSCloudShellFullAccess相当の権限を持つ IAM プリンシパル - 検証リージョン: ap-northeast-1(東京)
- CloudShell の実行環境: Amazon Linux 2023
存在しないファイルを指定して新規作成する
運用スクリプトを新規に書き起こす想定で、まだ存在しないファイル名を指定して起動します。
% mkdir -p ~/editor-demo && cd ~/editor-demo
% edit list-vpc.sh
エラーにはならず、空のエディタが開きました。タブ名がファイル名に変わり、画面右下には行番号と列番号、そして言語モードとして SH が表示されています。拡張子から自動的にシェルスクリプトとして認識されたことが分かります。

シンタックスハイライトを確認する
リージョン内の VPC を一覧化するスクリプトを入力します。
#!/bin/bash
# リージョン内の VPC を一覧化する
set -euo pipefail
REGION="ap-northeast-1"
echo "リージョン ${REGION} の VPC を一覧化します"
aws ec2 describe-vpcs --region "${REGION}" --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock,Default:IsDefault,State:State}' --output table
echo "一覧化が完了しました"
set などのシェルの組み込みコマンド、変数名、文字列リテラル、コメントがそれぞれ色分けされます。ダブルクォートで囲まれた文字列の中でも ${REGION} が変数参照として識別されており、単純なキーワードの色付けではないことが分かります。日本語のコメントや文字列も問題なく入力できました。

未保存の状態ではタブのファイル名の右側に黄色い丸印が表示され、変更が保存されていないことが分かるようになっています。
保存する
画面右上の保存アイコンをクリックすると、黄色い丸印が消えて保存済みの状態になりました。
Cmd+S のキーボードショートカットも試しました。ブラウザ側の「ページを保存」ダイアログが開くことはなく、エディタ側で処理されて保存されます。

ターミナルタブと並行して使う
エディタは実行元のターミナルタブを置き換える形で開くため、エディタを開いている間、そのタブではコマンドを実行できません。タブバーの「+」から新しい環境のタブを追加すると、エディタとターミナルを並行して利用できます。
新しいタブでファイルの状態を確認します。
% cd ~/editor-demo && ls -l
total 4
-rw-r--r--. 1 cloudshell-user cloudshell-user 335 Aug 18 05:41 list-vpc.sh
保存されたファイルはパーミッション 644 で作成されます。実行権限は付与されないため、スクリプトとして実行する場合は別途 chmod が必要です。
スクリプトを実行する
実行権限を付与して動かします。
$ chmod +x list-vpc.sh && ./list-vpc.sh
リージョン ap-northeast-1 の VPC を一覧化します
------------------------------------------------------------------
| DescribeVpcs |
+-------------+----------+-------------------------+-------------+
| CIDR | Default | ID | State |
+-------------+----------+-------------------------+-------------+
| 10.0.0.0/16| False | vpc-0b0642bd5008af386 | available |
| 10.0.0.0/16| False | vpc-042f4aca841352355 | available |
+-------------+----------+-------------------------+-------------+
一覧化が完了しました
エディタで書いたスクリプトが、そのままシェルから実行できました。エディタのタブを残したまま、別のタブでそのスクリプトを動かせています。

アクションパレット(F1)でショートカットを一覧する
エディタの右上には保存アイコンの隣にもう1つアイコンがあり、F1 キーでも同じものが開きます。「Open action palette」というアクションパレットで、利用できる操作とキーボードショートカットが一覧表示されます。
| アクション | ショートカット(macOS) |
|---|---|
| Find | Cmd+F |
| Find and replace | Cmd+Shift+F |
| Redo | Cmd+Y |
| Toggle block comment | Option+Shift+A |
| Toggle code folding | Cmd+Option+[ |
| Toggle line comment | Cmd+/ |
| Undo | Cmd+Z |

公式アナウンスでは触れられていませんが、行コメントやブロックコメントのトグル、コードの折りたたみにも対応しています。
検索・置換を試す
Cmd+Shift+F で検索・置換パネルを開きます。パネル左端の「Search mode」で Find と Replace を切り替えられます。
検索フィールドに ap-northeast-1、置換フィールドに us-west-2 を入力すると、検索フィールドの右側にマッチ件数が 1/1 と表示されました。「Replace all」をクリックすると置換が実行され、マッチ件数の表示が 0/0 に変わります。

検索オプションのメニュー(︙)には以下の3つが用意されています。
- RegEx(正規表現)
- Match case(大文字・小文字の区別)
- Whole words(単語単位の一致)
正規表現による検索・置換にも対応していることが確認できました。

undo で戻す
置換した内容を Cmd+Z で元に戻すと、ap-northeast-1 に復元されました。
ここで1点、挙動として押さえておきたい点があります。undo で内容をファイルと同じ状態に戻しても、タブの未保存マーカーは消えません。次の項目で扱う保存確認ダイアログも表示されます。ダーティ判定は編集操作の有無で行われており、内容の比較で行われているわけではないようです。
未保存のままタブを閉じる
未保存の状態でタブの閉じるボタンをクリックすると、確認ダイアログが表示されました。

「Close editor」を選ぶと変更は破棄されます。ターミナルからファイルを確認すると、置換前の内容のままでした。なお、エディタのタブを閉じると、edit を実行した元のターミナルセッションに戻ります。スクロールバックもそのまま残っていました。
エッジケースを試してみた
ここからは、公式アナウンスや公式ドキュメントに記載のない挙動を確認していきます。
ファイルサイズの上限は 300 KiB
20万行・約1.3MB のテキストファイルを開こうとしたところ、エラーになりました。
% edit large.txt
File is too large to edit, the file size should not exceed 300 kB
エラーメッセージには「300 kB」とありますが、実際の境界を二分探索で特定してみました。
% for n in 307200 307201; do
head -c $n /dev/zero | tr '\0' 'a' > s$n.txt
done
% edit s307201.txt
File is too large to edit, the file size should not exceed 300 kB
307,201 バイトはエラーになる一方、307,200 バイトのファイルはエディタで開けました。307,200 は 300 × 1024 であるため、実装上の閾値は 300 kB(SI 単位の 300,000 バイト)ではなく 300 KiB(307,200 バイト) ということになります。
CloudShell のサービスクォータのドキュメントにはコマンド長の上限(65,412文字)の記載はありますが、この編集可能なファイルサイズの上限については記載がありませんでした。
大きめのログファイルや、リソース数の多い CloudFormation テンプレートを扱う場合は、この上限を意識しておく必要があります。
バイナリファイルは開けない
バイナリファイルを指定した場合の挙動です。
% head -c 512 /dev/urandom > binary.bin
% edit binary.bin
File content contains invalid Unicode
UTF-8 として解釈できない内容のファイルは、明示的に拒否されます。ターミナルの表示が壊れることもありません。
ディレクトリ・存在しないパス・権限のないファイル
エラーになるケースをまとめて確認します。
% edit .
Path is not a file
% edit /notexist/foo.txt
Failed to create file: No such file or directory (os error 2)
% edit /etc/shadow
Unsupported file permissions: '', expected 'rw' or 'r'
いずれも終了コード 1 で、エラーの内容が区別できるメッセージになっています。
3つ目のメッセージからは、rw(読み書き)だけでなく r(読み取りのみ)の権限もサポート対象であることが読み取れます。
存在しないファイルを指定すると、その時点でファイルが作られる
2つ目のエラーメッセージが「Failed to create file」であった点が気になったため、確認してみました。存在しないファイル名でエディタを開き、何も入力せず、保存もせずにタブを閉じます。
% ls brandnew.txt
ls: cannot access 'brandnew.txt': No such file or directory
% edit brandnew.txt
# 何も入力せずにタブを閉じる
% ls -l brandnew.txt
-rw-r--r--. 1 cloudshell-user cloudshell-user 0 Aug 18 04:53 brandnew.txt
0 バイトの空ファイルが作成されていました。edit は起動時点でファイルを作成する実装になっているようです。タイプミスしたファイル名で起動すると、意図しない空ファイルが残る点は注意が必要です。
読み取り専用ファイルは閲覧のみ
パーミッション 444 のファイルを開いてみます。
echo 'CloudShell' > readonly.txt
chmod 444 readonly.txt
edit readonly.txt
エディタは正常に開き、内容も表示されます。しかし文字を入力してもテキストは一切変化せず、編集がブロックされました。
この状態で F1 のアクションパレットを開くと、表示されるアクションが Find と Toggle code folding の2つだけに絞られていました。編集系のアクション(Find and replace、Undo、Redo、各種コメントトグル)が除外されており、読み取り専用モードとして扱われていることが確認できます。

複数ファイルの同時指定は非対応
複数のファイルを引数に渡してみます。
% edit sample.py sample.json sample-template.yaml
error: unexpected argument 'sample.json' found
Usage: edit <FILE_PATH>
For more information, try '--help'.
引数はファイルパス1つのみです。複数のファイルを同時に開きたい場合は、タブを追加して edit をそれぞれ実行することになります。
言語判定は拡張子ベース
拡張子ごとの言語モードを確認しました。画面右下に判定結果が表示されます。
| ファイル | 言語モード |
|---|---|
| list-vpc.sh | SH |
| sample.py | Python |
| sample-template.yaml | YAML |
| 検証メモ.md | Markdown |
| readonly.txt | Text |
CloudFormation テンプレートを開いた場合は YAML として認識され、キーと値が色分けされるほか、ネスト構造に応じて折りたたみマーカーが行番号の右に表示されます。

この状態で Cmd+/ を押すと、YAML のコメント記号である # が行頭に挿入されました。言語モードに応じたコメント記号が使われます。

日本語のファイル名(検証メモ.md)も問題なく開けました。
一方、シェバン付きで拡張子のないファイルを開いた場合は、言語モードが Text になりました。
% printf '#!/bin/bash\necho "shebang あり・拡張子なし"\n' > noext-script
% edit noext-script
シンタックスハイライトも効いていません。言語判定は拡張子のみで行われており、シェバンは参照していないようです。拡張子を付けないスクリプトを CloudShell 上で管理している場合、ハイライトの恩恵は受けられません。
保存したファイルの末尾に改行が付かない
保存したスクリプトを確認していて気づいた挙動です。エディタ上では10行あるファイルを wc で数えると、行数が1つ少なくなります。
% wc -l -c list-vpc.sh
9 335 list-vpc.sh
% tail -c 3 list-vpc.sh | od -c
0000000 201 237 "
0000003
最終バイトはダブルクォートであり、改行(\n)で終わっていません。wc -l は改行の個数を数えるため、10行のファイルが9と表示されています。
POSIX ではテキストファイルの各行は改行で終わることが求められており、末尾改行がないファイルは Git の差分表示で \ No newline at end of file が付いたり、cat で連結した際に行が繋がったりします。エディタで作成・編集したファイルをそのまま Git 管理する場合は、意識しておきたい挙動です。
考察
実際に触ってみて、この機能が効いてくるのは「CloudShell 上に既にあるファイルを、少しだけ直したい」場面だと感じました。Vim の操作に慣れていない場合でも、AWS CLI の実行環境から離れることなくスクリプトや設定ファイルに手を入れられます。エディタのタブを閉じれば元のターミナルセッションにスクロールバックごと戻ってくるため、編集と実行の往復のコストはかなり小さくなっています。
一方で、今回の検証で見えた制約を整理すると、想定されている用途の範囲もはっきりします。
- 編集できるのは 300 KiB まで
- 引数は1ファイルのみで、複数ファイルを並べて開くにはタブを分ける必要がある
- ファイルツリーやディレクトリを開く機能はない(
edit .はエラー) - 言語判定は拡張子のみに依存する
- 保存したファイルの末尾に改行が付かない
ファイルツリーがなく1ファイル単位で開く設計であることからも、プロジェクト全体を扱う IDE ではなく、あくまで「シェルの中のエディタ」という位置付けであることが分かります。腰を据えた開発は従来どおりローカルの開発環境や IDE で行い、CloudShell 側は運用作業中の軽微な修正に使う、という住み分けになりそうです。
エラーハンドリングは丁寧に作り込まれている印象を受けました。ディレクトリ、バイナリ、権限不足、サイズ超過のいずれも、原因が区別できるメッセージが返ります。読み取り専用ファイルを開いた際にアクションパレットの項目まで絞り込まれる点にも、細かい配慮が感じられます。
バージョンが 0.1.3 であることを踏まえると、今後の機能追加も期待できそうです。特に以下のあたりが拡張されると、使い勝手はさらに上がりそうです。
最後に
AWS CloudShell に追加された組み込みビジュアルファイルエディタを、実際にマネジメントコンソールから試してみました。
edit <ファイルパス> を実行するだけで、セットアップなしにシンタックスハイライト付きの GUI エディタが起動します。検索・置換は正規表現にも対応しており、F1 のアクションパレットからショートカットを確認できます。編集したファイルはそのままシェルから実行でき、CloudShell 内で編集と実行を完結させられます。
一方で、編集可能なファイルサイズは 300 KiB まで、引数は1ファイルのみ、言語判定は拡張子ベース、保存したファイルには末尾改行が付かない、といった制約も確認できました。特にサイズ上限は公式ドキュメントに記載がないため、大きめのファイルを扱う際は事前に把握しておくとよいかと思います。
従来、AWS CloudShell で viで開き、コードを貼り付けるとインデントが入ることがありましたが、この挙動も改善しており、AWS CloudShell の実装が変わった可能性があります。CloudShell でスクリプトや IaC テンプレートを扱う機会のある方は、まず手元の環境で edit --version を実行して、この機能が利用できる状態か確認してみてはいかがでしょうか。
この記事がどなたかのお役に立てば幸いです。







