【AWS Config Aggregator/AWS CLI】全AWSアカウントのリソース情報を取得してみる

記事タイトルとURLをコピーする

こんにちは。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からリソース情報を取得するコマンドをご紹介いたしました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。