aws-shell で aws-cli での作業効率を3倍にする

# はじめに
re:Inventでアナウンスされていたaws-shellプロジェクトがavailableになりました。
ハンズオンしてみたところ、かなりいい感じだったのでまとめました。

参考
https://aws.amazon.com/jp/about-aws/whats-new/2015/12/aws-shell-accelerates-productivity-for-aws-cli-users/

# aws-shellとは？
githubのリポジトリには、`The interactive productivity booster for the AWS CLI`とあります。
aws-cliの為の、生産性を向上させるようなインタラクティブなツールという位置づけです。

また、リポジトリを見る限り`Developer Preview` のステータスなので、その点は注意が必要です。

# さっそく
リポジトリはこちらです :octocat: 
https://github.com/awslabs/aws-shell

利用したバージョンは、0.0.1です。

# インストール
pipで簡単にインストールできます。
パスが通っているので、ちゃんとインストールできているようです。

```console
$ sudo pip install aws-shell
Password:
Downloading/unpacking aws-shell
  Downloading aws-shell-0.0.1.tar.gz (45kB): 45kB downloaded
  Running setup.py (path:/private/tmp/pip_build_root/aws-shell/setup.py) egg_info for package aws-shell
  (略)
$ type aws-shell
aws-shell is /usr/local/bin/aws-shell
```

## エラーになる
早速実行してみたら、なんかエラーでた。

```console
$ aws-shell
Traceback (most recent call last):
  File "/usr/local/bin/aws-shell", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2797, in <module>
    parse_requirements(__requires__), Environment()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 580, in resolve
    raise VersionConflict(dist,req) # XXX put more info here
pkg_resources.VersionConflict: (botocore 1.3.13 (/Library/Python/2.7/site-packages), Requirement.parse('botocore==1.2.8'))
```

そんな時は、aws-cliを最新版にします。

```console
$ sudo pip install --upgrade awscli
```

こんどはうまく動きました。プロンプトがでればOKです。

```console
$ aws-shell
aws>
```

## 設定する
Access Key ID と　Secret Access Keyを設定します。
すでにaws-cliの設定がしてあり`$HOME/.aws/credentials`がある場合は、defaultの設定を読み込むようです。

```console
aws> configure
AWS Access Key ID [****************DKNA]:
AWS Secret Access Key [****************TnQa]:
Default region name [ap-northeast-1]:
Default output format [json]:
```

# どんな機能があるの？
## 自動補完
cliにもある自動補完ですが、より強化されています。
Tabキーでポップアップの項目を選択することができ、Shift + Tabキーで戻ることも可能です。
<img width="838" alt="スクリーンショット 2015-12-16 11.22.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/91bdfe2c-72df-cf90-5dcd-9f2fcffb7b53.png">

また、コマンドが確定するとそのコマンドのヘルプが画面下部に表示されます。ハイフンを入力すれば、オプションも補完されますし、インラインでヘルプを表示してくれます。
<img width="832" alt="スクリーンショット 2015-12-16 11.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/b78ac873-c940-991a-8d66-ddd57d153ffa.png">

さらに、オプションでは入力例まで表示してくれます。まじ便利すぎる。
<img width="829" alt="スクリーンショット 2015-12-16 11.25.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/4815be37-c7a4-1fed-1719-79a456f179d7.png">

## Server Side Auto Completion
補完はさらに進化して、インスタンス名の補完までやってくれます！すごい。
<img width="840" alt="スクリーンショット 2015-12-16 11.30.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/309a4275-954f-f79b-053c-da582da28d11.png">

## Fuzzy Search
コマンド名は一部で検索することもできます。普通にコマンドの一部分だけでなく、頭文字を取った検索や、先頭数文字づつを取った検索などにも対応しています！

`ddo`で検索すると`describe-dhcp-options`や`delete-dhcp-options`の頭文字を取って検索した結果が返ってきます。
<img width="567" alt="スクリーンショット 2015-12-16 11.37.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/d7c66600-7361-c698-2178-d3c9aed4bb3c.png">

`desins`で`describe-instances`などが検索できる例です。
<img width="838" alt="スクリーンショット 2015-12-16 11.35.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/baaf34de-413e-cbf1-6b45-7c21d13da9ee.png">
 
## キーバインディング
画面下部に表示されているツールバーオプションから、F3キーでEmacsとViをToggleで切り替えることができます。
自分はViに設定しました。

## コマンド実行も可能
`!`を先頭につけることで任意のコマンドを実行させることもできます。

```console
aws> !date
2015年 12月16日 水曜日 11時43分36秒 JST
```

## その他

他にも、コマンドのヒストリーが見れたり、画面下部のツールバーからaws-shellの挙動について設定変更ができたりします。また、`.edit`というコマンドを利用することで、セッション中のヒストリーからShell Scriptを作成することもできます。

あと、aws-shellから抜ける場合は`F10`でもいいですが、`Ctrl + D`のほうが個人的にはしっくりきました。

# まとめ
補完系を大きく進化させて、冗長なコマンドもヘルプを行ったり来たりせずにいろいろできるようになりそうです。使い方によっては**3倍以上の作業効率アップも狙える**と思います。

現時点の欠点としては、複数のアカウントを切り替えらないことなどがありますが、こちらは[Issue](https://github.com/awslabs/aws-shell/issues/9)が立てられていますので、そのうち改善されると思います。

terminalで作業する時間が長ければ長いほど、aws-shellから受ける恩恵が大きそうです。