This tool estimates the monthly and annual AWS cost of running the Drupal
infrastructure defined in the terraform-aws-drupal module set, per
client, per environment (e.g. dev / stage / prod). It is designed to mirror the
variables exposed by that Terraform code so an environment can be configured here
exactly as it would be in a terraform.tfvars file.
All unit prices are pulled live from the AWS Price List API, queried against the real AWS account, and cached as JSON for up to 36 hours (a scheduled Lambda refreshes the cache daily). Where AWS does not expose a rate via the API directly — most notably Savings Plans — a clearly labelled, configurable assumption is used instead of a hard number.
| Input | Terraform variable | Notes |
|---|---|---|
| Region | aws_region | Selects which cached price catalog is used |
| Hours running per day | derived from enable_schedule | 24 if always-on; configurable (e.g. 12) if out-of-hours shutdown enabled — applied to ECS/Solr compute only |
| Savings Plan discount % | n/a | User-selected assumption — see below |
nat_gateway_count × NAT Gateway hourly rate × 730 hrs/month,
plus an estimated GB/month data processed × per-GB rate.
Cost = (task_cpu/1024 vCPU) × (task_memory/1024 GB)
× desired_count tasks × hours-running-per-day × 30.42
avg days/month, at the current on-demand Fargate rate for the selected region. Solr
(if enable_solr) is priced identically as a second Fargate task.
rds_mode = "serverless"): priced per ACU-hour, using a configurable "average ACU" assumption (utilization is workload-dependent and not something Terraform sets).rds_mode = "provisioned"): priced per instance_class instance-hour.enable_reader doubles the instance/ACU cost (adds a reader instance).Only priced if enable_redis = true, using a configurable node type/count.
Configurable estimated GB stored × per-GB-month rate (Standard storage class).
Fixed hourly rate × 730 hrs/month, plus an estimated LCU count × per-LCU hourly rate.
Estimated GB data transfer out/month × per-GB rate, plus estimated request count × per-10k-requests rate.
Only priced if enable_waf = true: fixed monthly Web ACL charge + per-rule charge + per-million-requests charge.
Estimated backup storage GB (sized off the DB storage estimate) × per-GB-month backup storage rate. Cross-region copy adds a per-GB data transfer charge.
Estimated ingestion GB/month × per-GB ingestion rate + storage GB × retention days × per-GB-month storage rate.
AWS does not expose Savings Plan rates via the Price List API — discounts depend on commitment term, payment option, and commitment amount, which are commercial choices, not lookups. The calculator instead offers a "Savings Plan discount %" input (based on AWS's published typical Compute Savings Plan discount ranges) applied only to compute-eligible line items (Fargate, RDS provisioned instances). This is clearly labelled in the UI as an estimate, not a live rate.
When enabled for an environment, the calculator reduces the effective monthly hours for ECS/Solr Fargate tasks (and optionally Aurora Serverless) using a configurable "hours running per day" input. NAT Gateway, ALB, CloudFront, storage and backups are treated as running/accruing 24/7 regardless, since they aren't stopped by the schedule module in Terraform.
For each environment: a monthly and annual estimate broken down by cost category.
For a client (e.g. vc): the sum across all configured environments
(dev + stage + prod), shown as both a per-environment table and a grand total. Use
the Export PDF button on the calculator to save or print the
current breakdown.
These are estimates only. Actual AWS bills depend on real usage (data transfer, request volume, storage growth), AWS support plan, and applicable taxes. Prices are cached for up to 36 hours; use "Refresh prices" on the calculator to force a live lookup.