Come funziona
Questo documento descrive il flusso completo di esecuzione di cloudrift analyze, dall’invocazione CLI fino alla visualizzazione dei risultati.
Flusso di esecuzione
utente: cloudrift analyze -r us-east-1 eu-west-1 [--format json] [--pdf] [--live-pricing]
│
▼
main.ts (Commander.js parse degli argomenti)
│
▼
analyze-waste.command.ts (orchestra opzioni/config/output)
1. loadConfig() — cloudrift.config.json / .cloudriftrc / --config
2. AwsRegion.parse() per ogni regione
3. accountId: --account-id oppure STS GetCallerIdentity
│
▼
analyze-waste.composition.ts (composition root)
4. Pricing: tabella statica <- live API (--live-pricing) <- config.prices (vincono)
5. Costruisce gli scanner dai registry dichiarativi
6. Filtra secondo --scanners / --all-services / wizard interattivo
│
▼
AnalyzeCloudWasteUseCase.execute({ regions })
Worker pool: max 12 scan in-flight (scanner x regione)
│
▼
Ogni scanner: AWS API -> entita di dominio -> waste policy -> findings
│
▼
WastedResourcesSummary -> formato scelto (table/json/markdown/PDF)
totalWasteMonthlyUsd > costAlertThresholdUsd -> exit code 2 (gate CI)
Come funzionano gli scanner
Ogni scanner segue lo stesso pattern:
- Crea il client AWS per la regione (con retry/backoff e timeout)
- Raccoglie i candidati con paginazione, pre-filtrando lato server dove possibile
- Recupera metriche CloudWatch (per gli scanner idle/underutilized) con concorrenza limitata (max 5)
- Mappa a entita di dominio calcolando il costo via
PricingPort - Applica la waste policy — grace period, tag di esclusione, criteri specifici
- Distrugge il client nel
finally
23 dei 44 scanner estendono un template method condiviso (CloudWatchIdleScanner) che gestisce questo lifecycle. Gli altri 21 implementano direttamente lo stesso schema.
Risoluzione dei prezzi
I costi sono risolti per (regione, chiave) da tre livelli, vince il piu specifico:
- Override
pricesnel config — tariffe negoziate/aziendali (massima priorita) - AWS Pricing API (
--live-pricing) — listino pubblico corrente - Tabella statica built-in (
prices.json) — sempre presente come fallback
Ogni report mostra prices as of per indicare quale livello e stato usato.
Anche con
--live-pricing, AWS restituisce i prezzi di listino, non la tua bolletta. Gli overridepricesnel config sono l’unico modo per far combaciare il report con cio che paghi davvero.
Concorrenza
- Worker pool globale: max 12 scan in-flight (configurabile via
CLOUDRIFT_SCAN_CONCURRENCY), qualsiasi mix scanner/regione - Fan-out interno: chiamate CloudWatch limitate a 5 concorrenti per scanner (evita throttling)
- Job accodati scanner-major: il primo batch si spalma sulle regioni invece di concentrarsi sulla prima
Gestione errori
La granularita degli errori e per (scanner, regione): un permesso mancante in una regione produce un warning per quella coppia, senza toccare il resto. Il report viene sempre restituito con i dati parziali e la sezione “Scan Warnings”.
L’exit code e guidato solo dalla soglia di costo (costAlertThresholdUsd), mai dagli errori di scansione.
Credenziali AWS
L’SDK AWS v3 usa la catena di credenziali predefinita:
- Variabili d’ambiente (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - File
~/.aws/credentials(profilodefaultoAWS_PROFILE) - IAM Instance Profile (su EC2)
- ECS Task Role / EKS Service Account
Per la scansione cross-account, --assume-role-arn assume il ruolo target via STS prima di qualsiasi chiamata AWS.
Formato output
--format table(default) — tabelle colorate a terminale--format json— report machine-readable su stdout (componibile conjq)--format markdown— pronto per commenti PR / GitHub step summary--pdf [filename]— artefatto PDF aggiuntivo su disco--json [filename]— artefatto JSON aggiuntivo su disco--silent— sopprime tutto lo stdout (per esecuzioni solo-file)