5年たったらAWS CLIの薄いラッパーコマンドが出来ていた

AWSを使い始めた頃からAWS CLIのコマンドを打つのが面倒になると作成していたスクリプトがある。自分のMacでしか動かすつもりがなかったが、Macを交換するタイミングでGitHubに上げた。
今どき使わない機能もあるが1年に1,2つくらい追加してきた感じ。出来はよくないが面倒だと思った時に追加してきたので面倒がなくなった。面倒なときにしか追加されないのでほとんどのawsコマンドが網羅されていない。

同じようなコマンドが同じ名前で存在したのでネーミングセンスがないっぽい。
左手で完結したかっただけなんだ・・・

<a href="https://github.com/ryo0301/saw"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/b0744966-e2b2-0c94-52e7-451530271458.png" width="460px"></a>

# 特徴

- awsコマンドと同じような使い方
- bashで書かれている
- コピペ駆動開発なので作り方を思い出す必要がない
- エラー処理が雑で `Ctrl-C` で止まらないことがある
- 自分のことしか考えていないので他人のPCで動かない可能性がある
- `.doc` にヘルプが書けるが自作なので見ない
- コンプリーターがある(bashのみ)
- aws-cli, jq, pecoに極度の依存。コマンドによってはnode.jsとssh-keygenに依存。

# コマンド

この中からいくつか紹介。
ディレクトリとファイルがそのままサービスとコマンドになっている。

```sh
$ saw
Usage: saw <service> <command>
dynamodb
└── count-table
ec2
├── list-instances
└── login-instance
iam
└── assume-role
kinesis
├── list-shards
├── list-streams
├── merge-shards
└── split-shard
lambda
├── exec-local
├── invoke-function
└── update-function
s3
├── get-object-by-version-id
└── list-object-versions
ssm
├── start-session
└── start-ssh-session
waf
└── list-ip-sets
```

## s3

### get-object-by-version-id

指定したS3オブジェクトのバージョンを `peco` でリストして、選択したバージョンをダウンロードする。

![s3getobjectbyversionid.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/53bdacd7-f0e4-8bc6-0729-10e1803d81f4.gif)

## ec2

### list-instances

EC2インスタンスのリストを `peco` でリストする。
単体では使わない。他のコマンド内部でよく使う。
リストは60分間キャッシュされるので2回目以降は速い。
`--no-cache` オプションを付けると最新のリストを取得し、キャッシュを更新する。
キャッシュの場所が `~/.saw` 以下なので、`~/.cache/saw` 以下にしたほうがいいのかも。

![ec2listinstances.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/7fb3674c-2b43-9310-7758-5a39407bf428.gif)

## kinesis

### list-shards

Kinesis Streamのシャードを `peco` でリストする。
`2 < 3` や `2 < 4` はシャード 2 から 3 と 4 にsplitしたということ。
お察しの通り `3+4 > 5` はシャード 3 と 4 を 5 としてmergeしたということ。
`CLOSED` なシャードは読み込み限定になり、しばらくして削除されたと思う。うろ覚え・・・
最後の巨大な数字2つは、キーの下限と上限。この2つが連続していないとmergeできない。

![kinesislistshards.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/f9be76c5-9375-d8f2-251e-41a70d17bd5c.png)

### split-shard

`peco` で選択したシャードをsplitする。

![kinesissplitshards.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/93f8bd50-c64b-44e8-4781-3bf4365d8ccc.gif)

### merge-shards

`peco` で選択した2つのシャードをmergeする。
隣接したシャードしかmergeできないのはKinesisの仕様通り。
`Ctrl+space` で複数選択できる(`peco` の機能)。

![kinesismergeshards.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/a7921c19-0a13-7dfd-f56a-ad118ae2ef97.gif)

## ssm

### start-ssh-session

一時キーペアを作成しEC2 Instance Connectで公開鍵を転送した後、Session Manager経由でEC2インスタンスにSSH接続する。キーペアは切断時に破棄される。
`--forward` パラメータでポートフォワーディングが出来る。
`--forward remote` でリモートポートフォワーディング。
`--forward local` でローカルポートフォワーディング。
今のところ接続先を経由してRDSに接続したりは出来ない。localhost固定になっているところを動的にすればすぐできるかも。

![ssmstartsshsession.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/4893df44-dd1c-dde1-4181-00768b2f088b.gif)

## lambda

### exec-local

AWS SAMがなかった頃にローカルでLambdaの開発がしたくて作ったコマンド。
Lambdaの設定をAWSから取得してくるので、コードなしでもファンクションが存在しないと動作しない。設定が取得できたら割り当てられたIAMロールをAssumeRoleして実際のファンクションの権限でコードを実行する。

![lambdaexeclocal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/651d4875-2eaa-b7ac-de51-d9468f522ef1.png)

## iam

### assume-role

AWS CLIにAssumeRoleしてくれる機能が実装されてなかった頃に作ったコマンド。
↓こちらの記事で書いたやつだったと思う。
[MacからAWSにアクセスする時はAssumeRoleすることにした](https://qiita.com/ryo0301/items/0730e4b1068707a37c31)

# その他のコマンド

- dynamodb count-table
セグメントごとにレコードをカウントして加算しているようだが並列処理になってない気がする。なんのために作ったのか思い出せない。

- ec2 login-instance
インスタンスを `peco` でリストして、選択したインスタンスに指定したキーペアでログインする。もう使う機会がなくなった。

- ssm start-session
Session Manager単体でEC2インスタンスにアクセスする。最近は `start-ssh-session` しか使ってない。

などなど。