はじめに
経緯
記事作成の経緯としては、AWS上で動作しているアプリケーションを組織的に展開する必要があり、AWS環境で利用している各種サービスについて、設定情報をダンプする必要がある状況だった。仲間からの「Jsonで全部の情報をダンプ出来たら楽じゃない?」というアイデアに基づき、下記情報を参考に、BatchGetResourceConfigの動作確認をしてみた内容のメモです。
AWS Config が、複数のリソースに対する現在の設定の取得をサポート
BatchGetResourceConfig
環境など
- 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
コマンド実行例
$ 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に属するか、の情報だけ。気づいた限り。)
$ 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
とりあえず、サポートされる全リソース(90個)分、shellで実行して、sedで編集してインプット用jsonファイルを用意した。
おわりに
既存アプリの横展開に向けた構成情報の洗い出しという意味では、結局のところ、Lambdaの処理やS3 Select等、設計書情報が必要なものなどものあり、BatchGetResourceConfigだけで賄えるものではなかった(当然)ので、個別のリソースに応じて、ドキュメントを用意してもらったり。get configやdescribeコマンドを実行したりExportしたり、いろいろ細々した作業は発生した。(それぞれ種類や用途が異なるサービスであり、出力したい情報も異なるので当然だと思う。設定だけExportできていればいいもの、スクリプトをExportしなくてはいけないもの、(DB系だと)スキーマ情報をExportしたいもの、等さまざまなので。)
もともとの依頼に対しては、手動作業やいろいろ交えて、何とか完了できたので良しとした。
もっとスマートな対応方法をご存知の方がいらっしゃったら、ぜひ、教えていただきたい!
以上。