AWS Organizations環境のConfig横断検索をClaude Codeスキルで楽にしたい
みなさん、AWS Configのクエリ機能 は使ったことありますか? この機能を使うと、AWS Configが保持するリソース構成情報に対してクエリを実行し、 情報を取得できます。 Configアグリゲーターを活用することでマルチアカウント環境の 横断的なリソース検索も可能です。
ただ、最近はSQLやスクリプトを手で書く機会がめっきり減り、AIに頼りっきりです。 Configクエリも例外ではないのですが、独自のSQL制限が多く、 プロパティパスも長くて複雑だったりします。 LLMにそのまま投げても正しいクエリが返ってくるとは限りません。
普段マルチアカウント環境で横断検索する機会が多いので、 これをスキル化できたら楽だな〜と思い、 Claude Code スキル にしてみました。 Configクエリの方法やリファレンスを詰め込んで、 自然言語から正確なクエリを生成・実行できるようにしています。
作ったスキル
早速ですが、作ったスキルを紹介します。
SKILL.md の全文はこちらです。
---
name: aws-config-org-search
description: AWS Config高度なクエリでマルチアカウントリソースを検索
---
# AWS Config 高度なクエリ
## 前提条件
- AWS CLI v2 がインストール済みであること
- AWS Organizations で組織アグリゲーターがセットアップ済みであること
- リソーススキーマ(サブモジュール)が取得済みであること:
```bash
git submodule update --init
```
## 実行フロー
### 1. 組織アグリゲーター名の取得
```bash
aws configservice describe-configuration-aggregators --output json
```
**判定方法:**
- `OrganizationAggregationSource` キーが存在する → 組織アグリゲーター
- `AccountAggregationSources` キーが存在する → アカウント個別アグリゲーター
### 2. クエリ実行
プロセス置換でJSONを渡す(SQLのカンマ問題回避):
```bash
aws configservice select-aggregate-resource-config \
--configuration-aggregator-name "<AGGREGATOR_NAME>" \
--output json \
--expression "$(cat <<'EOF'
SELECT ... WHERE ...
EOF
)"
```
## SQL構文リファレンス
### 基本構文
```sql
SELECT property [, ...]
[ WHERE condition ]
[ GROUP BY property ]
[ ORDER BY property [ ASC | DESC ] [, ...] ]
```
### 演算子
| 種類 | 使用可能 |
|------|----------|
| 比較 | `=`, `IN`, `BETWEEN` |
| 論理 | `AND`, `OR`, `NOT` |
| パターン | `LIKE`(後述の制限あり) |
### LIKE とワイルドカード制限
- `%`: 0文字以上にマッチ
- `_`: 1文字にマッチ
**制限:**
- **サフィックスワイルドカードのみ** - `LIKE 'AWS::EC2::%'` ✓ / `LIKE '%::Instance'` ✗
- **3文字以上必須** - `LIKE 'abc%'` ✓ / `LIKE 'ab%'` ✗
- **プロパティ値のみ** - キー名にはワイルドカード使用不可
### 集計関数
`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`
**制限:**
- 引数は単一プロパティのみ
- `GROUP BY` は最大3プロパティ
- `GROUP BY` + `ORDER BY`(集計関数参照)は単一プロパティのみ
- `HAVING` はサポートなし
### 使用不可
`ALL`, `AS`, `DISTINCT`, `FROM`, `HAVING`, `JOIN`, `UNION`, `NULL`, 複雑な`CASE`
※ `LIMIT` → `--max-results` オプションを使用
### SELECT * の動作
トップレベルのスカラープロパティのみ返却:
`accountId`, `awsRegion`, `arn`, `availabilityZone`, `configurationItemCaptureTime`, `resourceCreationTime`, `resourceId`, `resourceName`, `resourceType`, `version`
### 注意事項
**クエリ文字数制限:** SQLクエリの最大長は **4,096文字**
**配列内プロパティ:** 条件は全要素に対して評価される(AND条件でも異なる要素にマッチ可能)
**CIDR/IP検索:** 範囲に変換されるため、完全一致には追加条件が必要:
```sql
WHERE configuration.ipPermissions.ipRanges BETWEEN '10.0.0.0' AND '10.0.0.255'
AND NOT configuration.ipPermissions.ipRanges < '10.0.0.0'
AND NOT configuration.ipPermissions.ipRanges > '10.0.0.255'
```
### 公式ドキュメント
- [Query Components](https://docs.aws.amazon.com/config/latest/developerguide/query-components.html)
- [Querying AWS Resources](https://docs.aws.amazon.com/config/latest/developerguide/querying-AWS-resources.html)
## リソーススキーマ
このSKILL.mdと同じディレクトリにサブモジュールとして配置:
```
<SKILL_DIR>/aws-config-resource-schema/config/properties/resource-types/
```
※ `<SKILL_DIR>` はこの SKILL.md が存在するディレクトリ。
### スキーマ探索
```bash
# リソースタイプ一覧(413種類)
ls <SKILL_DIR>/aws-config-resource-schema/config/properties/resource-types/
# 特定リソースのプロパティ確認
cat <SKILL_DIR>/aws-config-resource-schema/config/properties/resource-types/AWS::EC2::Instance.properties.json | jq .
# プロパティ名のみ抽出
cat <SKILL_DIR>/aws-config-resource-schema/config/properties/resource-types/AWS::RDS::DBInstance.properties.json | jq 'keys'
```
## 実用クエリ例
### RDS DBインスタンス(エンジン情報、自動アップグレード設定)
```bash
aws configservice select-aggregate-resource-config \
--configuration-aggregator-name "<AGGREGATOR_NAME>" \
--output json \
--expression "$(cat <<'EOF'
SELECT
accountId,
awsRegion,
resourceId,
configuration.dBInstanceIdentifier,
configuration.engine,
configuration.engineVersion,
configuration.autoMinorVersionUpgrade
WHERE
resourceType = 'AWS::RDS::DBInstance'
EOF
)"
```
### EC2インスタンス(特定インスタンスタイプ)
```bash
aws configservice select-aggregate-resource-config \
--configuration-aggregator-name "<AGGREGATOR_NAME>" \
--output json \
--expression "$(cat <<'EOF'
SELECT
accountId,
awsRegion,
resourceId,
configuration.instanceId,
configuration.instanceType,
configuration.state.name
WHERE
resourceType = 'AWS::EC2::Instance'
AND configuration.instanceType LIKE 't2.%'
EOF
)"
```
### Lambda関数(ランタイム、最終更新日)
```bash
aws configservice select-aggregate-resource-config \
--configuration-aggregator-name "<AGGREGATOR_NAME>" \
--output json \
--expression "$(cat <<'EOF'
SELECT
accountId,
awsRegion,
resourceId,
configuration.functionName,
configuration.runtime,
configuration.lastModified
WHERE
resourceType = 'AWS::Lambda::Function'
ORDER BY
configuration.lastModified DESC
EOF
)"
```
スキルの説明
前提として、「組織アグリゲーターがあるAWSアカウント」の認証情報を事前にセットします。 ツールとしては AWS CLI v2 と jq が必要です。
スキルの流れ自体はシンプルです。 組織アグリゲーター名を取得し、リソーススキーマを参照してクエリを組み立て、実行するだけです。 Configクエリには LIKE のサフィックスワイルドカード制限や HAVING 非サポートなど独自の制約があるため、 SQL構文リファレンスをスキルに埋め込み、正しいクエリを生成できるようにしています。
また、リソースのプロパティパスを正確に指定するために awslabs/aws-config-resource-schema をサブモジュールとして同梱しています。 これにより supplementaryConfiguration.ServerSideEncryptionConfiguration.rules... のような 長いパスもスキーマから正確に参照できます。
セットアップ方法
ユーザースコープのスキルとして配置する方法を記載します。 リポジトリを ~/.claude/skills/ にてクローンするのみです。 --recursive を付けることで、リソーススキーマのサブモジュールも一緒に取得されます。
mkdir -p ~/.claude/skills
cd ~/.claude/skills
git clone --recursive https://github.com/MasahiroKawahara/aws-config-org-search.git
その後、Claude Code にて /aws-config-org-search を実行できるようになります。
また、リソーススキーマは以下コマンドで最新化できます。
git submodule update --remote
git add aws-config-resource-schema
git commit -m "Update aws-config-resource-schema"
使ってみる
いくつか実行例を紹介します。
S3バケットの暗号化設定を確認する
手動でスキルを実行し、 「組織全体のS3バケットの暗号化設定を調べて」 と依頼してみます。 はじめに、Configアグリゲーターの取得と、スキーマ(JSON)の読取りを実施します。

Configアグリゲーターの取得とS3バケットのスキーマ読取り
その後、 select-aggregate-resource-config コマンドを実行します。

S3バケットの暗号化設定を取得するクエリの実行
最終的な回答がこちら。

組織全体のS3バケット暗号化設定のサマリ結果
良い感じに棚卸しできていると思います。 今回のクエリだと supplementaryConfiguration.ServerSideEncryptionConfiguration.rules.applyServerSideEncryptionByDefault.sseAlgorithm のように、パスがとっても長いものを指定しています。 正確なパスも AI側で補完してくれるのは良いところですね。
特定プレフィクスのIAMロールのポリシーを調べる
こんな感じで依頼してみます。
`cm-` で始まるIAMロールの作成日と、付与されているマネージドポリシー、インラインポリシーを調べてCSV ( `./tmp/test-iam-roles-inventory.csv` )にして
同じように組織アグリゲーター名の取得とスキーマ確認を行い、クエリを実行します。 スキーマからプロパティを特定してくれていますね。

アグリゲーター名の取得、IAMロールのスキーマ確認とクエリ実行
今回は CSV出力までお願いしたので、 スクリプトを生成してファイルにまとめてくれました。

CSV生成スクリプトの実行と結果サマリ
中身をスプレッドシートのテーブルにインポートしたものがこちら。

CSVをスプレッドシートにインポートした結果
こちらも良い感じに棚卸しできています。 リソース棚卸しでは結果をスプレッドシート(or Excel)にまとめて共有する場面が多いので、 クエリからCSV生成まで一気通貫でやってくれるのはありがたいですね。
おわりに
AWS Configの横断検索をスキル化してみました。 Configクエリの独自制限やプロパティパスの長さを、 スキルにナレッジとスキーマを詰め込むことでうまくカバーできたと思います。
「〜を調べて/棚卸しして」と言うだけでクエリ生成からCSV出力まで一気にやってくれるのは、 今後のマルチアカウント運用でかなり助かりそうです。
以上、参考になれば幸いです。









