Multi-cloud cost estimation for Terraform — Infracost, but for the clouds it doesn't cover.
Supports Tencent Cloud, AWS, Alibaba Cloud, and Huawei Cloud — 65 resource types across four providers.
Quick start · Architecture · Roadmap
cloudtab reads a Terraform plan and tells you what it will cost — before you apply. Same UX as Infracost, but focused on the clouds Infracost doesn't cover (Tencent Cloud + AWS + Alibaba + Huawei). A single plan may mix resources from any supported provider — each is routed to its own pricing backend by the resource's provider prefix.
- 🔌 Zero setup — one binary, provider credentials as env vars, one command
- 💰 Real prices, not guesses — calls each cloud's official inquiry APIs; no hand-maintained price tables
- 🔀 PR diffs —
cloudtab diffshows+/-/~per resource with monthly Δ - 🤖 CI-friendly — GitHub Action ships a sticky PR comment
- 🧩 Pluggable — one Go file per resource type; contribute a Mapper, cover more products or providers
# 1. install
go install github.com/susunola/cloudtab/cmd/cloudtab@latest
# 2. set credentials (read-only CAM policy: QcloudCVMInnerReadOnly + Inquiry*)
export TENCENTCLOUD_SECRET_ID=AKIDxxxx
export TENCENTCLOUD_SECRET_KEY=xxxxxxxx
# 2b. (optional) AWS credentials — only needed if the plan has aws_* resources.
# Uses the standard AWS credential chain; the pricing:GetProducts action is
# the only permission required (attach AWSPriceListServiceFullAccess or an
# equivalent read-only policy).
export AWS_ACCESS_KEY_ID=AKIAxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxx
# 2c. (optional) Alibaba Cloud credentials — only needed for alicloud_* resources.
# Requires BSS (Business Support System) read access.
export ALIBABA_ACCESS_KEY_ID=LTAIxxxx
export ALIBABA_ACCESS_KEY_SECRET=xxxxxxxx
# 2d. (optional) Huawei Cloud credentials — only needed for huaweicloud_* resources.
# Requires BSS (Business Support System) read access.
export HUAWEI_ACCESS_KEY_ID=xxxx
export HUAWEI_SECRET_ACCESS_KEY=xxxxxxxx
# 3. generate a plan and estimate cost
terraform plan -out=tf.plan
terraform show -json tf.plan > plan.json
cloudtab breakdown --path plan.json --region ap-guangzhouA pure-Tencent plan needs no AWS/Alibaba/Huawei credentials — each backend is only initialised the first time a resource from that provider is priced.
cloudtab diff --before plan.old.json --after plan.new.json --format markdowndiff reads each plan's recursive planned_values inventory, including unchanged
resources and resources in child modules. This means updates are measured against
the old resource cost and deletions appear as savings; they are not misreported as
full additions or silently omitted. When a legacy/synthetic plan has no
planned_values, cloudtab falls back to its resource_changes list. Provider
aliases are resolved per resource through Terraform's exact provider_config_key,
so two aliases of the same cloud can safely use different regions.
breakdown intentionally remains change-oriented: it prices create/update actions
from resource_changes, preserving the existing "what this plan changes" output.
Tencent Cloud runs two independent sites with separate account systems: the
Chinese-mainland site (*.tencentcloudapi.com) and the International site
(*.intl.tencentcloudapi.com). A given SecretId/SecretKey is registered on
exactly one of them, so the site is chosen by your credential — not the
region (both sites expose overlapping region names such as ap-guangzhou /
ap-singapore). Select it explicitly to match your key:
# International-site credential
cloudtab breakdown --path plan.json --region ap-singapore --site intl
# or via env (flag takes precedence)
export TENCENTCLOUD_SITE=intl--site accepts domestic (default) or intl; any other value is passed
through verbatim as a custom root domain (e.g. a private-cloud gateway). Prices
are cached separately per site, so switching sites never returns a stale
cross-site price.
The site also drives the currency label: the International site bills in USD, the Chinese-mainland site in CNY. cloudtab labels each component accordingly (an explicit currency returned by the pricing API always wins), and the same applies to Alibaba and Huawei International accounts. A mixed-currency plan therefore shows the real per-component currency instead of forcing everything to CNY.
Each cloud has its own site selector, so a single run can price, say, an International Tencent credential and a Chinese-mainland Huawei account at once:
| Cloud | Flag | Env fallback | Default |
|---|---|---|---|
| Tencent Cloud | --site |
TENCENTCLOUD_SITE |
domestic |
| AWS | --aws-site |
AWS_SITE |
intl/global |
| Alibaba Cloud | --alibaba-site |
ALIBABA_SITE |
domestic |
| Huawei Cloud | --huawei-site |
HUAWEI_SITE |
intl |
Huawei Cloud now correctly routes Chinese-mainland credentials to
bss.myhuaweicloud.com and International credentials to
bss-intl.myhuaweicloud.com (previously the international endpoint was
hard-coded, so a China-mainland account was misrouted). As with Tencent, prices
are cached per provider + site, so the sites never cross-contaminate.
The non-Tencent site flags (--aws-site, --alibaba-site, --huawei-site)
accept domestic, cn, china, intl, international, global, or
overseas (case-insensitive, empty = provider default). Any other value fails
fast with a clear error before any API call, so a typo like domesitc is
caught immediately instead of silently defaulting to the cn partition and
failing later at auth time. Tencent's --site is not restricted to this
list — an unrecognised value is passed through verbatim as a custom root domain
(e.g. a private-cloud gateway).
Terraform describes provisioned infrastructure, but it does not contain monthly storage, requests, invocations, egress, or address-hours. For usage-driven resources, pass a versioned usage file with an explicit quantity and rate:
version: 1
resources:
tencentcloud_cos_bucket.assets:
items:
standard_storage:
quantity: 500
unit: GB-month
pricing: supplied
rate:
amount: 0.024
per: 1
currency: USD
source:
kind: contract
reference: contract-2026-q3
as_of: 2026-07-01
confidence: high
get_requests:
quantity: 1000000
unit: request
pricing: supplied
rate:
amount: 0.01
per: 10000
currency: USD
source:
kind: provider_documentation
reference: https://example.com/provider-pricing
as_of: 2026-07-28
confidence: medium
put_requests:
quantity: 0 # explicit zero: this dimension does not apply
unit: request
pricing: supplied
rate:
amount: 0.01
per: 10000
currency: USD
source:
kind: provider_documentation
reference: https://example.com/provider-pricing
as_of: 2026-07-28
confidence: medium
internet_egress:
quantity: 0 # explicit zero: no internet egress assumed
unit: GB
pricing: supplied
rate:
amount: 0.08
per: 1
currency: USD
source:
kind: provider_documentation
reference: https://example.com/provider-pricing
as_of: 2026-07-28
confidence: mediumcloudtab breakdown --path plan.json --usage-file usage.yml
cloudtab diff --before old.json --after new.json \
--before-usage-file usage.old.yml --after-usage-file usage.new.ymlThe calculation is transparent: monthly = quantity × rate.amount / rate.per.
JSON components include the quantity, unit rate, source reference/date/confidence,
and provenance.kind: user_rate_estimate. These are estimates based on inputs you
control, not provider API quotes or embedded price tables.
Supported usage resources and item IDs:
| Terraform type | Items (canonical unit) |
|---|---|
tencentcloud_cos_bucket, aws_s3_bucket |
standard_storage (GB-month), get_requests / put_requests (request), internet_egress (GB) |
tencentcloud_cdn_domain |
traffic (GB), https_requests (request) |
tencentcloud_cfs_file_system, aws_efs_file_system |
standard_storage (GB-month) |
tencentcloud_scf_function |
compute (GB-second), invocations (request), internet_egress (GB) |
aws_eip |
address_hours (address-hour) |
Versioned usage is strictly validated: unknown fields, addresses not present in the
loaded plan, usage attached to a non-usage resource, unsupported item IDs/units,
invalid dates, non-finite numbers, overflowed calculations, and missing rate
provenance fail before pricing. Every modeled item for that resource must be
present; supply an explicit zero quantity when a dimension does not apply. This
prevents an omitted request or egress dimension from being silently treated as free.
Legacy unversioned usage.yml attribute overrides remain supported for compatibility
but cannot produce source-attributed usage estimates.
If usage is missing, the resource appears in skipped with category
usage_required; report totals become PRICED SUBTOTAL, and a diff does not treat
an unpriced side as zero or claim a numeric saving/increase.
A policy turns the completed report into a deterministic CI decision while keeping each currency separate:
version: 1
limits:
USD:
max_monthly_increase: 250
max_total: 5000
CNY:
max_monthly_increase: 1500
max_total: 30000
fail_on_skipped: true
min_coverage: 0.95cloudtab diff --before old.json --after new.json \
--policy-file examples/policy.yml --format markdown
# Direct flags override the same rule/currency from the file.
cloudtab diff --before old.json --after new.json \
--max-monthly-increase USD=250 \
--max-total CNY=30000 \
--fail-on-skipped --min-coverage 0.95Rules:
max_totalchecks the current breakdown or theafterside of a diff.max_monthly_increasecompares before/after totals for that currency. On a breakdown it fails with “baseline required” rather than silently ignoring the rule.fail_on_skippedevaluates the current report, or both sides of a diff.min_coverageispriced / (priced + skipped); an empty plan has 100% coverage.- CNY, USD, and any other currencies are evaluated independently. cloudtab never invents or downloads an exchange rate.
Policy YAML is strict and versioned. Unknown keys, duplicate normalized currencies, negative/non-finite thresholds, invalid coverage, and empty policies fail before the pricing engine starts. Threshold comparisons tolerate only float representation noise.
Exit codes are stable for CI:
| Code | Meaning |
|---|---|
0 |
Pricing completed and all enabled policy rules passed (or no policy enabled). |
1 |
CLI/configuration, plan, pricing, or rendering error. |
2 |
A complete report was rendered, but the cost policy failed. |
Policy-enabled JSON includes a policy object with deterministic violations. Table
and markdown output append a policy section. The GitHub Action accepts
policy-file; on a violation it posts the PR comment first and then fails the job.
Resources in a plan are priced concurrently, each request has a timeout,
and transient errors (throttling / network blips) are retried with
exponential backoff. All three are tuned with sensible built-in defaults and can
be overridden per run on both breakdown and diff:
| Flag | Env | Default | Meaning |
|---|---|---|---|
--concurrency |
CLOUDTAB_CONCURRENCY |
8 |
Max resources priced in parallel. Clamped to [1, number-of-resources]. |
--timeout |
– | 30s |
Per-request deadline for each pricing API call (Tencent & AWS). |
--max-retries |
– | 2 |
Extra attempts on retryable errors (so up to 3 tries). 0 disables retry. |
# tune for a large plan against a rate-limited account
cloudtab breakdown --path plan.json --region ap-guangzhou \
--concurrency 4 --timeout 45s --max-retries 3
# flag beats env; env beats default
export CLOUDTAB_CONCURRENCY=4Notes:
- Retries only fire on transient failures (throttling, rate limits, 5xx, timeouts, connection resets/EOF). A genuine hard error (bad SKU, unsupported engine, auth failure) fails fast — it is never retried and never cached.
- Identical concurrent requests are de-duplicated in-flight: if two resources in the same plan need the exact same price, only one API call is made and both share the result.
- By default, a failed resource is skipped (recorded in the output with a
reason) so one bad SKU cannot sink an entire large plan. Pass
--fail-on-errorto restore strict fail-fast behaviour.
Quotes are cached on disk (bbolt, single cache.db file under $HOME/.cloudtab)
for 24h (override with --cache-ttl) so repeated runs over the same plan don't
re-hit each cloud's API. The cache is namespaced per provider + site, and expired
entries are swept both on open and lazily on access.
# delete the cache file to free disk (the next run repopulates it)
cloudtab cache clear
# point at a custom cache directory (matches --cache-dir on breakdown/diff)
cloudtab cache clear --cache-dir /tmp/cloudtab-cache
# skip the cache entirely for one run
cloudtab breakdown --path plan.json --no-cache| Command | What it does |
|---|---|
cloudtab cache clear |
Removes the on-disk cache.db; a missing file is a no-op, not an error. |
breakdown --no-cache / diff --no-cache |
Bypass the cache for that run (useful after a cloud price change). |
--cache-ttl <dur> |
Per-entry TTL (default 24h); also swept on cache open. |
breakdown --debug / diff --debug |
Emit diagnostics to stderr — cache hit/miss, per-call backend latency, and retry/backoff events (report stays on stdout). |
After every run cloudtab prints a one-line summary to stderr (independent of
--debug), e.g. cloudtab: 12 resources priced, 1 skipped | backend calls: 8 (1.4s), cache hits: 4, misses: 8 — the report on stdout is never touched, so
piping/redirecting stdout stays clean.
Sample output:
+--------------------------------+------------------+-----------------+
| RESOURCE | COMPONENT | MONTHLY (CNY) |
+--------------------------------+------------------+-----------------+
| tencentcloud_instance.api | Compute (S5.MED) | 214.20 |
| tencentcloud_cbs_storage.data | CBS PREMIUM_50GB | 45.00 |
+--------------------------------+------------------+-----------------+
| | TOTAL | 259.20 |
+--------------------------------+------------------+-----------------+
| Product | Terraform type | Pricing API |
|---|---|---|
| CVM | tencentcloud_instance |
cvm:InquiryPriceRunInstances |
| CBS | tencentcloud_cbs_storage |
cbs:InquiryPriceCreateDisks |
| EIP | tencentcloud_eip |
vpc:InquiryPriceAllocateAddresses |
| CLB | tencentcloud_clb_instance |
clb:InquiryPriceCreateLoadBalancer |
| MySQL | tencentcloud_mysql_instance |
cdb:DescribeDBPrice |
| PostgreSQL | tencentcloud_postgresql_instance |
postgres:InquiryPriceCreateDBInstances |
| Redis | tencentcloud_redis_instance |
redis:InquiryPriceCreateInstance |
| VPN Gateway | tencentcloud_vpn_gateway |
vpc:InquiryPriceCreateVpnGateway |
| MongoDB | tencentcloud_mongodb_instance |
mongodb:InquirePriceCreateDBInstances |
| MariaDB | tencentcloud_mariadb_instance |
mariadb:DescribePrice |
| TDSQL-C | tencentcloud_cynosdb_cluster |
cynosdb:InquirePriceCreate |
| Lighthouse | tencentcloud_lighthouse_instance |
lighthouse:InquirePriceCreateInstances |
| ECM (Edge) | tencentcloud_ecm_instance |
ecm:DescribePriceRunInstance |
| SQL Server | tencentcloud_sqlserver_instance |
sqlserver:InquiryPriceCreateDBInstances |
| TDSQL MySQL | tencentcloud_dcdb_db_instance (prepaid), tencentcloud_dcdb_hourdb_instance (postpaid); legacy tencentcloud_dcdb_instance also accepted |
dcdb:DescribeDCDBPrice |
| GAAP | tencentcloud_gaap_proxy |
gaap:InquiryPriceCreateProxy |
| CWP (Host Security) | tencentcloud_cwp_license_order |
yunjing:InquiryPriceOpenProVersionPrepaid |
| CloudHSM | tencentcloud_cloudhsm_instance |
cloudhsm:InquiryPriceBuyVsm (intl: unavailable — the API returns a placeholder price, not a real quote) |
| Domain | tencentcloud_domain_registration |
domain:DescribeDomainPriceList |
| COS | tencentcloud_cos_bucket |
Explicit usage × source-attributed supplied rates |
| CDN | tencentcloud_cdn_domain |
Explicit usage × source-attributed supplied rates |
| CFS | tencentcloud_cfs_file_system |
Explicit usage × source-attributed supplied rates |
| SCF | tencentcloud_scf_function |
Explicit usage × source-attributed supplied rates |
| Direct Connect Gateway | tencentcloud_dc_gateway |
vpc:InquirePriceCreateDirectConnectGateway |
Priced live via the AWS Price List (Pricing) API (pricing:GetProducts). The
Pricing API endpoint is always us-east-1; the region being priced is expressed
through a location filter, so any commercial AWS region is supported.
| Product | Terraform type | Priced component |
|---|---|---|
| EC2 | aws_instance |
On-demand instance hour (Linux, shared tenancy) × 730 |
| EBS | aws_ebs_volume |
Per-GB-month storage rate × provisioned size |
| RDS | aws_db_instance |
On-demand DB instance hour (per engine + Single/Multi-AZ) × 730 |
| ElastiCache | aws_elasticache_cluster |
On-demand node hour × node count × 730 |
| ELB (ALB/NLB/GWLB) | aws_lb |
Fixed load-balancer hour (base, excl. LCU/data-processing) × 730 |
| ELB (Classic) | aws_elb |
Fixed load-balancer hour (base, excl. data-processing) × 730 |
| Aurora | aws_rds_cluster_instance |
On-demand Aurora instance hour (per engine, Single-AZ) × 730 |
| Redshift | aws_redshift_cluster |
On-demand node hour × node count × 730 (excl. RA3 managed storage) |
| OpenSearch / ES | aws_opensearch_domain, aws_elasticsearch_domain |
On-demand data-node hour × instance count × 730 |
| DocumentDB | aws_docdb_cluster_instance |
On-demand instance hour × 730 |
| Neptune | aws_neptune_cluster_instance |
On-demand instance hour × 730 |
| MemoryDB | aws_memorydb_cluster |
On-demand node hour × (shards × (1 + replicas/shard)) × 730 |
| Amazon MQ | aws_mq_broker |
On-demand broker hour (per engine + Single/Multi-AZ) × 730 |
| MSK | aws_msk_cluster |
On-demand broker hour × broker count × 730 |
| DynamoDB (provisioned) | aws_dynamodb_table |
Provisioned RCU-hour + WCU-hour × 730 (PAY_PER_REQUEST skipped) |
| EKS | aws_eks_cluster |
Control-plane hour (per cluster) × 730 |
| NAT gateway | aws_nat_gateway |
Fixed hourly rate (base, excl. data-processing) × 730 |
| S3 | aws_s3_bucket |
Explicit usage × source-attributed supplied rates |
| EFS | aws_efs_file_system |
Explicit storage usage × source-attributed supplied rates |
| Public IPv4 / EIP | aws_eip |
Explicit address-hours × source-attributed supplied rates |
AWS prices are quoted in USD; a mixed-provider plan shows a per-component
Currency column and only sums a grand total when the currency is uniform.
The AWS Price List API caps each GetProducts page at MaxResults (default 100,
clamped to [1, 100]) and paginates via NextToken. If a query matches more
products than one page can hold, cloudtab fails fast with a clear error instead
of silently pricing the wrong SKU from a truncated result set:
aws GetProducts AmazonEC2: query matched more than 100 products (NextToken still present); narrow your Filters (e.g. add instanceType / region) so exactly one SKU is returned
Narrow the Filters (pass a specific instanceType / engine / region) so the
query returns a single SKU. This protects against silent mis-pricing, which the
previous behaviour (returning the first truncated page) was vulnerable to.
Priced live via the Alibaba Cloud BSS API (GetPayAsYouGoPrice). Supports all
commercial Alibaba Cloud regions.
| Product | Terraform type | Priced component |
|---|---|---|
| ECS | alicloud_instance |
On-demand instance hour (per instance type) × 730 |
| Disk | alicloud_disk |
Per-GB-month storage rate × provisioned size |
| EIP | alicloud_eip_address |
Fixed hourly rate × 730 |
| SLB (CLB) | alicloud_slb_load_balancer |
Fixed spec-based hourly rate × 730 |
| RDS | alicloud_db_instance |
On-demand DB instance hour (per engine + spec) × 730 |
| Redis (ApsaraDB) | alicloud_kvstore_instance |
On-demand instance hour (per engine + spec) × 730 |
| MongoDB | alicloud_mongodb_instance |
On-demand instance hour (per spec) × 730 |
| NAT Gateway | alicloud_nat_gateway |
Fixed spec-based hourly rate × 730 |
| VPN Gateway | alicloud_vpn_gateway |
Fixed spec-based hourly rate × 730 |
Alibaba prices are quoted in CNY.
Priced live via the Huawei Cloud BSS API (ListOnDemandResourceRatings).
Supports all commercial Huawei Cloud regions.
| Product | Terraform type | Priced component |
|---|---|---|
| ECS | huaweicloud_compute_instance |
On-demand instance hour (per flavor) × 730 |
| EVS | huaweicloud_evs_volume |
Per-GB-month storage rate × provisioned size |
| EIP | huaweicloud_vpc_eip |
Fixed hourly rate × 730 |
| ELB | huaweicloud_elb_loadbalancer |
Fixed hourly rate × 730 |
| RDS | huaweicloud_rds_instance |
On-demand DB instance hour (per engine + flavor) × 730 |
| DCS (Redis) | huaweicloud_dcs_instance |
On-demand instance hour (per engine + spec) × 730 |
| DDS (MongoDB) | huaweicloud_dds_instance |
On-demand instance hour (per flavor) × 730 |
| NAT Gateway | huaweicloud_nat_gateway |
Fixed spec-based hourly rate × 730 |
| CCE (Kubernetes) | huaweicloud_cce_cluster |
Control-plane hour (per cluster) × 730 |
Huawei prices are quoted in CNY.
Usage is never guessed: COS/CDN/CFS/SCF and S3/EFS/EIP are marked
usage_requiredunless a versioned usage file supplies both the quantity and a documented rate. Missing usage is unpriced — never reported as a fake $0. DynamoDB remains plan-priced only inPROVISIONEDmode;PAY_PER_REQUESTrequires usage and is skipped.
Why not BM / ES / EMR? These have no create-instance pricing API — Bare Metal (
bm) and Elasticsearch (es) can only price an existing instance by ID, and EMR requires a deeply-nested multi-node cluster spec that a Terraform plan doesn't map cleanly. Pricing them from a plan would be guesswork, so they are intentionally out of scope.
# .github/workflows/cloudtab.yml
on: pull_request
jobs:
cost:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: susunola/cloudtab@v0
env:
TENCENTCLOUD_SECRET_ID: ${{ secrets.TENCENTCLOUD_SECRET_ID }}
TENCENTCLOUD_SECRET_KEY: ${{ secrets.TENCENTCLOUD_SECRET_KEY }}
with:
path: "infra/"
base-ref: ${{ github.event.pull_request.base.ref }}A sticky PR comment like this shows up on every PR that changes .tf files.
The Action downloads a release archive to a temporary directory and verifies it
against the release's checksums.txt before extraction. This verification is
mandatory and fails closed; cloudtab-version must therefore be v0.3.20 or
newer (older releases predate signed-off checksum manifests). latest is parsed
from GitHub's release JSON and validated as a semantic version before it is used in
a download URL.
scripts/check.sh runs the same checks as CI (gofmt, go vet, go build,
go test -race ./...) and exits non-zero on the first failure. Run it before
every commit, or install it as a pre-commit hook so it runs automatically:
bash scripts/check.sh
ln -sf ../../scripts/check.sh .git/hooks/pre-commit# stripped dev binary for your local arch (Makefile uses -trimpath -ldflags "-s -w")
make build-dev # => ./cloudtab (~74 MB; ~114 MB without the strip flags)
# full CI-equivalent check (go vet + go test -race)
make checkThe dev binary is built with -trimpath -ldflags "-s -w", which strips debug
symbols and DWARF info and shrinks it from ~114 MB to ~74 MB. The GitHub
Release artifacts are compressed further with UPX on Linux (~13–15 MB each per
the release script); macOS binaries are not UPX-compressed because UPX
does not support the Mach-O format. A plain go build ./cmd/cloudtab (no strip
flags) yields the larger ~114 MB binary and should be avoided for distribution.
plan.json ─► parser ─► mapper (per resource type) ─► pricing engine ─► provider backends
│ │ │
├── tencentcloud_* ──────────┤ ├─► Tencent InquiryPrice APIs
├── aws_* ───────────────────┤ ├─► AWS Pricing API
├── alicloud_* ──────────────┤ ├─► Alibaba BSS API
└── huaweicloud_* ───────────┤ └─► Huawei BSS API
│
└─► local cache (sha256 → JSON)
│
▼
table / JSON / markdown
Full architecture in the visual architecture diagram.
Tencent Cloud (current):
- M1 — CVM end-to-end
- M2 — CBS, EIP, CLB
- M3 —
diffcommand + markdown output - M4 — GitHub Action + sticky PR comment
- M5 — TencentDB MySQL/Redis,
usage.ymloverride wiring (--usage-file,--before-usage-file,--after-usage-file) - M6 — Source-attributed usage estimates for COS/CDN/CFS/SCF and AWS S3/EFS/EIP (explicit quantity + supplied rate; missing usage remains unpriced)
Multi-cloud (current):
- M7 — Provider abstraction (
internal/pricing/engine.godispatch + lazy backends) - M8 — AWS EC2/EBS/ELB/RDS/ElastiCache/DocDB/Neptune/Redshift/OpenSearch/MQ/MSK/DynamoDB/EKS/NAT via Pricing API
- M9 — Alibaba Cloud ECS/Disk/EIP/SLB/RDS/Redis/MongoDB/NAT/VPN via BSS
GetPayAsYouGoPrice - M10 — Huawei Cloud ECS/EVS/EIP/ELB/RDS/DCS/DDS/NAT/CCE via BSS
ListOnDemandResourceRatings
Beyond:
- VS Code inline hints (
Save as .tf → cost changes here)
The console calculator lives outside your PR flow and requires re-entering every parameter manually. cloudtab reads the actual plan you'll apply and answers "what changes" — the thing reviewers actually care about.
MIT © cloudtab contributors. Not affiliated with Tencent Cloud, AWS, Alibaba Cloud, or Huawei Cloud.