こんにちは。AWS CLIが好きな福島です。
はじめに
唐突ですが、マルチアカウント構成の場合、どのアカウントにどんなリソースを作成しているか把握するのは大変かと存じます。
ということで今回はConfig Aggregatorを利用して、全AWSアカウントに存在するリソース情報を取得するコマンドをいくつかご紹介いたします。
そもそも、AWS Config Aggregatorとは?
一言で言うと、個々のAWSアカウントでAWS Configにより管理している構成情報を1つのAWSアカウントに集約できる機能となります。
そのため、AWS Config Aggregatorを利用すれば、全AWSアカウントのリソース情報を簡単に確認することができます。
前提
今回は、AWS Config Aggregatorのセットアップが完了している必要がございます。 セットアップがまだの場合、以下のドキュメントを参考にセットアップを行ってください。
https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/setup-aggregator-console.html
事前準備
AWS Config Aggregatorは、複数作成することが可能なため、 まずは利用するAWS Config Aggregatorを変数に定義しておきます。
configuration_aggregator_name=""
AWS Config Aggregatorの名前は以下のコマンドで確認可能です。
aws configservice describe-configuration-aggregators --query "ConfigurationAggregators[].[ConfigurationAggregatorName]" --output text
EC2の情報取得
今回は、以下の情報を取得してみます。
- Nameタグ
- インスタンスID
- アカウントID
- リージョン
- プラットフォーム
- プライベートIP
- インスタンスタイプ
- Applicationタグ
実行コマンド
aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::EC2::Instance'" \ | jq -r '.Results[] | fromjson | [ (.tags[] | select(.key == "Name").value) // "null", .resourceId, .accountId, .awsRegion, .configuration.platform // "null" , .configuration.privateIpAddress, .configuration.instanceType, (.tags[] | select(.key == "Application").value) // "null"] | @tsv' \ | column -t | sort
実行結果例
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ > --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::EC2::Instance'" \ > | jq -r '.Results[] | fromjson | > [ (.tags[] | select(.key == "Name").value) // "null", > .resourceId, > .accountId, > .awsRegion, > .configuration.platform // "null" , > .configuration.privateIpAddress, > .configuration.instanceType, > (.tags[] | select(.key == "Application").value) // "null"] > | @tsv' \ > | column -t | sort fk-test-dev-01 i-xxxxxxxxxxxxxxxxx 111111111111 ap-northeast-1 windows 10.0.0.4 t2.micro fk fk-test-stg-01 i-xxxxxxxxxxxxxxxxx 222222222222 ap-northeast-1 windows 10.1.0.4 t2.micro fk fk-test-prd-01 i-xxxxxxxxxxxxxxxxx 333333333333 ap-northeast-1 windows 10.2.0.4 t4g.nano fk fk-test-prd-02 i-xxxxxxxxxxxxxxxxx 333333333333 ap-northeast-1 windows 10.2.0.5 t4g.nano fk
コマンドの説明
aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration-aggregator-name} \
select-aggregate-resource-configを使い、指定したConfig Aggregatorから情報を出力できます。
--expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::EC2::Instance'" \
--expressions オプションは必須となります。 この引数にSQL文を入力することで様々な情報を抽出できます。 今回は、resourceType が AWS::EC2::Instance でフィルターして、欲しい情報(awsRegion, accountId, tags, resourceId, configuration)をSELECTしています。
補足ですが、どういった情報をSELECTできるかは、Configの各リソースからJSONを確認できるため、これを参考にします。
また、本来はこの2行で情報を抽出できるのですが、3行目以降で見やすいように整形しています。
| jq -r '.Results[] | fromjson |
select-aggregate-resource-configの実行結果のResultsの中には、"
をエスケープするために¥
が入っているため、
fromjson を使い、いい感じにしています。
[ (.tags[] | select(.key == "Name").value) // "null",
tagsの中にはタグが複数存在するため、KeyがNameのValueだけ出力するようにしています。 また、Nameタグがない場合は、null が表示されるようにしています。
.resourceId, .accountId, .awsRegion, .configuration.platform // "null" , .configuration.privateIpAddress, .configuration.instanceType,
ここでは、必要な情報を1つずつ指定しています。 platformは空欄の場合があるため、空欄の際に null が表示されるようにしています。
(.tags[] | select(.key == "Application").value) // "null"]
前述したコマンドと同様です。今回はタグがApplicationのValueを表示されるようにしています。 また、この要領で他のタグの情報を出力することも可能です。
| @tsv' \ | column -t | sort
テキスト形式で表示しつつ、タグ区切りで並び替えています。
要領が分かったところでその他のリソース情報も取得してみたいと思います。
VPCの情報取得
VPCのリソースから以下の情報を取得します。
- Nameタグ
- アカウントID
- リージョン
- プライマリCIDR
- セカンダリCIDR1
- セカンダリCIDR2
- セカンダリCIDR3
実行コマンド
aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::EC2::VPC'" \ | jq -r '.Results[] | fromjson | [ (.tags[] | select(.key == "Name").value) // "null", .resourceId, .accountId, .awsRegion, .configuration.cidrBlockAssociationSet[0].cidrBlock // "null" , .configuration.cidrBlockAssociationSet[1].cidrBlock // "null" , .configuration.cidrBlockAssociationSet[2].cidrBlock // "null"] | @tsv' \ | column -t | sort
実行結果
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ > --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::EC2::VPC'" \ > | jq -r '.Results[] | fromjson | > [ (.tags[] | select(.key == "Name").value) // "null", > .resourceId, > .accountId, > .awsRegion, > .configuration.cidrBlockAssociationSet[0].cidrBlock // "null" , > .configuration.cidrBlockAssociationSet[1].cidrBlock // "null" , > .configuration.cidrBlockAssociationSet[2].cidrBlock // "null"] > | @tsv' \ > | column -t | sort PeeringTest01 vpc-xxxxxxxxxxx 111111111111 ap-northeast-1 10.0.0.0/24 null null PeeringTest02 vpc-xxxxxxxxxxx 222222222222 ap-northeast-1 10.0.10.0/24 null null fk-share-vpc vpc-xxxxxxxxxxx 111111111111 ap-northeast-1 192.168.0.0/16 null null
今回はセカンダリCIDRを2つしか表示していませんが、以下の部分で[2]を3,4,5...とすることで増やすことが可能です。
.configuration.cidrBlockAssociationSet[1].cidrBlock // "null" ,
RDSの情報取得
RDSインスタンスから以下の情報を取得します。
- DB識別子
- アカウントID
- AWSリージョン
- AZ
- インスタンスクラス
- エンジン
- エンジンバージョン
- 自動マイナーバージョンアップの設定
- ステータス
- エンドポイントアドレス
- ストレージの容量
- バックアップウィンドウ
- メンテナンスウィンドウ
- マルチAZ設定
実行コマンド
aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::RDS::DBInstance'" \ | jq -r '.Results[] | fromjson | [.configuration.dBInstanceIdentifier, .accountId, .awsRegion, .availabilityZone, .configuration.dBInstanceClass, .configuration.engine, .configuration.engineVersion, .configuration.autoMinorVersionUpgrade, .configuration.dBInstanceStatus, .configuration.endpoint.address, .configuration.allocatedStorage, .configuration.preferredBackupWindow, .configuration.backupRetentionPeriod, .configuration.preferredMaintenanceWindow, .configuration.multiAZ] | @tsv' \ | column -t | sort
実行結果
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} \ > --expression "SELECT awsRegion, accountId, tags, resourceId, configuration WHERE resourceType = 'AWS::RDS::DBInstance'" \ > | jq -r '.Results[] | fromjson | > [.configuration.dBInstanceIdentifier, > .accountId, > .awsRegion, > .availabilityZone, > .configuration.dBInstanceClass, > .configuration.engine, > .configuration.engineVersion, > .configuration.autoMinorVersionUpgrade, > .configuration.dBInstanceStatus, > .configuration.endpoint.address, > .configuration.allocatedStorage, > .configuration.preferredBackupWindow, > .configuration.backupRetentionPeriod, > .configuration.preferredMaintenanceWindow, > .configuration.multiAZ] > | @tsv' \ > | column -t | sort fk-test1 111111111111 ap-northeast-1 db.t3.small oracle-ee 19.0.0.0.ru-2022-10.rur-2022-10.r1 false available fk-test1.xxxxx.ap-northeast-1.rds.amazonaws.com 20 15:31-16:01 7 sat:13:10-sat:13:40 false fk-test2 222222222222 ap-northeast-1 db.t3.small aurora-mysql 5.7.mysql_aurora.2.10.3 true available fk-test2.xxxxx.ap-northeast-1.rds.amazonaws.com 1 17:51-18:21 1 sat:13:14-sat:13:44 false fk-test3 333333333333 ap-northeast-1 db.t3.small aurora-mysql 5.7.mysql_aurora.2.10.3 true available fk-test3.xxxxx.ap-northeast-1.rds.amazonaws.com 1 17:51-18:21 1 fri:16:14-fri:16:44 false
IAM
- IAM ユーザー名
- アカウントID
- アタッチされているマネージドポリシー1
- アタッチされているマネージドポリシー2
- アタッチされているマネージドポリシー3
- アタッチされているインラインポリシー1
- アタッチされているインラインポリシー2
- アタッチされているインラインポリシー3
実行コマンド
aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} --expression "SELECT accountId,configuration WHERE resourceType = 'AWS::IAM::User'" | jq -r '.Results[] | fromjson | [ .configuration.userName, .accountId, .configuration.createDate, .configuration.attachedManagedPolicies[0].policyName // "null" , .configuration.attachedManagedPolicies[1].policyName // "null" , .configuration.attachedManagedPolicies[2].policyName // "null" , .configuration.userPolicyList[0].policyName // "null" , .configuration.userPolicyList[1].policyName // "null" , .configuration.userPolicyList[2].policyName // "null"] | @tsv' | column -t | sort
実行結果
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} --expression "SELECT accountId,configuration WHERE resourceType = 'AWS::IAM::User'" | > jq -r '.Results[] | fromjson | > [ .configuration.userName, > .accountId, > .configuration.createDate, > .configuration.attachedManagedPolicies[0].policyName // "null" , > .configuration.attachedManagedPolicies[1].policyName // "null" , > .configuration.attachedManagedPolicies[2].policyName // "null" , > .configuration.userPolicyList[0].policyName // "null" , > .configuration.userPolicyList[1].policyName // "null" , > .configuration.userPolicyList[2].policyName // "null"] ReadOnly 111111111111 2023-02-17T07:13:02.000Z ReadOnlyAccess null null inline-policy null null ReadOnly 111111111111 2023-02-17T07:17:50.000Z ReadOnlyAccess null null inline-policy null null ReadOnly 222222222222 2023-02-17T06:53:59.000Z ReadOnlyAccess null null null null null ReadOnly 222222222222 2023-02-17T06:59:06.000Z ReadOnlyAccess null null null null null
SSMの取得情報
実行コマンド
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} --expression "SELECT accountId,configuration WHERE resourceType = 'AWS::SSM::ManagedInstanceInventory'" | jq -r '.Results[] | fromjson | [.configuration."AWS:InstanceInformation".Content[].ComputerName , .configuration."AWS:InstanceInformation".Content[].PlatformName , .configuration."AWS:InstanceInformation".Content[].PlatformVersion , .configuration."AWS:InstanceInformation".Content[].AgentType , .configuration."AWS:InstanceInformation".Content[].AgentVersion , .configuration."AWS:InstanceInformation".Content[].InstanceId , .configuration."AWS:InstanceInformation".Content[].InstanceStatus , .configuration."AWS:InstanceInformation".Content[].IpAddress , .configuration."AWS:InstanceInformation".Content[].ResourceType , .configuration."AWS:InstanceInformation".Content[].PlatformType] | @tsv' | tr "\t" "," | column -s, -t | sort
実行結果
# aws configservice select-aggregate-resource-config --configuration-aggregator-name ${configuration_aggregator_name} --expression "SELECT accountId,configuration WHERE resourceType = 'AWS::SSM::ManagedInstanceInventory'" | jq -r '.Results[] | fromjson | [.configuration."AWS:InstanceInformation".Content[].ComputerName , .configuration."AWS:InstanceInformation".Content[].PlatformName , .configuration."AWS:InstanceInformation".Content[].PlatformVersion , .configuration."AWS:InstanceInformation".Content[].AgentType , .configuration."AWS:InstanceInformation".Content[].AgentVersion , .configuration."AWS:InstanceInformation".Content[].InstanceId , .configuration."AWS:InstanceInformation".Content[].InstanceStatus , .configuration."AWS:InstanceInformation".Content[].IpAddress , .configuration."AWS:InstanceInformation".Content[].ResourceType , .configuration."AWS:InstanceInformation".Content[].PlatformType] | @tsv' | tr "\t" "," | column -s, -t | sort EC2XXXX-XXXXXXX.WORKGROUP Microsoft Windows Server 2019 Datacenter 10.0.17763 amazon-ssm-agent 3.1.1188.0 i-xxxxxxxxxxxxxxxxx Active 10.10.135.69 EC2Instance Windows EC2XXXX-XXXXXXX.WORKGROUP Microsoft Windows Server 2019 Datacenter 10.0.17763 amazon-ssm-agent 3.1.1732.0 i-xxxxxxxxxxxxxxxxx Active 10.10.155.20 EC2Instance Windows EC2XXXX-XXXXXXX.WORKGROUP Microsoft Windows Server 2019 Datacenter 10.0.17763 amazon-ssm-agent 3.1.1634.0 i-xxxxxxxxxxxxxxxxx Active 10.10.134.68 EC2Instance Windows
補足
Config Aggregatorのクエリのサンプルが用意されており、コンソールからも確認できるため、必要に応じて参考にしていただくと良いかと存じます。
終わりに
今回は、Config Aggregatorからリソース情報を取得するコマンドをご紹介いたしました。 どなたかのお役に立てれば幸いです。