CloudQuery - クラウドアセット インベントリ as SQL チートシート
CloudQuery はオープンソースのプラグインベースのデータ移動フレームワーク — クラウドプロバイダーおよび SaaS API(AWS、GCP、Azure、Kubernetes、GitHub など)から設定を抽出し、宛先(通常は PostgreSQL)に読み込む — SQL でインフラストラクチャ全体をクエリできます。セキュリティおよびプラットフォームチームはアセットインベントリ、体制管理、コンプライアンス証拠、「実際に何が実行されているのか」をコンソールクリックの代わりにクエリで回答するために使用します。
アーキテクチャ
| コンポーネント | 役割 |
|---|
| ソースプラグイン | API(aws、gcp、azure、k8s、github など)からデータを取得 |
| 宛先プラグイン | ストア(postgresql、bigquery、sqlite、file など)にデータを書き込み |
| 同期 | ソースから抽出して宛先に読み込む1回の実行 |
| 設定 | ソースおよび宛先を記述した YAML ファイル |
インストール
| 方法 | コマンド |
|---|
| Homebrew | brew install cloudquery/tap/cloudquery |
| スクリプト | curl -L https://github.com/cloudquery/cloudquery/releases/latest/download/cloudquery_linux_amd64 -o cloudquery && chmod +x cloudquery |
| Docker | docker run ghcr.io/cloudquery/cloudquery:latest |
| 確認 | cloudquery --version |
設定
# aws-to-postgres.yaml
kind: source
spec:
name: aws
path: cloudquery/aws
version: "VERSION"
destinations: ["postgresql"]
tables: ["aws_ec2_instances", "aws_s3_buckets", "aws_iam_*"]
---
kind: destination
spec:
name: postgresql
path: cloudquery/postgresql
version: "VERSION"
spec:
connection_string: "postgresql://user:pass@localhost:5432/cq"
コアコマンド
| コマンド | 説明 |
|---|
cloudquery sync config.yaml | 同期を実行(抽出 → 読み込み) |
cloudquery sync aws.yaml pg.yaml | 複数の設定ファイルを結合 |
cloudquery init --source aws --destination postgresql | 設定をスキャフォルド |
cloudquery tables config.yaml | ソースが提供するテーブルをリスト |
cloudquery migrate config.yaml | スキーママイグレーションのみを適用 |
cloudquery plugin install config.yaml | プラグインを事前インストール |
cloudquery --log-level debug sync ... | 詳細ログ |
インベントリをクエリ
同期後、プレーン SQL でクエリ:
-- パブリック S3 バケット
SELECT name, region FROM aws_s3_buckets
WHERE block_public_acls = false;
-- 必須タグがないEC2インスタンス
SELECT instance_id, region FROM aws_ec2_instances
WHERE tags->>'Owner' IS NULL;
-- MFA なしの IAM ユーザー
SELECT user_name FROM aws_iam_users
WHERE mfa_active = false;
-- クロスクラウド:プロバイダー別のコンピュート数
SELECT 'aws' AS cloud, count(*) FROM aws_ec2_instances
UNION ALL SELECT 'gcp', count(*) FROM gcp_compute_instances;
一般的なソースプラグイン
| プラグイン | 対象 |
|---|
cloudquery/aws | EC2、S3、IAM、VPC、RDS、Lambda など |
cloudquery/gcp | Compute、Storage、IAM、GKE など |
cloudquery/azure | VM、Storage、AAD など |
cloudquery/k8s | Pod、Deployment、RBAC など |
cloudquery/github | リポジトリ、メンバー、ブランチ保護 |
cloudquery/cloudflare, okta, gcp… | SaaS 体制 |
スケジューリング & CI
| アプローチ | 方法 |
|---|
| Cron | スケジュール通りに cloudquery sync を実行 |
| CI パイプライン | 同期してから SQL ポリシーチェックを実行、違反時は失敗 |
| インクリメンタル | 多くのテーブルはコストを削減するため増分同期をサポート |
| ポリシー | SQL クエリをコンプライアンスコントロールとペアリング |
一般的なワークフロー
# 夜間のインベントリ更新を Postgres に
cloudquery sync aws.yaml gcp.yaml azure.yaml postgres.yaml
# SQLite への迅速なローカル探索(DB サーバー不要)
cloudquery sync aws.yaml sqlite.yaml
sqlite3 cq.db "SELECT name FROM aws_s3_buckets"
# 同期前に AWS ソースが公開するものをリスト
cloudquery tables aws.yaml
CloudQuery vs その他のアプローチ
| 側面 | CloudQuery | Steampipe | ネイティブ CLI |
|---|
| モデル | DB に同期してから SQL | API 経由のライブ SQL | 呼び出しごとの命令型 |
| 最適用途 | インベントリ、履歴、大規模結合 | アドホック ライブクエリ | ワンオフルックアップ |
| 永続性 | はい(ユーザーのデータベース) | クエリ時 | なし |
| クロスクラウド結合 | はい | はい | 手動 |
リソース