CloudQueryでAWSをCLI操作する

# はじめに
皆様、普段AWSはどのようにして操作していますか？
恐らく最も一般的なものはWebGUI（マネージメントコンソール）ではないかと思います。
グラフィカルにほぼ全ての操作を行う事ができる中々優秀なツールではありますが、画面が重かったり配置がゴチャゴチャしており色々不満が出てきます。

そこで次に思うのはインフラらしくCLIで操作できないかという発想です。
AWSでは公式からツールが出ており、helpドキュメントやリファレンスも充実しています。
というわけでとりあえずVMの一覧でも表示すべく

```bash:command-prompt
aws ec2 describe-instances
```

なんて叩いてみたところ

![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/134838/5d32dd1f-9053-c836-5628-691f70880ac8.gif)

／（＾ｑ＾）＼　わけわかめ

* マネージメントコンソールへのログインは面倒
* 長いコマンドを覚えられず毎回ググってしまう
* 直感的、簡単に操作したい
* 簡単なパイプ渡しで絞り込みや自動化を行いたい

こんな課題を解決すべく他にCLIのツールが無いか探してみましたがどうやら存在しないようでしたので（2016/11/30現在）「無いものは作ろう！」というわけでツールを作り Cloud Query と名前を付けOSSとしてリリースしました。
コマンドとしては cq となります。
ソースコードは[GitHub: cq](https://github.com/ap-communications/cq)です。


# 画面イメージ
![cq_sample.gif](https://qiita-image-store.s3.amazonaws.com/0/134838/88372c6b-1d57-1810-1994-7fa1ddeb1729.gif)


# インストール
[公式ドキュメントに則ってAPIキーを発行し](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey)、端末に設定して下さい。
設定は環境変数を使うのが一番簡単です。

```bash:LINUX
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx     # アクセスキーID
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx  # シークレットアクセスキー
```

```bash:Windows
set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx     # アクセスキーID
set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx  # シークレットアクセスキー
```

設定が終わったら[GitHub: release](https://github.com/ap-communications/cq/releases)からOSごとのバイナリーをダウンロードして下さい。

基本的なコマンドと実行イメージは[GitHub: readme](https://github.com/ap-communications/cq/blob/master/README.md)に書いてあります。


# TIPS
## 起動中のインスタンスのみを表示する
grepを使って絞ります。

```bash
[root@localhost ~]# cq vm list | grep "running"
NAME-TAG                        INSTANCE-ID     STATE           GLOBAL          LOCAL           AZ                      PROVIDER
testserver01                    i-895ba307      running         NULL            172.20.1.68     ap-northeast-1c         AWS
testserver02                    i-d4a55d4a      running         NULL            172.20.0.220    ap-northeast-1a         AWS
```

## 停止中のインスタンスを全てまとめて起動する
grepで停止中のインスタンス一覧を表示し、awkのスペース区切りで2番目（インスタンスID）の一覧を取り出し、それを起動コマンドに渡してあげます。

```bash
[root@localhost ~]# cq vm start `cq vm list | grep "stopped" | awk '{ print $2 }'`
Success!  i-8ba307f6   stopped  ===>  pending
Success!  i-f68dbdb9   stopped  ===>  pending
Success!  i-ddf6a857   stopped  ===>  pending
Success!  i-e5b4496a   stopped  ===>  pending
```

## 一覧をCSVで出力する
cq vm list -d オプション(--delimiterも可)を使うと好きな区切り文字で出力することができます。
例えば以下のようにするとカンマ区切り出力になります。

```bash
[root@localhost ~]# cq vm list -d ,
NAME-TAG,INSTANCE-ID,STATE,GLOBAL,LOCAL,AZ,PROVIDER
testserver01,i-895ba307,stopped,NULL,172.20.1.68,ap-northeast-1c,AWS
testserver02,i-d5bdf64a,stopped,NULL,172.20.0.220,ap-northeast-1a,AWS
testserver03,i-e485796a,stopped,NULL,172.20.5.6,us-east-1d,AWS
```

これをファイルにリダイレクトしてあげればCSVファイルになります。

```bash
[root@localhost ~]# cq vm list -d , > testfile.csv
```

カンマ以外でも文字列なら何でも（1文字じゃなくても）区切りにできるため各自お好きなもので区切って下さい。
ちなみに、NameTagに区切り文字と同じものが含まれていた場合はダブルクォーテーションで囲うため、うっかり区切りが増えちゃうといった事故は起きません。

## cq vm easyup が勝手に作ったセキュリティーグループをまとめて削除する
ちょこまかVMを作っているとゴミが大量に残るかと思います。
そういった場合は先のVM一斉起動と同様にしてまとめて削除できます。
但しいずれかのVMにアタッチされているグループは削除できません。
デフォルトでは削除確認が出ますので --force もしくは -f オプションで確認無しの削除にして下さい。

```bash
[root@localhost ~]# cq acl destroy --force `cq acl list | grep "cq_temporary_sg" | awk '{ print $3}'`
Success!
Success!
Success!
Success!
```


# 今後やりたいこと
* 他クラウドに対応し、統一感ある操作性の実現
* 既存のマネージメントコンソール、CLIには無い機能の実装
  * cronと連携し複雑な作り込み無しにスナップショットを世代管理
  * コマンド一発でRDSのバックアップ、リストア　（RDSは停止ができず開発環境でもお金が嵩み易い）
  * その他構想中