AWS Organizations環境のConfig横断検索をClaude Codeスキルで楽にしたい

AWS Organizations環境のConfig横断検索をClaude Codeスキルで楽にしたい

2026.02.24

みなさん、AWS Configのクエリ機能 は使ったことありますか? この機能を使うと、AWS Configが保持するリソース構成情報に対してクエリを実行し、 情報を取得できます。 Configアグリゲーターを活用することでマルチアカウント環境の 横断的なリソース検索も可能です。

https://dev.classmethod.jp/articles/advanced-queries-in-aws-config-to-find-resources-in-organizations/

ただ、最近はSQLやスクリプトを手で書く機会がめっきり減り、AIに頼りっきりです。 Configクエリも例外ではないのですが、独自のSQL制限が多く、 プロパティパスも長くて複雑だったりします。 LLMにそのまま投げても正しいクエリが返ってくるとは限りません。

普段マルチアカウント環境で横断検索する機会が多いので、 これをスキル化できたら楽だな〜と思い、 Claude Code スキル にしてみました。 Configクエリの方法やリファレンスを詰め込んで、 自然言語から正確なクエリを生成・実行できるようにしています。

作ったスキル

早速ですが、作ったスキルを紹介します。

https://github.com/MasahiroKawahara/aws-config-org-search

SKILL.md の全文はこちらです。

~/.claude/skills/aws-config-org-search/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)の読取りを実施します。

sc-2026-02-23_10-22696
Configアグリゲーターの取得とS3バケットのスキーマ読取り

その後、 select-aggregate-resource-config コマンドを実行します。

sc-2026-02-23_10-2257
S3バケットの暗号化設定を取得するクエリの実行

最終的な回答がこちら。

sc-2026-02-23_10-14225
組織全体のS3バケット暗号化設定のサマリ結果

良い感じに棚卸しできていると思います。 今回のクエリだと supplementaryConfiguration.ServerSideEncryptionConfiguration.rules.applyServerSideEncryptionByDefault.sseAlgorithm のように、パスがとっても長いものを指定しています。 正確なパスも AI側で補完してくれるのは良いところですね。

特定プレフィクスのIAMロールのポリシーを調べる

こんな感じで依頼してみます。

`cm-` で始まるIAMロールの作成日と、付与されているマネージドポリシー、インラインポリシーを調べてCSV ( `./tmp/test-iam-roles-inventory.csv` )にして

同じように組織アグリゲーター名の取得とスキーマ確認を行い、クエリを実行します。 スキーマからプロパティを特定してくれていますね。

sc-2026-02-23_10-8377
アグリゲーター名の取得、IAMロールのスキーマ確認とクエリ実行

今回は CSV出力までお願いしたので、 スクリプトを生成してファイルにまとめてくれました。

sc-2026-02-23_10-25298
CSV生成スクリプトの実行と結果サマリ

中身をスプレッドシートのテーブルにインポートしたものがこちら。

sc-2026-02-23_10-26003
CSVをスプレッドシートにインポートした結果

こちらも良い感じに棚卸しできています。 リソース棚卸しでは結果をスプレッドシート(or Excel)にまとめて共有する場面が多いので、 クエリからCSV生成まで一気通貫でやってくれるのはありがたいですね。

おわりに

AWS Configの横断検索をスキル化してみました。 Configクエリの独自制限やプロパティパスの長さを、 スキルにナレッジとスキーマを詰め込むことでうまくカバーできたと思います。

「〜を調べて/棚卸しして」と言うだけでクエリ生成からCSV出力まで一気にやってくれるのは、 今後のマルチアカウント運用でかなり助かりそうです。

以上、参考になれば幸いです。

参考

この記事をシェアする

FacebookHatena blogX

関連記事