Cutting the AWS Bill — 28 case studies

Part 10: AI Agent and Subagent Prompt Library

Part 10 of 11 · intermediate

Sep 26, 2026 · devops · 34 min read · 6839 words intermediate

AI agent prompts for AWS cost work: check, reason and suggest, never act.

devops aws ai-agents prompts

A copy-ready prompt library for doing AWS cost work with Claude, Claude Code or any AI agent, including a multi-agent pattern with specialist subagents, an independent critic and a synthesiser. Every prompt makes the model check, reason and suggest rather than act: evidence for every claim, arithmetic for every saving, confidence and reversibility labels, fixes written as proposals marked DO NOT RUN, and the series' order of operations so commitments always come last. The page starts with a safe read-only setup (IAM role, SCP, Claude Code permission rules), then covers discovery (size and slope, "expected or buggy?", unit metrics), one audit per lever, verification and red-team prompts, design and pull-request review, weekly rituals, repatriation TCO and executive summaries. Each prompt is collapsible with one-click copy, and the whole library downloads as a single Markdown file.

Get the full report. This series expands the research report Cutting the AWS Bill: 28 Case Studies (53 pages, PDF, 780 KB). One click starts the download.

⬇ Download PDF

1. Why a prompt library for AWS cost work

Part 2 described how Levels.fyi, in its second clean-up, gave an LLM read-only AWS credentials and pointed it at questions with measurable answers: which log groups were growing fastest and what was writing to them, what was pushing an RDS line item up a little every day. That shortened the forensic work from days to hours. It also produced near-misses (a proof of concept that tested one instance and missed half the fleet, a timeout that measured the wrong thing) that came from acting on plausible answers without a control.

This part turns everything in the series into prompts you can paste into Claude, Claude Code, or any other AI agent, and a multi-agent pattern for large estates. The prompts are designed to make the model check, reason and suggest: every one demands evidence for each claim, arithmetic for each saving, a confidence label, a reversibility label, and proposals rather than actions. They encode the order of operations (see, stop, shrink, swap, flex, redesign, commit, relocate) so the agent cannot talk you into a three-year commitment before it has found the idle resources.

⬇ Download all prompts (.md)

Click a title to expand a prompt. Copy copies the full prompt in one click, even while collapsed. Replace every [[...]] placeholder with your own values.

How the prompts fit together Guard railssystem prompt Discoverysize + slope Lever auditsone per lever Verifycritic, red team Plan90 days + rhythm Single agent: run left to right in one session. Agent team: lead does discovery, specialists run lever audits in parallel, an independent critic verifies, the lead synthesises the plan.

Fig. 1 - Guard rails first, verification before planning, commitments last.

2. Set up a safe, read-only environment first

The prompts tell the model not to change anything. That is a request, not a control. The real control is the credential you give the agent. Three layers, from strongest to weakest:

  1. A dedicated read-only IAM role with only the permissions cost analysis needs (Cost Explorer, CUR via Athena, CloudWatch read, describe/list on the services you analyse). No write actions at all.
  2. An organisation-level guard (a Service Control Policy) that denies write actions for that role even if someone later attaches a broader policy by mistake.
  3. Client-side rules in the agent tool (for example Claude Code permission rules) that only pre-approve read commands, so anything else prompts a human.

The IAM policy below is a starting sketch for the read-only role; trim or extend it to the services you actually use, and test it with the IAM policy simulator. Many teams simply attach the AWS managed ReadOnlyAccess or ViewOnlyAccess policies plus billing read access; the sketch shows the idea of scoping.

{
  "Version": "2012-10-17",
  "Statement": [
    { "Sid": "CostData",
      "Effect": "Allow",
      "Action": ["ce:Get*", "ce:Describe*", "ce:List*", "cur:Describe*",
                 "budgets:View*", "pricing:GetProducts", "pricing:DescribeServices"],
      "Resource": "*" },
    { "Sid": "Describe",
      "Effect": "Allow",
      "Action": ["ec2:Describe*", "rds:Describe*", "elasticache:Describe*",
                 "dynamodb:Describe*", "dynamodb:List*", "eks:Describe*", "eks:List*",
                 "ecs:Describe*", "ecs:List*", "elasticloadbalancing:Describe*",
                 "s3:ListAllMyBuckets", "s3:GetBucket*", "s3:GetLifecycleConfiguration",
                 "s3:GetInventoryConfiguration", "s3:GetMetricsConfiguration",
                 "cloudwatch:Get*", "cloudwatch:List*", "logs:Describe*",
                 "logs:StartQuery", "logs:GetQueryResults",
                 "compute-optimizer:Get*", "savingsplans:Describe*"],
      "Resource": "*" },
    { "Sid": "AthenaOverCUR",
      "Effect": "Allow",
      "Action": ["athena:StartQueryExecution", "athena:GetQueryExecution",
                 "athena:GetQueryResults", "glue:GetTable", "glue:GetDatabase",
                 "glue:GetPartitions"],
      "Resource": "*" }
  ]
}
Athena needs one write. Athena writes query results to an S3 location, so the role needs s3:PutObject on a dedicated results bucket (and s3:GetObject on the CUR bucket). Scope those to the two buckets only. Also note that logs:StartQuery runs Logs Insights queries, which are billed per GB scanned: set a small time range in prompts. Keep CUR data out of prompts sent to external services unless your policy allows it, and log every call with CloudTrail.

For Claude Code, run the session with the read-only profile and pre-approve only read commands. The fragment below is an illustrative .claude/settings.json; check the permission-rule syntax against the Claude Code documentation for the version you run. IAM remains the real guard rail; these rules are a convenience so you are prompted for anything unexpected.

{
  "permissions": {
    "allow": [
      "Bash(aws ce get-cost-and-usage:*)",
      "Bash(aws ce get-cost-forecast:*)",
      "Bash(aws ec2 describe-:*)",
      "Bash(aws rds describe-:*)",
      "Bash(aws s3api get-bucket-:*)",
      "Bash(aws s3api list-buckets:*)",
      "Bash(aws logs describe-log-groups:*)",
      "Bash(aws cloudwatch get-metric-statistics:*)",
      "Bash(aws athena get-query-results:*)",
      "Bash(kubectl get:*)",
      "Bash(kubectl top:*)"
    ],
    "deny": [
      "Bash(aws * delete*)",
      "Bash(aws * terminate*)",
      "Bash(kubectl delete:*)",
      "Bash(terraform apply:*)"
    ]
  }
}
# start a session with the read-only profile only
AWS_PROFILE=cost-readonly claude

3. Guard rails: the system prompt to use every time

Paste this first, as the system prompt or the first message, in Claude, Claude Code, ChatGPT, Gemini or any agent framework. Every other prompt on this page assumes it is loaded. It encodes the lessons from the 28 cases: read-only access, evidence before claims, arithmetic before savings, verify from the inside, and commitments last.

Read-only AWS cost-forensics system prompt

Use when: Always, before any other prompt.

You are a senior AWS cost engineer working as a READ-ONLY cost-forensics assistant.

HARD RULES
1. Read-only. Never run, and never hand me as ready-to-run, any command that creates, modifies,
   deletes, stops, terminates, tags, attaches, detaches or purchases anything
   (no create-*, delete-*, terminate-*, stop-*, modify-*, put-*, update-*, purchase-*, tag-*).
   If a fix needs a change, write it as a PROPOSAL, label the command "DO NOT RUN - FOR REVIEW",
   and explain how to roll it back.
2. Evidence first. Every claim cites the exact command or query you ran and the relevant excerpt
   of its output. If you did not run it, label the claim "UNVERIFIED".
3. Show the arithmetic. Every saving = quantity x unit price x time. State the price, its source,
   the region and the date. If you use list prices from memory, say they are approximate and
   must be confirmed on the AWS pricing page.
4. Distrust fresh data. Cost Explorer's last 2-3 days are incomplete. Compare full periods, and
   keep one "control" line item that should not have changed.
5. Separate fact, inference and guess. Confidence for each finding:
   HIGH = measured directly, MEDIUM = inferred from indirect data, LOW = hypothesis to test.
6. Verify from the inside before calling anything idle. Metrics are not usage: backups, health
   checks and replication create activity on resources nobody uses. Check connections, clients,
   access logs or last-write times.
7. Ask, do not assume, about business context: retention and compliance requirements, SLOs,
   ownership, planned migrations. List your open questions at the end.

ORDER OF OPERATIONS
See -> Stop -> Shrink -> Swap -> Flex -> Redesign -> Commit -> Relocate.
Never recommend Savings Plans, Reserved Instances or Database Savings Plans before idle resources
are removed and the baseline is right-sized. Commitments discount waste too.

FORMAT FOR EVERY FINDING
- Title
- Lever: visibility | idle | right-size | storage | logging | network | graviton | spot |
         architecture | database | commitments | relocation
- Evidence: command(s) + output excerpt
- Why it costs money: which term (quantity, unit price, time, topology) and why
- Estimated monthly saving: low / high, with the arithmetic
- Confidence: HIGH / MEDIUM / LOW
- Risk and reversibility: reversible / reversible-with-snapshot / irreversible
- Proposed change: reviewable diff or command marked DO NOT RUN - FOR REVIEW
- How to verify after the change (metric, query, and how many days to wait)
- Open question for the owner (if any)

End every answer with: (1) a ranked table of findings by saving x confidence / effort,
(2) the open questions, (3) what you could NOT check and why.
Compact version (for small context windows or chat apps)

Use when: When the tool limits system-prompt length.

You are a read-only AWS cost analyst. Never create, change, delete, stop, tag or buy anything;
write any fix as a proposal marked DO NOT RUN. Cite the command and output for every claim or mark
it UNVERIFIED. Show saving arithmetic (quantity x price x time) with price source and region.
Distrust the last 3 days of billing data. Verify "idle" from inside the resource. Label confidence
HIGH/MEDIUM/LOW. Order: see, stop, shrink, swap, flex, redesign, commit, relocate - never commit
before right-sizing. End with a ranked table, open questions, and what you could not check.

4. Discovery: read the bill like the case-study teams did

These three prompts reproduce the method behind Levels.fyi, Segment, Duolingo and Lyft (Part 2): rank line items by size and by slope, interrogate each large or growing number with "expected or buggy?", and normalise by a business unit. Run them in order the first time.

Bill triage: top line items by size and by slope

Use when: First session on any account.

Using the rules above, triage this AWS account's bill.

Period: last 3 full calendar months (exclude the current partial month).
Data source: [[Cost Explorer via aws ce get-cost-and-usage | CUR 2.0 in Athena table cur_db.cur_table | pasted CSV]]

Do the following and show every command/query you use:
1. Rank the top 20 services by cost for the latest full month.
2. For each, show month-over-month change in $ and %, and the 3-month trend.
3. Produce a SECOND ranking: line items (service + usage type) growing every month, even if small.
   A small number growing every day is a lead (Levels.fyi chased a $26 line item this way).
4. For the top 10 by size and top 10 by growth, classify:
   - dominant cost term: quantity / unit price / time / topology
   - shape: flat baseline / periodic / spiky-batch / growing-with-data
   - likely lever from: idle, right-size, storage, logging, network, graviton, spot,
     architecture, database, commitments
5. Flag anything that looks like a surprise: CDN or WAF near the top, backups larger than the
   databases they protect, NAT gateway bytes, data transfer, staging more expensive than prod.

Output: two tables (by size, by slope), then a list of 5-10 hypotheses to investigate next,
each with the exact next query to confirm or kill it.
"Expected or buggy?" interrogation of one line item

Use when: For each suspicious line item from triage.

Investigate one line item: [[SERVICE / USAGE TYPE, e.g. "AmazonRDS / BackupUsage"]].
Current monthly cost: [[$X]]. Trend: [[rising / flat / spiky]].

Answer, with evidence:
1. What exactly is being billed (usage type, operation, resource IDs)? Break it down by resource
   ID and by tag (owner, service, environment) using CUR or Cost Explorer grouping.
2. Is this number EXPECTED given the workload? Compare to a business driver (requests, users,
   GB ingested). If cost grows faster than the driver, say so.
3. What decision caused it (retention setting, log destination, autoscaling rule, incident
   scale-up, default configuration)? Find the config that produces the cost.
4. Is that decision still correct? List what you would need to know from the owner.
5. If it is waste: propose the fix, estimate saving with arithmetic, and state risk.
6. Sanity-check your estimate by reproducing the current cost from list prices. If you cannot
   reproduce it within ~10%, your model of the cost is wrong - say what is missing.

Remember: most waste is not a bug. It is an old decision that was correct once.
Pick and compute a unit-cost metric

Use when: Once, then weekly.

Help me define a unit-cost metric for this business, as Lyft did with "AWS cost per ride".

Business: [[describe product and main driver: rides, orders, active users, events, GB ingested]]
Available driver data: [[where the business metric lives]]

1. Propose 2-3 candidate unit metrics and pick one, explaining why it moves with value delivered.
2. Write the query that computes monthly (and weekly) AWS cost / driver for the last 6 months.
3. Explain how to allocate shared costs and commitment discounts (RIs, Savings Plans, credits)
   so teams are not optimising against misleading numbers.
4. Propose a per-team breakdown and how to normalise for teams whose cost is driven by other
   teams' traffic, so a leaderboard is fair.
5. Give the target trend and the alert rule (e.g. unit cost rises 2 weeks in a row).

5. Lever-by-lever audits

One prompt per lever from the twelve in Part 1. Each asks the agent to measure first, verify from the inside, price the change with arithmetic and propose, not execute. Use them individually, or give each one to a separate subagent (section 5).

Idle and orphaned resources (verify before deleting)

Use when: Weeks 2-4 of the playbook.

Find idle, orphaned and forgotten resources in [[account / regions]]. Read-only.

Check at least:
- EC2 instances with low CPU AND low network for 14+ days; instances with no owner tag
  or "temp"/"test" in the name; stopped instances still paying for EBS and Elastic IPs
- Unattached EBS volumes; snapshots whose source volume/instance no longer exists
- Unassociated Elastic IPs and all public IPv4 addresses (each is billed hourly)
- Load balancers with no healthy targets or no requests
- NAT gateways with very low bytes processed
- ElastiCache clusters and RDS instances with zero or near-zero connections
- Old AMIs, ECR images beyond the last N releases, CloudWatch log groups with no writes

For EVERY candidate:
1. Show the evidence it is idle.
2. Verify from the INSIDE where possible (Redis INFO clients/commands, RDS connections and
   last write, access logs). Activity from backups, health checks or replication is not usage.
3. Identify the owner from tags, CloudTrail creator, or naming.
4. Propose the safe path: snapshot/backup -> block access or scale to zero for 7 days -> delete.
5. Monthly saving with arithmetic.

Output a table: resource, evidence, inside-check result, owner, saving, confidence, safe next step.
S3, EBS and backups: lifecycle with payback per bucket

Use when: Storage is a top-10 line item.

Audit storage cost (S3, EBS, snapshots, RDS/Aurora backups, ECR) for [[account]].

S3, per bucket (use S3 Inventory + Athena or Storage Lens):
1. Bytes, object count, AVERAGE OBJECT SIZE, storage class mix, % objects under 128 KB.
2. Versioning on? Size of noncurrent versions. Lifecycle rules present? Incomplete multipart uploads?
3. Access pattern by object age (Storage Class Analysis): when do retrievals collapse?
4. Event notifications / replication that a bulk storage-class transition would trigger.

For each candidate transition compute payback explicitly:
   one_off_cost  = objects / 1000 x transition price per 1,000 requests
   monthly_saving = GB x (current price per GB-month - target price per GB-month)
   payback_months = one_off_cost / monthly_saving
Include minimum storage duration (30/90/180 days), the 128 KB minimum billable size and expected
retrieval charges. Rank buckets by payback; recommend only those under [[6]] months.
(Canva moved only buckets with average object >= ~400 KB; Rewind paid $103K for a 6-month payback.)

Also:
- Snapshots and backups: is backup storage larger than the databases? What retention does
  compliance actually require (defined and followed, not maximal)? Propose a tiered GFS policy.
- EBS gp2 -> gp3 candidates with IOPS/throughput settings to preserve performance.
- ECR: images to keep (running + rollback) vs expire.

Output: per-bucket table with payback, the lifecycle JSON for the top 3 (DO NOT APPLY),
and warnings (event consumers to pause, minimum durations).
CloudWatch logs and observability spend

Use when: Logs or CloudWatch in the top 20.

Audit logging and observability cost for [[account]].

1. List CloudWatch log groups by stored bytes and by ingestion over the last 30 days.
   Flag every group with retention = never expire.
2. For the 10 fastest-growing groups: which function/service writes to them, and what does a
   typical event look like? Look for full payload logging, stack traces, per-item logging in
   loops, and debug level left on in production.
3. Estimate cost per log line: invocations/month x bytes per event -> GB -> x ingestion price.
   Show what a compact summary line would cost instead (Levels.fyi cut one line ~99%).
4. WAF, CDN, VPC flow and audit logs: where are they shipped, how often are they read, and could
   they go to S3 (or an infrequent-access log class) with only blocked/suspicious events kept?
   Mark anything security or compliance owns as "needs security sign-off".
5. Propose retention per log group type (app, access, audit, security) as a table.

Output: top offenders with the offending code/config location, saving arithmetic, and the
retention policy table.
NAT, data transfer, cross-AZ and hairpins

Use when: Data transfer or NAT in the top 20.

Audit network and data-transfer cost for [[account / VPCs]].

1. From CUR, break down DataTransfer, NatGateway-Bytes, Regional-Bytes (cross-AZ), inter-region,
   internet egress and CloudFront/WAF request charges by resource and usage type.
2. NAT gateways: bytes processed per gateway. Use VPC Flow Logs (sampled) to list the top
   source -> destination talkers. Identify traffic to S3, DynamoDB, ECR, CloudWatch, STS that
   should use endpoints.
3. Gateway endpoints: do S3 and DynamoDB endpoints exist in every VPC, AND is the prefix-list
   route present in EVERY private route table the workloads actually use? (nOps saved $12K/month
   from a single route.)
4. Interface endpoints: for ECR, CloudWatch, STS etc., compare NAT cost vs endpoint hourly-per-AZ
   + per-GB cost at the measured volume.
5. Cross-AZ: which service pairs exchange the most bytes across zones? Is zone-aware or
   topology-aware routing possible? Is capacity balanced per AZ?
6. Hairpins: is internal traffic going out through a public CDN/WAF/API Gateway/NAT and back in?
   (Levels.fyi's SSR called its own API through the CDN.)
7. Public IPv4 addresses that could move behind private subnets + endpoints.

Output: findings with bytes/month, $/month, fix, and expected $ after the fix.
Right-sizing and Graviton readiness

Use when: Compute is the largest cost.

Assess compute right-sizing and Graviton (arm64) readiness for [[account / cluster / service list]].

Right-sizing:
1. For EC2, ECS/Fargate tasks and EKS pods: requested vs used CPU and MEMORY at p50/p95/p99 over
   30 days. Flag anything using < 40% of requests at p95.
2. Minimum task/replica counts vs off-peak traffic.
3. Incident scale-ups never reverted (capacity changed during an incident, left high).

Graviton, per workload:
4. Runtime (JVM version, Python, Node, Go, Rust, .NET), native dependencies, x86-only binaries,
   licensed agents, base images with arm64 manifests, CI able to build multi-arch.
5. Score each workload: READY / NEEDS WORK (list blockers) / NOT A CANDIDATE.
6. Rank READY workloads by monthly compute spend; the first pilot is the largest READY one.
7. Pilot plan: side-by-side pool, metrics to compare (p50/p99 latency, throughput per instance,
   cost per unit of work, error rate), rollback path.

Cost model per candidate: current $ -> (instances x new price) adjusted for measured throughput.
Show the formula. Warn if existing instance-family RIs would be stranded.
Kubernetes: Spot, Karpenter and consolidation readiness

Use when: EKS/GKE/OKE clusters.

Review Kubernetes cost and elasticity readiness for cluster [[name]] (read-only kubectl + AWS).

1. Cluster fixed costs: number of clusters, control-plane fees, any version in extended support.
2. Node utilisation: sum of requests vs allocatable vs actual usage per node pool.
3. Per workload: requests vs usage (p95), replicas, HPA settings.
4. Movability checklist per Deployment/StatefulSet:
   terminationGracePeriodSeconds, SIGTERM handling (ask if unknown), readiness probe,
   PodDisruptionBudget, startup time, statefulness, do-not-disrupt annotations.
   Classify: SPOT-SAFE / CONSOLIDATION-SAFE / KEEP ON-DEMAND.
5. CI runners and batch jobs: already on Spot? Diversified instance types?
6. Non-production namespaces running 24x7: hours that could be scaled to zero
   (e.g. 07:00-22:00 weekdays = 75 of 168 hours, ~55% saving).
7. Propose a Karpenter NodePool (requirements, capacity types, disruption budget) as YAML
   marked DO NOT APPLY, and the order of adoption: requests -> hardening -> CI on Spot ->
   consolidation -> stateless prod on Spot.

Remember: Karpenter packs REQUESTS, not usage. Right-size requests first.
Databases and caches

Use when: RDS, Aurora, DynamoDB or ElastiCache in the top 20.

Audit database and cache cost for [[account]].

RDS / Aurora:
1. Instance classes (t3/m5 vs Graviton t4g/m7g/r7g), storage type (gp2 vs gp3 vs io1/io2), Multi-AZ.
2. Aurora: I/O charges as a share of cluster cost. If I/O > ~25% of Aurora spend, model
   Aurora I/O-Optimized (show both totals).
3. Backup storage vs database size; snapshot retention vs what compliance actually requires.
4. Connections and CPU: over-provisioned or idle instances; read replicas nobody reads.

DynamoDB:
5. Capacity mode per table vs traffic shape (on-demand for spiky, provisioned + autoscaling
   for steady). Hot partitions driving table-wide provisioned capacity.
6. TTL configured? If TTL was added recently, do old rows lack the attribute (need backfill)?
7. Large, rarely read tables that fit the Standard-IA table class.

ElastiCache:
8. Clusters with no clients (verify with INFO). Redis OSS -> Valkey pricing difference.
9. Cache TTLs: a longer TTL on rarely changing data can cut downstream calls (Duolingo: 1 min ->
   1 h cut traffic to another service by 60%+).

Output: per-database findings, saving arithmetic, migration risk, and whether a Database
Savings Plan makes sense AFTER these changes (not before).
Commitments: size Savings Plans to the trough

Use when: Only after the above.

Size commitments for [[account / org]]. Assume right-sizing and cleanup are done;
if they are not, say so and stop.

1. Pull hourly (or daily) eligible On-Demand spend for EC2/Fargate/Lambda and for databases
   over the last 30-60 days. Show min, p10, median, mean, max.
2. Current commitments: coverage (discounted eligible usage / eligible usage) and utilisation
   (used / purchased), expiry dates, and whether any are pooled or bought through a third party
   (check current AWS resale/pooling rules).
3. Planned changes in the next 12 months (Graviton moves, Spot adoption, migrations, exits)
   that would shrink or reshape the baseline. Ask me if unknown.
4. Recommend a commitment at roughly the TROUGH of the optimised baseline, not the average.
   Compare Compute Savings Plans, EC2 Instance Savings Plans / RIs, and Database Savings Plans.
5. Propose a ladder (e.g. quarterly tranches) so commitments expire at different times.
6. Show the expected saving and the worst case if usage drops 20%.

Targets: utilisation > 95%, coverage 70-85% of the steady baseline. Never recommend buying
anything without my explicit approval.

6. Reasoning, verification and review prompts

Agents are fluent and sometimes wrong. These prompts make the model check itself or check someone else: reproduce a claimed saving from list prices, attack a plan as a sceptical reviewer, and put a cost estimate into every design and infrastructure pull request. They turn "sounds right" into "reconciles".

Sanity-check a claimed saving

Use when: Before reporting any number to leadership.

Verify this claimed saving: [[e.g. "Cut RDS snapshot storage from 15.7 TB to 3 TB, saves ~$1,200/month"]].

1. Rebuild the saving from first principles: quantity removed x unit price x time. State the
   unit price, region, source and date.
2. Does it reconcile within ~10%? (Example: 12.7 TB x ~$0.095/GB-month is ~$1,235, which matches.)
3. If not, list the plausible reasons: free allowances, tiered pricing, discounts or commitments
   already applied, currency, partial months, different scope.
4. Is the saving recurring or one-off? Net of new costs (e.g. PrivateLink, a new cache,
   transition fees, vendor share of savings)?
5. What control would prove it after the change (a metric or line item and how long to wait,
   remembering the last 2-3 days of billing are incomplete)?

Verdict: CONFIRMED / PLAUSIBLE / DOES NOT RECONCILE, with reasons.
Devil's advocate: attack a cost-reduction plan

Use when: Before approving any plan.

Act as a sceptical principal engineer and SRE reviewing this cost plan: [[paste plan]].

For each item, attack it on:
1. Reliability: what breaks under failure, peak load, AZ loss, Spot interruption or consolidation?
2. Hidden cost: transition fees, minimum durations, retrieval charges, egress, vendor fees,
   double-running, engineering time, licence changes, stranded commitments.
3. Evidence quality: measured, inferred or assumed? Single-instance or single-AZ proof of concept?
   Fresh billing data?
4. Order of operations: is anything committed before it is optimised?
5. Side effects: event floods, cache TTL mismatches, timeouts measuring the wrong thing,
   traffic moving to another AZ or backend.
6. Compliance and security: retention, audit logs, data residency, attack surface.

Then rewrite the plan: keep, modify (how), or drop each item, and add the missing guard rails
and verification steps. Be specific; do not be polite at the expense of accuracy.
Design review: cost per unit of work

Use when: Every design doc (Duolingo practice).

Review this design for cost before it is built: [[paste design / architecture]].

1. Define the unit of work (request, event, stream-second, job, GB processed) and expected
   volume (average and peak).
2. Walk every hop and list what is billed PER UNIT: Lambda invocations and GB-seconds, Step
   Functions state transitions (Standard) vs requests+duration (Express), API Gateway requests,
   SQS/SNS/EventBridge messages, S3 PUT/GET, NAT GB processed, cross-AZ GB (both directions),
   CloudWatch log GB, CDN/WAF requests.
3. Compute cost per unit and per month at average and peak. Show the table.
4. Flag high-frequency inner loops passing data through object storage, queues or orchestrators
   (Prime Video paid per state transition per stream-second and cut 90% by moving the loop in-process).
5. Suggest a cheaper alternative for the top 2 cost drivers and re-cost it.
6. Add a retention section: what data is kept, copies, how long, why.

Output: cost-per-unit table, top risks, recommended changes, and the numbers to put in the doc.
Terraform / IaC pull-request cost and guard-rail review

Use when: On every infrastructure PR.

Review this Terraform/CloudFormation/CDK diff for cost and guard rails: [[paste diff]].

Check and report:
1. New or resized resources and their approximate monthly cost delta (show arithmetic).
2. Guard rails: gp3 by default (not gp2), mandatory tags (owner, service, environment,
   cost-centre), S3 lifecycle (noncurrent version expiry, abort incomplete multipart uploads),
   CloudWatch log retention set (never "never expire"), no public IPv4 by default, S3/DynamoDB
   gateway endpoints in new VPCs, arm64/Graviton where the workload allows, no oversized defaults.
3. Anything that creates per-request or per-GB costs on a hot path (NAT, cross-AZ, CDN/WAF
   hairpins, Step Functions Standard in a loop).
4. Commitments or long-term purchases hidden in the change.

Output: a PR comment with a cost table (+/- $/month), blocking issues, non-blocking suggestions,
and suggested code changes as diff snippets.

7. Multi-agent and subagent orchestration

For a large account, one agent runs out of context and attention. The case studies were all team efforts; an agent team works the same way. The pattern below fans out one read-only specialist per lever, forces every specialist to return the same structured findings, sends everything through an independent critic, and only then synthesises a plan. It works in Claude Code (subagents), in the Claude Agent SDK, and in any framework that can run parallel agents.

Lead agent: fan out specialists, then critic, then synthesis

Use when: Large or multi-account estates.

You are the LEAD cost engineer coordinating a team of read-only specialist subagents for
[[account / org / regions]]. Follow the guard-rail rules above and pass them to every subagent.

PHASE 1 - Triage (you): run the bill-triage analysis. Produce the top line items by size and by
slope and assign each to a lever.

PHASE 2 - Fan out (parallel subagents, one per lever with material spend):
  - storage-specialist   (S3, EBS, snapshots, backups, ECR)
  - compute-specialist   (right-sizing, Graviton readiness, idle compute)
  - network-specialist   (NAT, endpoints, cross-AZ, egress, hairpins, public IPv4)
  - logging-specialist   (CloudWatch logs, WAF/CDN logs, observability)
  - database-specialist  (RDS, Aurora, DynamoDB, ElastiCache)
  - k8s-specialist       (clusters, requests, Spot/consolidation readiness)
Give each subagent: its scope, the relevant line items and dollar amounts from Phase 1, the
read-only rules, and the JSON schema below. Each must return ONLY a JSON array of findings.

PHASE 3 - Critic (separate subagent, fresh context): send all findings to a critic that
re-verifies evidence and arithmetic, checks order of operations, and marks each finding
CONFIRMED / PLAUSIBLE / REJECTED with a reason. Drop REJECTED findings.

PHASE 4 - Synthesis (you): de-duplicate, resolve conflicts (e.g. two specialists claiming the
same saving), and produce:
  1. Ranked findings table (saving x confidence / effort)
  2. A 90-day plan in the order See, Stop, Shrink, Swap, Flex, Redesign, Commit
  3. Commitment recommendation ONLY for the post-optimisation baseline
  4. Open questions per owner
  5. What no agent could check

FINDING SCHEMA (every subagent must use exactly this):
{
  "id": "storage-001",
  "lever": "storage|compute|network|logging|database|k8s|commitments|architecture|idle",
  "title": "",
  "resources": ["arn or id"],
  "evidence": [{"command": "", "excerpt": ""}],
  "cost_term": "quantity|unit_price|time|topology",
  "current_monthly_usd": 0,
  "saving_monthly_usd": {"low": 0, "high": 0, "arithmetic": ""},
  "one_off_cost_usd": 0,
  "payback_months": 0,
  "confidence": "HIGH|MEDIUM|LOW",
  "risk": "",
  "reversibility": "reversible|reversible-with-snapshot|irreversible",
  "proposed_change": "DO NOT RUN - FOR REVIEW: ...",
  "verify_after": "",
  "owner_question": ""
}
Claude Code subagent definition (save as .claude/agents/aws-cost-storage.md)

Use when: One file per specialist.

---
name: aws-cost-storage
description: Read-only AWS storage cost specialist (S3, EBS, snapshots, RDS backups, ECR). Use for storage lifecycle, retention and payback analysis. Returns findings as JSON.
tools: Bash, Read, Grep, Glob
model: sonnet
---

You are a read-only AWS storage cost specialist.

Rules:
- Only run read/list/describe/get commands (aws s3api get-*/list-*, aws ec2 describe-*,
  aws rds describe-*, aws ce get-*, Athena SELECT queries). Never create, modify, delete,
  tag or transition anything. Write fixes as proposals marked DO NOT RUN - FOR REVIEW.
- Cite command + output excerpt for every claim, or mark it UNVERIFIED.
- Show saving arithmetic with unit prices, region and source.
- For any storage-class transition compute: objects/1000 x transition price (one-off),
  GB x price difference (monthly), payback months. Respect minimum durations (30/90/180 days)
  and the 128 KB minimum billable object size. Check event notifications and replication that
  a bulk transition would trigger.
- Compare backup storage to the size of the databases it protects; ask what retention is
  actually required.

Return ONLY a JSON array of findings using the schema given by the lead agent.

(Create sibling files for aws-cost-compute, aws-cost-network, aws-cost-logging,
aws-cost-database and aws-cost-k8s by swapping the description and the checks from the
lever prompts above.)
Critic / verifier subagent

Use when: Phase 3 of the orchestration.

You are an independent critic. You did not produce these findings and you have no stake in
them. Input: a JSON array of cost findings from several specialists.

For EACH finding:
1. Re-run or re-read the cited evidence where possible. Does the excerpt actually support the claim?
2. Recompute the arithmetic. Check units (GB vs GiB, hourly vs monthly, per-AZ multipliers),
   free allowances, and whether discounts/commitments already apply.
3. Check "idle" claims were verified from inside the resource, not from metrics alone.
4. Check order of operations: no commitment recommended before right-sizing.
5. Check hidden costs: transition fees, minimum durations, retrieval, egress, new resources
   (endpoints, caches), vendor fees, double-running.
6. Check for double counting across specialists (same resource, same saving).
7. Check reversibility and blast radius are stated honestly.

Output the same JSON array with two added fields per finding:
  "verdict": "CONFIRMED|PLAUSIBLE|REJECTED",
  "critic_notes": "specific reason, corrected arithmetic if any"
Be strict. A confident-sounding finding without evidence is REJECTED.
Synthesiser: turn verified findings into a 90-day plan

Use when: Phase 4, or any time you have a findings list.

Input: verified findings (JSON with verdicts). Produce a plan for [[team/org]].

1. Keep CONFIRMED and PLAUSIBLE findings; list PLAUSIBLE ones with the test that would confirm them.
2. Group into the 90-day phases:
   Days 1-7 See (data, tags, anomaly detection, unit metric)
   Weeks 2-4 Stop and shrink (idle, retention, lifecycle, endpoints, gp3, schedules)
   Weeks 4-8 Swap and flex (right-size, Graviton pilot, DB options, Spot/Karpenter)
   Weeks 8-12 Redesign and commit (chatty paths, storage migrations by payback, Savings Plans on
   the NEW baseline)
3. For each item: owner, effort (S/M/L), saving range, risk, rollback, verification metric.
4. Totals: expected monthly saving (low/high), one-off costs, and payback.
5. The operating rhythm to keep the savings (weekly anomaly review, monthly showback, quarterly
   commitment and retention review, cost section in design docs) and 5-7 KPIs with targets.
6. A one-paragraph executive summary at the top, written for a non-technical reader.
Lead, specialists, critic, synthesis Lead: triage storage compute network logging database k8s Critic Lead: synthesis Same JSON schema everywhere; critic has fresh context and no stake in the findings.

Fig. 2 - Fan out by lever, verify independently, then plan.

Why a separate critic? An agent that produced a finding tends to defend it. A critic with fresh context, told explicitly that it has no stake and that confident claims without evidence must be rejected, catches arithmetic errors, double counting across specialists (two agents claiming the same NAT saving), and "idle" claims that were only checked from metrics. It is the automated version of the human review that Levels.fyi's near-misses show is necessary.

8. Recurring rituals, data-only analysis, repatriation and reporting

Savings erode without a rhythm. These prompts run the weekly and monthly rituals, analyse an exported CSV when the agent has no AWS access at all (for example in a chat app), test the repatriation question honestly, and write the summary leadership will actually read.

Weekly anomaly and top-movers review

Use when: Every week, 15 minutes.

Run this week's cost review for [[account/org]] (last 7 full days vs the previous 7, and vs
the same week last month; ignore the last 2 days as incomplete unless marked otherwise).

1. Top 10 movers by $ change (service + usage type + tag owner).
2. Any Cost Anomaly Detection alerts and their root cause if identifiable.
3. Unit-cost metric this week vs 4-week average.
4. New resources without owner/service/environment tags and their spend.
5. For each mover: EXPECTED (explain with a business driver) or INVESTIGATE (next query).

Output: a short message suitable for a team channel: 5 bullets max, then a table.
No AWS access: analyse a pasted Cost Explorer / CUR export

Use when: Chat apps, or before granting any credentials.

I cannot give you AWS access. Below is an export: [[paste CSV from Cost Explorer grouped by
service and usage type, monthly, 3-6 months; or a CUR extract]].

1. Validate the data: columns, periods, currency, any partial month. State assumptions.
2. Rank by size and by growth; flag line items growing every month.
3. For each top item, name the likely lever and the SPECIFIC question or command my team should
   run in AWS to confirm it (give the exact aws CLI or Athena query, read-only).
4. Estimate the plausible saving range per item, clearly labelled as UNVERIFIED estimates.
5. List what extra export (grouping, tag, usage type, resource ID) would make the analysis precise.

Do not invent resource names or numbers that are not in the data.
Should we leave (part of) AWS? Honest TCO

Use when: Only after optimising on AWS.

Help me test whether repatriating [[workload]] would pay off. Be even-handed; the answer may be no.

Workload facts: [[load shape, storage TB, egress TB/month, managed services used, team skills,
existing data-centre space/contracts, current AWS spend by category]]

1. Score the workload: steady vs variable load; storage/egress share of bill; managed-service
   dependence; in-house ops and hardware skills; existing racks/power/contracts; portability
   (e.g. already on Kubernetes). Explain each score.
2. Build the 5-year TCO for BOTH options. AWS side must use the BEST achievable price (after
   right-sizing, Graviton, Spot, Savings Plans), not On-Demand list price.
   Owned side: hardware (amortised, refresh), storage, network/transit, second site/DR,
   power/space, people and on-call, replacing managed services, migration one-off,
   double-running period, stranded commitments, egress (check whether exit transfer fees can be waived).
3. Payback and break-even month; sensitivity to +/-20% on the three largest inputs.
4. Middle path: which workload class to move (bulk storage, steady compute) and which to keep.
5. Risks: lift-and-shift without modernisation (GEICO's bills grew 2.5x), rack/site failure, hiring.

Verdict: STAY AND OPTIMISE / PARTIAL MOVE / FULL MOVE, with the conditions that would change it.
Executive summary for leadership

Use when: Monthly or after a programme phase.

Write a one-page executive summary from these results: [[paste findings/plan/weekly data]].

Audience: CFO/CTO, non-specialist. Structure:
1. Headline: monthly run-rate change and unit-cost change, with the period compared.
2. What we did (3-5 bullets, plain language, no service jargon without a one-line explanation).
3. What it cost (one-off spend, engineering time) and payback.
4. What is next (next 90 days) and the decision we need from leadership, if any
   (e.g. approve a Savings Plan of $X/hour for 1 year, approve a retention policy).
5. Risks and what we are deliberately NOT doing.

Rules: every number must come from the input; label estimates as estimates; no hype.

9. Using these prompts well

A few habits make the difference between a useful session and a confident-sounding one.

  • One lever per session or per subagent. Long mixed sessions drift. Give each audit its own context and the relevant slice of the bill.
  • Give numbers, not adjectives. Paste the actual line items and dollar amounts from triage into each lever prompt so the agent prioritises by money, not by what it finds interesting.
  • Always ask for the query. Even when the agent has access, ask it to show the command. You can re-run it, save it, and turn it into a weekly job.
  • Keep a control. Before and after any change, check one line item that should not move, and wait several days: the last 2-3 days of billing data are incomplete.
  • Treat output as leads. Nothing leaves the session as a fact until a human has checked the evidence or the verify prompt has reconciled the arithmetic.
  • Humans apply changes. The agent proposes diffs and commands marked DO NOT RUN; a person reviews and applies them through the normal change process (pull request, Terraform plan, change window).
SituationStart withThen
First look at an unfamiliar accountGuard rails + Bill triage"Expected or buggy?" on the top 5
No credentials allowed yetAnalyse a pasted exportHand the generated read-only queries to the team
Large or multi-account estateLead agent orchestrationCritic, then synthesiser
New design or architectureDesign review: cost per unit of workDevil's advocate
Infrastructure pull requestIaC PR reviewAdd as a CI step
Before buying Savings PlansCommitments sizingVerify + Devil's advocate
Reporting resultsSanity-check a claimed savingExecutive summary

10. What agents are good and bad at here

From the case studies and the Levels.fyi experience, agents are strong at the tedious middle of cost work: enumerating resources, joining billing data with configuration, spotting a line item that grows a little every day, writing the Athena query you would otherwise look up, and doing arithmetic consistently once told to show it. They are weak where the cost work was hardest for humans too: knowing the business reason behind a retention period, knowing which team owns an untagged resource, judging whether a workload tolerates interruption, and resisting a neat-looking conclusion drawn from a single instance or a single Availability Zone.

The prompts on this page are built around that split. They let the agent do the enumeration and arithmetic, force it to separate measured facts from inferences, and push every judgement call back to a named owner as an open question. Used that way, an agent is the cost-forensics assistant the report describes, not an autopilot.

Which model or tool should I use?

Any capable model works with these prompts. Claude Code is convenient because it can run the read-only AWS CLI and kubectl commands itself and supports subagents defined in .claude/agents/; chat apps work with the pasted-export prompt. What matters more is the read-only credential and the evidence-and-arithmetic rules.

Is it safe to give an agent AWS credentials?

Only a dedicated read-only role, ideally with a Service Control Policy denying writes as a second layer, CloudTrail logging on every call, and client-side rules that prompt for anything unexpected. Never give an agent an administrator or a personal credential for this work.

Can the agent apply the fixes too?

Keep a human in the loop. The prompts produce reviewable diffs and commands marked DO NOT RUN. Apply them through your normal change process (pull request, Terraform plan, change window), so rollbacks, approvals and audit trails still work.

How do I stop the agent inventing numbers?

Require a command and output excerpt for every claim, label anything else UNVERIFIED, and run the sanity-check prompt on any saving before you report it. The critic subagent rejects findings with no evidence.

Takeaways

  • Load the guard-rail prompt first, every time: read-only, evidence, arithmetic, confidence, reversibility, commitments last.
  • Credentials are the real control. Dedicated read-only IAM role, an SCP denying writes, CloudTrail, and client-side rules as a convenience.
  • Start with size and slope, then interrogate each big or growing number with "expected or buggy?".
  • One specialist per lever, one schema for all, an independent critic, then synthesis into a 90-day plan.
  • Verify before you report: reproduce every saving from list prices and keep a control line item.
  • Humans apply changes through the normal change process; the agent proposes.

References & further reading

Keep it offline. The complete 28-case report, with the scoreboard, lever matrix and 90-day playbook, is one PDF.

⬇ Download PDF
← Part 9 next: Part 11 →
© cvam — written in plaintext, served warm