Avenue AWS cost handoff report — shared account 521228113048
Prepared: 2026-08-05 UTC
Audience: the Avenue agent team (this document is written to stand alone — no prior context from the Raxx side is assumed)
Scope: read-only decomposition of Avenue's AWS spend in the shared account, evidence of utilization, and a ranked recommendation list. Nothing in Avenue's infrastructure was changed, tagged, stopped, or modified during this research. All figures are UnblendedCost, USD, from Cost Explorer pulled 2026-08-05; resource state inspected the same day.
Companion doc (whole-account baseline): docs/business/bookkeeper/2026-08-aws-cost-breakdown.md
Why you are receiving this
AWS account 521228113048 is shared between two tenants: Raxx CI infrastructure (ci-woodpecker-*, us-east-2) and the Avenue project (avenue-*, us-east-1 + a DR key in us-west-2). The July 2026 account bill was $502.06, which the account operator has flagged as unacceptable. Avenue's share is roughly half. The operator's directive is that each tenant receives its own decomposition and recommendation list; every change to Avenue resources is Avenue's decision — this report only supplies the numbers and the levers.
1. Avenue's July 2026 spend — precise decomposition
Bottom-up, per-line measurement (Cost Explorer usage-type granularity, cross-checked against live resource inventory):
| Line | Resources | July $ |
|---|---|---|
| NAT Gateway hours | avenue-dev-nat-0, avenue-staging-nat-0 (2 × $0.045/hr × 744 hr) |
$66.96 |
| NAT Gateway data processing | 4.7 GB billed across BOTH gateways all month | $0.21 |
| ECS Fargate | 2 tasks (1 per env), 0.5 vCPU / 1 GB each, 24/7 | $36.80 |
| ALB hours + LCU | avenue-dev-api, avenue-staging-api (2 × $0.0225/hr × 744 hr + $0.17 LCU) |
$33.65 |
| RDS instances | avenue-dev-postgres, avenue-staging-postgres (2 × db.t4g.micro, single-AZ, $23.81) + gp3 storage 2×20 GB ($4.60) + backup ($0.31) |
$28.72 |
| CloudTrail | avenue-trail + avenue-staging-trail, both multi-region ($23.88 us-east-1 + $2.90 us-east-2 + $0.24 other regions) |
$27.02 |
| Public IPv4 addresses | 6 addresses × $0.005/hr × 744 hr (2 NAT EIPs + 2 ENIs per ALB) | $22.33 |
| KMS | 11 customer-managed keys ($10.83 us-east-1 + ~$1.00 avenue-tf-state-dr in us-west-2) |
$11.84 |
| Secrets Manager | ~22 secrets (avenue/* + 2 RDS-managed rotation secrets) × $0.40 |
$8.48 |
| Route 53 health checks | 2 × HTTPS/30s against bdca7f-{dev,staging}-api.moosequest.app |
$4.79 |
| CodeBuild | 6 projects (avenue-{dev,staging}-tf-{plan,apply,plan-pr}) |
$2.39 |
| CodePipeline | avenue-dev-tf-pipeline, avenue-staging-tf-pipeline (1 active-pipeline charge) |
$1.00 |
| CloudWatch alarms | 20 of the account's 37 alarms are avenue-* (~54% of $2.59) |
~$1.40 |
| S3 | 6 buckets (avenue-cloudtrail*, avenue-tf-state*, avenue-tf-plan-artifacts*, avenue-{dev,staging}-{feedback,media}) — share of $1.97 account-wide |
~$0.50–1.00 |
| Measured Avenue total | ≈ $246 |
Note on the $261.31 headline. The whole-account baseline doc attributed $261.31 to Avenue using a residual method (account total minus explicitly-Raxx lines minus a shared bucket). The bottom-up measurement above lands at ≈ $246/mo; the ~$15 delta is Raxx-side EBS volumes and regional data transfer in us-east-2 (booked under "EC2 – Other") that the residual swept into Avenue's bucket. Use ≈ $246/mo as Avenue's true July run rate. August-to-date daily spend is consistent (~$8.1/day ≈ $245/mo full-month equivalent: $5.00/day carrying the project=avenue tag + ~$3.1/day in usage types that do not inherit resource tags — CloudTrail paid events, public IPv4, KMS, Secrets Manager, Route 53).
Environment split is almost exactly 50/50: dev ≈ $123, staging ≈ $123 (the two envs are architecturally identical).
2. Utilization evidence — both environments are idle
Everything below is CloudWatch data, 2026-07-22 → 2026-08-05, read-only:
- ALB traffic is 100% synthetic. Both ALBs serve a flat ~45,000 requests/day (≈ 31/min) with no weekday/weekend or day/night variation — the signature of health-check traffic only (each env has a Route 53 HTTPS check at 30 s plus ALB target health checks). LCU charges for the month were $0.17 total, i.e. effectively zero real payload. There is no detectable human or client traffic on either environment.
- RDS is idle.
avenue-dev-postgres: CPU average 3.3–3.8%, max 6.8%; connections average ≈ 1 (the rotation/monitoring connection), max 7.avenue-staging-postgres: connections average ≈ 1, max 9 (brief spikes consistent with deploy/migration runs). Both are already the smallest instance class (db.t4g.micro, single-AZ, 20 GB gp3) — the instances are not oversized in class; the cost is that there are two of them running 24/7 for zero workload. - Fargate is idle.
avenue-dev-apiservice: CPU average 0.4–0.5%, max 1.3%. One task per env (0.5 vCPU/1 GB), desired=running=1, 24/7. - NAT gateways are idle. The two NAT gateways together processed ~4.7 GB in the entire month ($0.21 of data processing against $66.96 of hourly charges). Their only apparent use is ECR image pulls, Secrets Manager calls, and CloudWatch log egress from the Fargate tasks.
- Dev and staging run the identical image. Both ECS services point at the same image digest (
avenue-api@sha256:8579841…). Combined with zero traffic on both, the two environments are currently exact duplicates of each other. - CloudTrail is duplicated. Both
avenue-trailandavenue-staging-trailareIsMultiRegionTrail: true+IncludeGlobalServiceEvents: true. CloudTrail does not scope by tag or by env — each trail independently records 100% of account-wide API activity (including all Raxx CI activity in us-east-2, which is why $2.90 of Avenue's CloudTrail bill accrues there). AWS bills the first copy of management events free and every additional copy at $2.00/100k events, so the ~$24/mo ofPaidEventsRecordedis, in all likelihood, almost entirely the cost of the second, duplicate trail.
Inferred stage (from the evidence, not a judgment): Avenue is pre-traffic — infrastructure is built and CI/CD (Terraform CodePipelines, drift detection at 07:00 UTC daily, RDS credential rotation) is operating, but no workload exists yet. The bill is ~$246/mo of scaffolding availability, not of usage.
3. Ranked recommendations
Ordered by projected monthly savings. Savings overlap — items 1–3 partially cannibalize each other; the scenario table after the list shows realistic combinations. Every item is Avenue's call; the "Only Avenue can decide" column states the judgment the numbers can't make.
| # | Item | Current $/mo | Recommended change | Projected $/mo saved | Risk / effort | Only Avenue can decide |
|---|---|---|---|---|---|---|
| 1 | Scheduled stop/start of dev + staging outside working hours | $183 schedulable (NAT $67.17 + Fargate $36.80 + ALB $33.65 + RDS instance-hours $23.81 + IPv4 $22.33 during down-hours) | Tier A (low effort): EventBridge Scheduler → ECS desiredCount 0 + rds stop-db-instance nightly/weekends. Tier B (full): Terraform-driven destroy/apply of NAT + ALB + EIPs on the same schedule — you already have avenue-*-tf-pipeline + drift detection, so the plumbing exists; add schedule windows and suppress the 07:00 UTC drift alarms during down-hours. At 40–60 waking hours/week, non-running time is 64–76% |
Tier A: ~$40–46. Tier B: ~$115–140 | Low risk (no external traffic exists to interrupt; RDS auto-restarts after 7 days so the scheduler must re-stop). Effort: A low, B medium | Working-hours window; whether CI/deploy jobs need the envs up on-demand; drift-alarm handling |
| 2 | Question whether staging needs to exist yet | ~$123 (staging's full half) | Staging currently runs the byte-identical image as dev with zero traffic — it verifies nothing dev doesn't. Terraform-destroy the staging env (state is preserved in avenue-tf-state*; re-apply recreates it in minutes) until there's a promotion pipeline that actually differs from dev |
~$110–120 (supersedes item 1 for the staging half) | Low technical risk (fully Terraform-managed, reversible); the RDS instance should be snapshotted first if any data matters | Whether staging serves a compliance/promotion purpose the resource state doesn't show |
| 3 | Eliminate the NAT gateways | $67.17 + 2 EIPs $7.44 | The tasks egress ~4.7 GB/mo — NAT is 300× overprovisioned. Option a: run Fargate tasks in public subnets with assignPublicIp + strict security groups (adds 2 × $3.72 IPv4, removes both NATs). Option b: fck-nat / NAT instance on t4g.nano (~$3/mo each). Option a is simpler and standard for pre-prod |
~$55–60 net (if envs stay 24/7; mostly subsumed by item 1 Tier B or item 2) | Medium: public-subnet tasks are SG-protected but lose the private-subnet defense layer — fine for pre-traffic dev/staging, revisit for prod | Security posture: is private-subnet isolation a hard requirement pre-launch? |
| 4 | Consolidate CloudTrail to one multi-region trail | $27.02 | Keep one trail (or one per intended long-term account boundary), delete the duplicate. Since the first management-event copy is free, the paid-events line should drop to ≈ $0, not just half | ~$13–27 (evidence says the high end) | Low, if neither trail feeds a separately-IAM-scoped consumer — verify before deleting. Effort: low (Terraform) | Whether dev vs staging trail separation exists for a real audit/access-isolation reason |
| 5 | Collapse the two ALBs into one | $33.65 + 4 IPv4 $14.88 | One ALB with host-header rules (bdca7f-dev-api.* / bdca7f-staging-api.*) routing to the two target groups |
~$24 (ALB $16.83 + 2 IPv4 $7.44); moot if item 2 taken | Low-medium: blurs env isolation at the edge; both envs share the ALB's blast radius | Whether edge-level env isolation matters before launch |
| 6 | KMS key consolidation | $11.84 (11 keys) | 5 purpose-keys per env (feedback/media/logs/rds/secrets) could collapse to 2–3 per env if shared-purpose keys are acceptable; keep tf-state + DR keys | ~$4–6 | Low $, but key-per-purpose is a deliberate compliance pattern — do not collapse casually | Compliance/data-isolation posture |
| 7 | Small trims | ~$14 | Route 53 health checks: 2 × HTTPS/30s on idle envs — drop to one, or standard 30s→ no fast-interval extras (~$2–4). Secrets Manager: prune unused of the ~22 secrets ($0.40 each). S3 lifecycle on avenue-cloudtrail* (IA at 30 d, Glacier at 90 d) |
~$3–6 | Negligible | Which secrets/checks are still load-bearing |
Realistic combined scenarios
| Scenario | Composition | Avenue projected $/mo |
|---|---|---|
| Today (no change) | — | ≈ $246 |
| A — schedule only | Item 1 Tier B on both envs | ≈ $105–130 |
| B — pause staging + schedule dev | Item 2 + item 1 Tier B on dev + item 4 | ≈ $60–80 |
| C — envs must stay 24/7 | Items 3 + 4 + 5 + 6 + 7 | ≈ $125–135 |
The floor while any env exists 24/7 is the fixed layer: CloudTrail (1 trail ≈ $0–3), KMS, Secrets Manager, tf-pipelines, S3, alarms ≈ $25–30/mo.
4. Shared-account hygiene (affects both tenants — coordinate, don't act unilaterally)
- Public IPv4 is an account-wide cost class. AWS charges $0.005/hr per in-use public IPv4 (since Feb 2024). Avenue holds 6 of the account's public IPs ($22.33/mo); Raxx holds the rest ($10.09/mo). Every NAT/ALB decision above moves this line.
- Cost-allocation tags went active 2026-08-02 (
project,env,managed-by, and casing variants). Avenue's Terraform tagging (project=avenue, lowercase) is already the account convention going forward — no action needed on your side. Be aware that only ~$5.00/day of Avenue spend inherits resource tags in Cost Explorer; CloudTrail paid events, public IPv4, KMS, Secrets Manager, and Route 53 usage types don't carry the tag, so tag-filtered views understate Avenue by ~40%. Use this report's bottom-up method (or region us-east-1 minus Lightsail/Bedrock) for true-ups. - Tag-casing inconsistency is on the Raxx side, not yours. The
ci-woodpeckerTerraform module tagsProject(capital P); any account report grouped by lowercaseprojectsilently drops Raxx CI. A Raxx-side ticket exists to standardize to lowercase; Avenue needs no change. - Unattributed third-tenant resources — flagged to the operator, owned by neither tenant. Two Route 53 hosted zones (
apl-project-monkey.net,boingboing-inc.net, $1.00/mo) and sixprototype-site-{dev,staging,prod}-*S3 buckets with matching CloudFormation stacks in us-west-1 match neither tenant's naming or tagging. Do not tag, adopt, or delete these; ownership confirmation is with the account operator. - Your CloudTrail trails record Raxx activity too (multi-region trails capture the whole account), which is why part of your CloudTrail spend accrues in us-east-2. If the tenants ever split into separate accounts/OUs, trail strategy should be revisited then; for now, item 4 in the recommendation list (consolidating your two trails to one) is safe regardless.
5. Method + reproduction notes
- Cost data:
aws ce get-cost-and-usage, July 2026 full month + Aug MTD, grouped by SERVICE / USAGE_TYPE / REGION / TAG:project. - Inventory:
elbv2 describe-load-balancers|describe-target-groups|describe-listeners,ecs list-clusters|describe-services|describe-task-definition,rds describe-db-instances,ec2 describe-nat-gateways|describe-addresses|describe-network-interfaces|describe-vpc-endpoints|describe-volumes,cloudtrail(from the baseline pass),kms list-aliases(us-east-1/2, us-west-2),secretsmanager list-secrets,route53 list-health-checks,codebuild list-projects,codepipeline list-pipelines,events list-rules,cloudwatch describe-alarms. - Utilization:
cloudwatch get-metric-statistics— AWS/RDSCPUUtilization+DatabaseConnections, AWS/ApplicationELBRequestCount, AWS/ECSCPUUtilization; daily granularity 2026-07-22 → 2026-08-05. - Identity used: IAM user
aws-developer-alpha(read-only usage for this pass; no writes to any Avenue resource).