Skip to main content

Azure CLI extension to detect and safely clean up stale and unused resources.

Project description

azure-resource-sweeper

CI PyPI version Python versions License

An Azure CLI extension that detects and safely cleans up stale and unused resources — unattached disks, dangling NICs, unused public IPs and empty App Service plans that quietly keep costing money.


Why?

Stale resources are easy to create and easy to forget. They never show up on a dashboard you look at, but they always show up on the bill. azure-resource-sweeper uses Azure Resource Graph KQL queries to find them in seconds and removes them with a dry-run-first safety model.


Installation

As an Azure CLI extension (recommended)

# Install directly from PyPI
az extension add --name azure-resource-sweeper

# Or from a local wheel (for development)
pip install build
python -m build
az extension add --source dist/azure_resource_sweeper-0.1.0-py3-none-any.whl

For local development with azdev

pip install azdev
azdev setup --repo .
azdev extension add resource-sweeper
az sweeper --help

Quick start

# 1. Scan the entire subscription for every stale resource type
az sweeper scan

# 2. Scan for unattached disks and show estimated monthly cost
az sweeper scan --type disk --estimate-cost

# 3. Scan a single resource group and output JSON
az sweeper scan -g my-rg --output json

# 4. Preview what would be deleted (dry-run — nothing is removed)
az sweeper clean --type publicip

# 5. Delete all stale resources without a prompt
az sweeper clean --type all --dry-run false --yes

Supported resource types

Type --type Detection condition Typical monthly cost
Unattached managed disk disk properties.diskState == 'Unattached' ~$0.05 / GB
Disconnected NIC nic isnull(properties.virtualMachine) $0 (blocks IP/VM removal)
Unused public IP publicip isnull(properties.ipConfiguration) ~$3.65 (Standard)
Empty App Service plan appserviceplan properties.numberOfSites == 0 ~$54.75 (Basic B1)
All of the above all (default)

Command reference

az sweeper scan

Option Default Description
--resource-group, -g all RGs Limit the scan to one resource group.
--subscription-id active Subscription to scan.
--type all disk / nic / publicip / appserviceplan / all
--estimate-cost off Add an estimatedMonthlyCost (USD) field to each row.

az sweeper clean

Option Default Description
--resource-group, -g all RGs Limit deletion to one resource group.
--subscription-id active Subscription to operate on.
--type all Type of stale resource to delete.
--dry-run true Preview only. Pass --dry-run false to delete for real.
--yes, -y off Skip the interactive confirmation prompt.

Authentication

Authentication uses DefaultAzureCredential — once you have run az login the extension just works. In CI, set the standard Azure SDK environment variables (AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET) or use a managed identity — no extra configuration needed.


Extension architecture

This project follows the official Azure CLI extension format:

Requirement Implementation
azext_ package prefix azext_resource_sweeper/
COMMAND_LOADER_CLS in __init__.py ResourceSweeperCommandsLoader
azure.cli.extensions entry-point setup.pyentry_points
load_command_table + load_arguments commands.py + _params.py
azdev compatible azdev extension add resource-sweeper

Contributing

Contributions are very welcome! See CONTRIBUTING.md for how to set up a local dev environment, run tests, and add a new resource type.


License

Apache 2.0 © Dana Kim

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

azure_resource_sweeper-0.2.0.tar.gz (14.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

azure_resource_sweeper-0.2.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

File details

Details for the file azure_resource_sweeper-0.2.0.tar.gz.

File metadata

  • Download URL: azure_resource_sweeper-0.2.0.tar.gz
  • Upload date:
  • Size: 14.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for azure_resource_sweeper-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a9acd8531118c0d45c9a5a110f223b3914f81dfa927e24894e6918739fec6dd5
MD5 bf6d42daf68c3b1aa15c0b2244ccb45b
BLAKE2b-256 f9086b734c4276b16d0068bf7d5dc49c3f5f52ebc3e2eaa1668d5ca109de91c4

See more details on using hashes here.

File details

Details for the file azure_resource_sweeper-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for azure_resource_sweeper-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d2588870eeaeafa518f24a3ff5dbeed0bcd8033eb766f3850dcd6823e600d31d
MD5 b122ffd10bb94b9b42df9b912d739850
BLAKE2b-256 ad3790fdce78fa9e8c688baa739790a47a5022a44d63cd7b29447b6affa385f2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page