CloudQuery - Cloud-Asset-Bestand als SQL Spickzettel
CloudQuery ist ein Open-Source, Plugin-basiertes Datenverschiebungs-Framework, das Konfigurationen von Cloud-Providern und SaaS-APIs (AWS, GCP, Azure, Kubernetes, GitHub und mehr) extrahiert und in ein Ziel lädt — meistens PostgreSQL — damit du deine gesamte Infrastruktur mit SQL abfragen kannst. Sicherheits- und Plattform-Teams nutzen es für Asset-Bestand, Lage-Management, Compliance-Nachweise und zur Beantwortung von „Was haben wir eigentlich laufen?” mit einer Abfrage anstelle eines Konsolen-Durchklicks.
Architektur
| Komponente | Rolle |
|---|
| Source Plugin | Zieht Daten von einer API (aws, gcp, azure, k8s, github, …) |
| Destination Plugin | Schreibt Daten in einen Speicher (postgresql, bigquery, sqlite, file, …) |
| Sync | Ein Lauf, der von Quellen extrahiert und zu Zielen lädt |
| Config | YAML-Dateien, die Quellen und Ziele beschreiben |
Installation
| Methode | Befehl |
|---|
| Homebrew | brew install cloudquery/tap/cloudquery |
| Skript | 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 |
| Überprüfung | cloudquery --version |
Konfiguration
# 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"
Kern-Befehle
| Befehl | Beschreibung |
|---|
cloudquery sync config.yaml | Sync ausführen (Extrahieren → Laden) |
cloudquery sync aws.yaml pg.yaml | Mehrere Config-Dateien kombinieren |
cloudquery init --source aws --destination postgresql | Config Gerüst erstellen |
cloudquery tables config.yaml | Tabellen einer Quelle auflisten |
cloudquery migrate config.yaml | Nur Schema-Migrationen anwenden |
cloudquery plugin install config.yaml | Plugins vorinstallieren |
cloudquery --log-level debug sync ... | Ausführliches Logging |
Den Bestand abfragen
Nach dem Sync mit einfachem SQL abfragen:
-- Public S3 Buckets
SELECT name, region FROM aws_s3_buckets
WHERE block_public_acls = false;
-- EC2-Instanzen fehlender erforderlicher Tags
SELECT instance_id, region FROM aws_ec2_instances
WHERE tags->>'Owner' IS NULL;
-- IAM-Benutzer ohne MFA
SELECT user_name FROM aws_iam_users
WHERE mfa_active = false;
-- Cloud-übergreifend: Compute nach Provider zählen
SELECT 'aws' AS cloud, count(*) FROM aws_ec2_instances
UNION ALL SELECT 'gcp', count(*) FROM gcp_compute_instances;
Häufige Source-Plugins
| Plugin | Deckt ab |
|---|
cloudquery/aws | EC2, S3, IAM, VPC, RDS, Lambda, … |
cloudquery/gcp | Compute, Storage, IAM, GKE, … |
cloudquery/azure | VMs, Storage, AAD, … |
cloudquery/k8s | Pods, Deployments, RBAC, … |
cloudquery/github | Repos, Mitglieder, Branch Protection |
cloudquery/cloudflare, okta, gcp… | SaaS Lage |
Planung & CI
| Ansatz | Wie |
|---|
| Cron | cloudquery sync nach Plan ausführen |
| CI Pipeline | Sync dann SQL Richtlinienchecks ausführen, bei Verstößen fehlschlagen |
| Inkrementell | Viele Tabellen unterstützen inkrementelle Syncs zur Kostenreduktion |
| Policies | SQL-Abfragen als Compliance-Kontrollen koppeln |
Häufige Workflows
# Nächtliche Bestandsaktualisierung in Postgres
cloudquery sync aws.yaml gcp.yaml azure.yaml postgres.yaml
# Schnelle lokale Erkundung in SQLite (kein DB-Server)
cloudquery sync aws.yaml sqlite.yaml
sqlite3 cq.db "SELECT name FROM aws_s3_buckets"
# Auflisten, was eine AWS-Quelle vor Sync exponiert
cloudquery tables aws.yaml
CloudQuery vs Andere Ansätze
| Aspekt | CloudQuery | Steampipe | Native CLIs |
|---|
| Modell | Zu DB synchronisieren, dann SQL | Live SQL über APIs | Imperativ pro Aufruf |
| Am besten für | Bestand, Verlauf, Joins im Maßstab | Ad-hoc Live Abfragen | Einmalige Suchen |
| Persistierung | Ja (deine Datenbank) | Abfragezeit | Keine |
| Cloud-übergreifende Joins | Ja | Ja | Manuell |
Ressourcen