aws-shellによるaws-cliの楽々実行

AWS CLI

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、藤本です。

aws-cliはAWSのAPIをコマンドラインで実行することができ、大変多くの操作を行うことができます。その反面、多機能過ぎてサブコマンド名やオプション名、オプションの使い方を覚えるのが大変です。シェルのCompletionを利用することでサブコマンド名、オプション名の入力補完である程度簡略化できますが、それでも複数コンソール立ち上げてhelpと行ったり来たり、マネジメントコンソールと行ったり来たりしています。そんなあなた(私)へaws-shellの利用をオススメします。

aws-shell

aws-shellはGitHubのawslabsで提供されているaws-cliの効率化ツールです。昨年の9月頃に公開されています。aws-shellはまだ開発者向けのプレビュー版です。

aws-shellは以下のような機能を提供しています。(2016/07/24時点)

  • サジェスト/オートコンプリート
    • サブコマンド
    • オプション
    • オプションに応じた値
    • AWSリソース
    • ファジー検索
  • ヘルプ表示
  • シェルコマンド
  • プロファイルサポート
  • 履歴管理

それでは各種機能を実際に体験しながらご紹介します。

インストール

aws-shellはPython実装です。PyPI、もしくはHomebrewで配布しています。今回はPyPIからインストールしました。

PyPI

# pip install aws-shell
Collecting aws-shell
Collecting boto3<2.0.0,>=1.2.1 (from aws-shell)
  Using cached boto3-1.3.1-py2.py3-none-any.whl
Collecting configobj<6.0.0,>=5.0.6 (from aws-shell)
Collecting awscli<2.0.0,>=1.10.30 (from aws-shell)
  Downloading awscli-1.10.49-py2.py3-none-any.whl (970kB)
    100% |████████████████████████████████| 972kB 184kB/s
Collecting Pygments<3.0.0,>=2.1.3 (from aws-shell)
  Using cached Pygments-2.1.3-py2.py3-none-any.whl
Collecting prompt-toolkit<1.1.0,>=1.0.0 (from aws-shell)
  Using cached prompt_toolkit-1.0.3-py2-none-any.whl
Collecting botocore<1.5.0,>=1.4.1 (from boto3<2.0.0,>=1.2.1->aws-shell)
  Using cached botocore-1.4.39-py2.py3-none-any.whl
Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from boto3<2.0.0,>=1.2.1->aws-shell)
  Using cached futures-3.0.5-py2-none-any.whl
Collecting jmespath<1.0.0,>=0.7.1 (from boto3<2.0.0,>=1.2.1->aws-shell)
  Using cached jmespath-0.9.0-py2.py3-none-any.whl
Collecting six (from configobj<6.0.0,>=5.0.6->aws-shell)
  Using cached six-1.10.0-py2.py3-none-any.whl
Collecting s3transfer==0.0.1 (from awscli<2.0.0,>=1.10.30->aws-shell)
  Using cached s3transfer-0.0.1-py2.py3-none-any.whl
Collecting colorama<=0.3.7,>=0.2.5 (from awscli<2.0.0,>=1.10.30->aws-shell)
  Using cached colorama-0.3.7-py2.py3-none-any.whl
Collecting rsa<=3.5.0,>=3.1.2 (from awscli<2.0.0,>=1.10.30->aws-shell)
  Using cached rsa-3.4.2-py2.py3-none-any.whl
Collecting docutils>=0.10 (from awscli<2.0.0,>=1.10.30->aws-shell)
Collecting wcwidth (from prompt-toolkit<1.1.0,>=1.0.0->aws-shell)
  Using cached wcwidth-0.1.7-py2.py3-none-any.whl
Collecting python-dateutil<3.0.0,>=2.1 (from botocore<1.5.0,>=1.4.1->boto3<2.0.0,>=1.2.1->aws-shell)
  Using cached python_dateutil-2.5.3-py2.py3-none-any.whl
Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli<2.0.0,>=1.10.30->aws-shell)
  Using cached pyasn1-0.1.9-py2.py3-none-any.whl
Installing collected packages: six, python-dateutil, jmespath, docutils, botocore, futures, boto3, configobj, s3transfer, colorama, pyasn1, rsa, awscli, Pygments, wcwidth, prompt-toolkit, aws-shell
Successfully installed Pygments-2.1.3 aws-shell-0.1.1 awscli-1.10.49 boto3-1.3.1 botocore-1.4.39 colorama-0.3.7 configobj-5.0.6 docutils-0.12 futures-3.0.5 jmespath-0.9.0 prompt-toolkit-1.0.3 pyasn1-0.1.9 python-dateutil-2.5.3 rsa-3.4.2 s3transfer-0.0.1 six-1.10.0 wcwidth-0.1.7

Homebrew

# brew install aws-shell
==> Downloading https://homebrew.bintray.com/bottles/aws-shell-0.1.0.yosemite.bottle.tar.gz
Already downloaded: /Users/fujimoto.shinji/Library/Caches/Homebrew/aws-shell-0.1.0.yosemite.bottle.tar.gz
==> Pouring aws-shell-0.1.0.yosemite.bottle.tar.gz
?  /usr/local/Cellar/aws-shell/0.1.0: 2,039 files, 22M

起動

aws-shellを起動します。起動はaws-shellコマンドを実行するだけです。初回起動時はキャッシュ生成のため少々時間がかかります。(といっても10秒弱)

# aws-shell --help
usage: aws-shell [-h] [-p PROFILE]

optional arguments:
  -h, --help            show this help message and exit
  -p PROFILE, --profile PROFILE
                        The profile name to use when starting the AWS Shell.

# aws-shell
First run, creating autocomplete index...
Creating doc index in the background. It will be a few minutes before all documentation is available.
aws>

機能確認

それでは上で紹介した機能を画像付きでご紹介します。

サジェスト/オートコンプリート

サブコマンド

リソースのサブコマンド、リソースに対する操作のサブコマンドの候補が表示され、入力補完することができます。[Tab]キーや[↑↓]キーなどで候補から選択することが可能です。シェルの候補選択とは異なり、Enterキーを押下すると実行となるのでご注意ください。

eを入力すると、ec2elbなど前方一致する候補が表示されます。

1__aws-shell__python2_7_ 2

同様にec2の後に、describeを入力するとdescribe-instancesdescribe-securitygroupsなど候補が表示されます。

1__aws-shell__python2_7_ 3

オプション

オプションもサブコマンドに応じた候補が表示され、入力補完することができます。

1__aws-shell__python2_7_ 4

オプションに応じた値

オプションに指定する値の形式が決まっていれば、フォーマットの候補が表示され、入力補完することができます。例えば、describe-instances--filtersなどが対象となります。

1__aws-shell__python2_7_ 5

AWSリソース

AWSリソースのID(インスタンスIDやセキュリティグループID)やDynamoDBのテーブル名、S3のバケット名などの候補が表示され、入力補完することができます。バックグラウンドでboto3を実行、AWS APIをコールし、リソースの一覧を取得しています。例えば、describe-instances--instance-idsにて、インスタンスIDを取得しています。

1__aws-shell__python2_7_ 6

ファジー検索

ファジー検索はほぼユニグラムの検索となります。ファジー検索はターミナル下部にあるファンクションキーにてON/OFFを切り替えることができます。今までの操作はファジー検索をOFFとした場合の結果です。ファジー検索をONすると以下のようにサジェスト表示される項目が増えます。

1__aws-shell__python2_7_ 8

ヘルプ表示

ヘルプ表示もターミナル下部にあるファンクションキーにてON/OFFを切り替えることができます。
入力済みのサブコマンドやオプションはターミナル下部にhelpコマンドを実行して表示されるメッセージが表示され、候補の下に簡略したヘルプメッセージが表示されます。

1__aws-shell__python2_7_ 9

シェルコマンド

通常コマンド実行

単純なシェルコマンドは!のあとにコマンドを入力することで実行できます。viエディタのような感じです。

1__aws-shell__python2_7_ 10

パイプによるコマンド実行

パイプによってaws-cliの標準出力を標準入力としてコマンドを繋げることができます。なので、jqを利用することができるのは嬉しいですね。

1__aws-shell__python2_7_ 11

プロファイルサポート

$HOME/.aws/credentialsに定義したプロファイルを利用することができます。プロファイルを利用する場合、aws-shell起動時のオプションに--profileを利用するか、aws-shell内で.profileコマンドで切り替え、表示が可能です。

# aws-shell --profile other
aws> .profile
Current shell profile: other

aws> .profile default
Current shell profile changed to: default

aws> .profile
Current shell profile: default

履歴管理

aws-shell内で実行したコマンドはシェルとは異なる場所に別途管理されます。$HOME/.aws/shell/hisotryで管理されます。コマンドの実行時間と実行したコマンドが記録されます。AWSの操作だけを別途管理できるのは嬉しいですね。

aws> !cat ~/.aws/shell/history

# 2016-07-24 12:17:46.505892
+ec2 describe-instances

# 2016-07-24 12:19:01.224635
+.profile default

# 2016-07-24 12:19:04.283101
+.profile

# 2016-07-24 12:21:30.749357
+!cat ~/.aws/shell/history

まとめ

いかがでしたでしょうか?
今のところ2,3ヶ月利用していますが、便利なことしかないので使わない理由が見当たらないです。