既存のAWS環境の構成情報をCLIでゲットしたい

## はじめに
### 経緯
記事作成の経緯としては、AWS上で動作しているアプリケーションを組織的に展開する必要があり、AWS環境で利用している各種サービスについて、設定情報をダンプする必要がある状況だった。仲間からの「Jsonで全部の情報をダンプ出来たら楽じゃない？」というアイデアに基づき、下記情報を参考に、BatchGetResourceConfigの動作確認をしてみた内容のメモです。
[AWS Config が、複数のリソースに対する現在の設定の取得をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2018/03/aws-config-now-supports-retrieval-of-current-configuration-for-multiple-resources/)
[BatchGetResourceConfig](https://docs.aws.amazon.com/config/latest/APIReference/API_BatchGetResourceConfig.html)
### 環境など
- aws-cli/1.16.313 Python/3.5.2 Linux/4.4.0-142-generic botocore/1.13.49
- pip 19.3.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

※実際に案件でこのコマンドを利用する必要がある場合は、ご自身でもAWSのドキュメントを参照、必要に応じて実機で検証した上で、対応を検討してください。

## 調査結果
### APIの仕様
ざっくりとした概要は以下。

- Resource TypeおよびResource ID（この2つのセットをResource Keyと呼ぶ）を指定するとAWSマネージメントコンソール上で設定している項目はひととおり、jsonとしてExportしてくれる。（CustomerGatewayで確認した限りは管理コンソールで設定している内容が一通り出力された。）
- 複数指定可能であり、大量に指定する場合は `--cli-input-json` オプションを使うと便利。

※ドキュメント
https://docs.aws.amazon.com/config/latest/APIReference/API_BatchGetResourceConfig.html
https://docs.aws.amazon.com/cli/latest/reference/configservice/index.html#cli-aws-configservice

### コマンド実行例

```cmd:単品指定
$ aws configservice batch-get-resource-config --resource-keys resourceType="AWS::EC2::CustomerGateway",resourceId="cgw-01234567abcdefh" --region ap-northeast-1 --profile my-profile1
{
    "baseConfigurationItems": [
        {
            "arn": "arn:aws:ec2:ap-northeast-1:123456789012:customer-gateway/cgw-01234567abcdefh",
            "accountId": "123456789012",
            "configurationItemStatus": "ResourceDiscovered",
            "configurationItemCaptureTime": 1234567890.123,
            "version": "1.3",
            "awsRegion": "Not Applicable",
            "resourceType": "AWS::EC2::CustomerGateway",
            "availabilityZone": "Not Applicable",
            "configuration": "{\"bgpAsn\":\"XXXXXX\",\"customerGatewayId\":\"cgw-01234567abcdefh\",\"ipAddress\":\"192.168.0.123\",\"certificateArn\":null,\"state\":\"available\",\"type\":\"ipsec.1\",\"deviceName\":null,\"tags\":[{\"key\":\"Name\",\"value\":\"My Customer Gateway for XXX\"}]}",
            "resourceId": "cgw-01234567abcdefh",
            "configurationStateId": "1234567890123",
            "supplementaryConfiguration": {}
        }
    ],
    "unprocessedResourceKeys": []
}
$
```
※細かい値は編集してますが、イメージとして上記のような感じで出力される。
※ConfigurationのValueが主にマネージメントコンソール上での設定項目にほぼ相当していた。（GUIには表示されていた情報で明らかに不足していたのは、どのVPCに属するか、の情報だけ。気づいた限り。）


```cmd:複数指定
$ aws configservice batch-get-resource-config  --region ap-northeast-1 --profile my-profile1 --cli-input-json file://request.json
```
※複数していでjson使う場合は上記のように対応。

### 困ったこと
--cli-input-jsonの用意をするために、Jsonのファイルを一括で作成したい状況だった。
「list-discovered-resourcesコマンドがつかえるかも？？」と思い試したところ、便利ではあったが、万能ではなかった。具体的には、--resource-typeとして設定できるものは「Possible values」に定義されているものだけのようであったこと。
※[list-discovered-resources](https://docs.aws.amazon.com/cli/latest/reference/configservice/list-discovered-resources.html)

とりあえず、サポートされる全リソース(90個)分、shellで実行して、sedで編集してインプット用jsonファイルを用意した。

## おわりに
既存アプリの横展開に向けた構成情報の洗い出しという意味では、結局のところ、Lambdaの処理やS3 Select等、設計書情報が必要なものなどものあり、BatchGetResourceConfigだけで賄えるものではなかった（当然）ので、個別のリソースに応じて、ドキュメントを用意してもらったり。get configやdescribeコマンドを実行したりExportしたり、いろいろ細々した作業は発生した。（それぞれ種類や用途が異なるサービスであり、出力したい情報も異なるので当然だと思う。設定だけExportできていればいいもの、スクリプトをExportしなくてはいけないもの、(DB系だと)スキーマ情報をExportしたいもの、等さまざまなので。）
もともとの依頼に対しては、手動作業やいろいろ交えて、何とか完了できたので良しとした。
もっとスマートな対応方法をご存知の方がいらっしゃったら、ぜひ、教えていただきたい！

以上。