AWSのリソース一覧を出力できるツール AWSets を試してみた 

## AWSets とは
AWSets は AWS アカウント内をクロールし、対応するリソースの一覧を json 形式で
出力可能な Go 製のコマンドラインツールです。
北米のプレミアコンサルティングパートナーである Trek10 社が開発、OSS として公開しています。

https://github.com/trek10inc/awsets

現時点ではすべての AWS リソースに対応しているわけではありませんが、
2020/9/13 時点で 200 以上のリソースに対応しています。

https://github.com/trek10inc/awsets/blob/master/supported_resources.md
 
複数のリージョンに同時にクエリを実行しつつ、リージョンやサービスでフィルタリングが
可能であったり、リソース間の依存関係を保持した情報を出力してくれるのが特徴です。

## インストール
GitHub のリリースページからバイナリファイルをダウンロード可能です。

https://github.com/trek10inc/awsets/releases

以降では、2020/9/13 時点の最新バージョンである、v0.2.4 で確認しています。

```shell-session
$ awsets version
awsets - version: 0.2.4 commit: b5be906179904d9d412a70332d9d33b06fdd84df  date: 2020-09-09T19:58:18
```

## 使用方法
認証情報は .credentials ファイルの情報を読み取ってくれるようです。
使用するプロファイルを切り替えたい場合は、`AWS_RROFILE` 環境変数で指定すれば OK です。


### awsets list
リソース情報を取得します。単に list コマンドを実行した場合、全リージョン、全対応リソースの
情報を取得しますが、`--region` オプションでリージョン、`--include`, `--exclude` で
対象のサービスをフィルタリングすることができます。

以下の例は、東京リージョンの EC2 に関連するリソースを取得します。

```shell-session
$ awsets list --regions ap-northeast-1 -o ec2.json --include ec2
```

ツールで取得された情報は 以下のような json 形式で保存されます。
jq コマンドや jmespath などでで処理することを前提にしているようです。
以下の例では Relations という形で EC2 インスタンスに紐づくリソースを確認できます。

```ec2.json
[
 {
    "Account": "123456789012",
    "Region": "ap-northeast-1",
    "Id": "i-xxxxxxxxxxxxxxxxx",
    "Version": "",
    "Type": "ec2/instance",
    "Name": "i-xxxxxxxxxxxxxxxxx",
    "Attributes": {
      "AmiLaunchIndex": 0,
      "Architecture": "x86_64",
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/xvda",
          "Ebs": {
            "AttachTime": "2020-09-13T03:03:57Z",
            "DeleteOnTermination": true,
            "Status": "attached",
            "VolumeId": "vol-xxxxxxxxxxxxxxxxx"
          }
        }
      ]
      ~~省略~~
    }
    "Tags": {
      "Name": "test-instance"
    },
    "Relations": [
      {
        "Account": "123456789012",
        "Region": "ap-northeast-1",
        "Id": "subnet-xxxxxxxxxxxxxxxxx",
        "Version": "",
        "Type": "ec2/subnet"
      },
      {
        "Account": "123456789012",
        "Region": "ap-northeast-1",
        "Id": "vpc-xxxxxxxxxxxxxxxxx",
        "Version": "",
        "Type": "ec2/vpc"
      },
      {
        "Account": "123456789012",
        "Region": "ap-northeast-1",
        "Id": "sg-xxxxxxxxxxxxxxxxx",
        "Version": "",
        "Type": "ec2/securitygroup"
      },
      {
        "Account": "123456789012",
        "Region": "ap-northeast-1",
        "Id": "eni-xxxxxxxxxxxxxxxxx",
        "Version": "",
        "Type": "ec2/networkinterface"
      },
      {
        "Account": "123456789012",
        "Region": "ap-northeast-1",
        "Id": "vol-xxxxxxxxxxxx",
        "Version": "",
        "Type": "ec2/volume"
      }
    ]
  },
~~省略~~
]
```

### awsets process
実験的な機能として出力した json ファイルを加工するため機能が用意されています。
v0.2.4 時点では process bot コマンドが使用可能です。
json ファイルのデータ構造をグラフとして表現する DOT 言語形式のファイルに変換することができます。

```shell-session
$ awsets process dot -i ec2.json -o ec2.dot
```

DOT ファイルは [Graphviz](https://graphviz.org/) などの描画ツールを使用することで
グラフを SVG や PNG など任意のイメージ形式で出力することができます。

```
$ dot ec2.dot -T svg -o ec2.svg
```

変換後のイメージの一部ですが、以下のように描写されます。
多くのリソースがある環境では複雑なグラフになってしまいますが
削除されて既に存在しないリソースは赤、関係性を持たないリソースは黄色で表示されるため、
孤立したリソースや使用されていないリソースをすぐに判別することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/d8835182-d182-a8dc-8397-ddca01d32d7a.png)

複数リージョンの情報をもつファイルを変換した場合、リージョン毎にグラフが描写されます。

### awsets region
region コマンドは 使用している認証情報に紐づくアカウントで有効になっている
リージョンの一覧が表示されます。

### awsets types
サポートしているリソースのタイプを表示します。
表示される内容は、以下の内容と同じです。

https://github.com/trek10inc/awsets/blob/master/supported_resources.md

以上です。
参考になれば幸いです。