1{2 "_comment": "Shared AWS infrastructure pricing rates (us-east-1, USD) for the estimate phase. Rates evolve on AWS's cadence, independent of the cost algorithm, so they live here as DATA and the estimate procedure does a lookup, not a guess. Each service carries its rates + a multi_az_handling key; the cost FORMULAS live in the estimate phase's prose (the algorithm is not data). Consumed by the heroku-to-aws and azure-to-aws skills; intended to be shared with gcp-to-aws, which still has its own markdown cache. AI-model / DynamoDB / Redshift / Athena / SageMaker rates are NOT here (they remain in the gcp-to-aws pricing cache). Lambda WAS on that exclusion list and no longer is \u2014 azure-to-aws maps consumption-plan Function Apps to Lambda, so the rates were harvested here from gcp's cache.",3 "_region_warning": "EVERY rate in this file is _meta.region (us-east-1) and there is no multiplier. A design targeting another region is being priced with us-east-1 numbers: eu-west-1 and eu-central-1 run roughly 5-12% higher for compute and RDS, and some services differ more. This file cannot fix that on its own \u2014 the consuming estimate MUST compare the design's target region against _meta.region and, when they differ, state the mismatch next to every total and widen the accuracy band. Pricing is cache-only — there is no live pricing lookup to reprice against, so the mismatch is stated rather than corrected. Silently presenting us-east-1 figures as a eu-west-1 estimate is the failure this key exists to prevent.",4 "_meta": {5 "last_updated"
11 "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted.",
12 "last_verification": "2026-07-19 spot-check against published pricing pages: Fargate Linux/x86 us-east-1 ($0.000011244/vCPU-s = $0.04048/hr; $0.000001235/GB-s = the published $0.004445/hr GB rate) matches, and Heroku dyno flat rates match devcenter; no rate changes applied this refresh."
13 },
14 "_multi_az_convention": {
15 "_comment": "THE TRAP: a design's multi_az:true means different things per service. Each service rate below carries multi_az_handling so the formula applies the RIGHT adjustment, never a blanket multiplier.",
16 "baked_in": "rate already INCLUDES multi-AZ; NEVER apply a multiplier (multi_az flag is informational)",
17 "multiplier_x2": "rate is single-AZ; multiply by 2 when design multi_az == true",
18 "intrinsic": "service is inherently multi-AZ; no adjustment; multi_az flag informational"
19 },
20 "fargate": {
21 "per_vcpu_hour": 0.04048,
22 "per_gb_mem_hour": 0.004445,
23 "multi_az_handling": "n/a (Fargate cost is task-size driven, not AZ-driven)",
24 "per_vcpu_hour_arm64": 0.03238,
25 "per_gb_mem_hour_arm64": 0.003556
26 },
27 "alb": {
28 "monthly_fixed": 16.43,
29 "per_lcu_hour": 0.008
30 },
31 "nlb": {
32 "monthly_fixed": 16.43,
33 "per_lcu_hour": 0.006,
34 "_note": "Network Load Balancer: $0.0225/NLB-hr (= monthly_fixed 16.43 over 730 hrs, the same fixed charge as ALB) + $0.006/LCU-hr. Harvested from gcp-to-aws references/shared/pricing-cache.md (Networking > Network Load Balancer). Priced by the same formula shape as alb."
35 },
36 "rds_postgresql": {
37 "multi_az_handling": "baked_in",
38 "_note": "pricing-cache RDS PostgreSQL table is labeled (On-Demand, Multi-AZ) \u2014 the rate ALREADY includes multi-AZ. Do NOT double for multi_az.",
39 "instances": {
40 "db.t4g.micro": 0.032,
41 "db.t4g.small": 0.065,
42 "db.t4g.medium": 0.129,
43 "db.t4g.large": 0.258,
44 "db.t4g.xlarge": 0.517,
45 "db.t4g.2xlarge": 1.034,
46 "db.m6g.large": 0.356,
47 "db.m6g.xlarge": 0.712,
48 "db.m6g.2xlarge": 1.424,
49 "db.m6g.4xlarge": 2.848,
50 "db.m6g.8xlarge": 5.696,
51 "db.m6g.16xlarge": 11.392,
52 "db.r6g.16xlarge": 14.5,
53 "db.x2g.16xlarge": 18.05,
54 "db.t3.small": 0.068,
55 "db.t3.medium": 0.136,
56 "db.t3.large": 0.272,
57 "db.t3.xlarge": 0.544,
58 "db.m6i.large": 0.382,
59 "db.m6i.xlarge": 0.764,
60 "db.m6i.2xlarge": 1.528,
61 "db.m6i.4xlarge": 3.056,
62 "db.m6i.8xlarge": 6.112,
63 "db.r6i.large": 0.48,
64 "db.r6i.xlarge": 0.96,
65 "db.r6i.2xlarge": 1.92,
66 "db.r6i.4xlarge": 3.84,
67 "db.r6i.8xlarge": 7.68,
68 "db.r6g.large": 0.454,
69 "db.r6g.xlarge": 0.908,
70 "db.r6g.2xlarge": 1.816,
71 "db.r6g.4xlarge": 3.632,
72 "db.r6g.8xlarge": 7.264
73 },
74 "storage_per_gb_month": 0.23,
75 "_instances_note": "Multi-AZ on-demand hourly, us-east-1. t4g.* verified from the pricing cache; m6g/r6g/x2g (Graviton) and t3/m6i/r6i (x86) families added to MATCH the instance classes the postgres design table (flexible-server-rds-sizing.json) can emit \u2014 x86 rows are the azure default (Windows/.NET fleets, non-Graviton), ~5-7% above their Graviton counterparts; approximate (~2x single-AZ), verify against the public AWS pricing pages for a large estimate. Every rds_instance_class the design can emit MUST have a rate here (no unpriced production DBs)."
76 },
77 "aurora_postgresql": {
78 "multi_az_handling": "intrinsic",
79 "_note": "Aurora replicates across 3 AZs by default; rate is as-listed, no multi-AZ adjustment.",
80 "instances": {
81 "db.t4g.medium": 0.073,
82 "db.t4g.large": 0.146,
83 "db.r6g.large": 0.26,
84 "db.r6g.xlarge": 0.553,
85 "db.r6g.2xlarge": 1.104,
86 "db.r6g.4xlarge": 2.208,
87 "db.r6g.8xlarge": 4.416,
88 "db.r6g.16xlarge": 8.832
89 },
90 "_instances_note": "r6g.16xlarge extrapolated 2x from 8xlarge; verify via MCP if it drives a large estimate.",
91 "storage_per_gb_month": 0.1,
92 "io_per_million": 0.2
93 },
94 "elasticache": {
95 "multi_az_handling": "multiplier_x2",
96 "_note": "pricing-cache ElastiCache is Single-AZ; apply x2 when design multi_az == true.",
97 "nodes": {
98 "cache.t4g.micro": 0.016,
99 "cache.t4g.small": 0.032,
100 "cache.t4g.medium": 0.065,
101 "cache.t3.micro": 0.017,
102 "cache.t3.small": 0.034,
103 "cache.t3.medium": 0.068,
104 "cache.m6g.large": 0.206,
105 "cache.m6g.xlarge": 0.412,
106 "cache.m6g.2xlarge": 0.824,
107 "cache.m6g.4xlarge": 1.648,
108 "cache.m6g.8xlarge": 3.296,
109 "cache.m6g.12xlarge": 4.944,
110 "cache.m6g.16xlarge": 6.592
111 },
112 "_nodes_note": "m6g sizes above large extrapolated by doubling; verify via MCP if large."
113 },
114 "msk": {
115 "multi_az_handling": "intrinsic",
116 "_note": "broker_count already spans AZs (2 or 3 per design); cost is per-broker, no extra multi-AZ multiplier.",
117 "brokers": {
118 "kafka.t3.small": 0.0456,
119 "kafka.m5.large": 0.21,
120 "kafka.m5.xlarge": 0.42,
121 "kafka.m5.2xlarge": 0.84,
122 "kafka.m5.4xlarge": 1.68,
123 "kafka.m5.8xlarge": 3.36,
124 "kafka.m5.12xlarge": 5.04
125 },
126 "_brokers_note": "MSK broker rates approximate; verify via MCP for a kafka-heavy estimate.",
127 "storage_per_gb_month": 0.1
128 },
129 "eks": {
130 "_comment": "EKS cost = control plane (once) + EC2 nodes; PODS COST $0 (compute billed via nodes \u2014 charging pods double-counts). Added per EKS cluster in the design. ALB (web) and NAT are added by their own lines, NOT re-added here.",
131 "control_plane_monthly": 73,
132 "node_rates_monthly": {
133 "t3.medium": 30.37,
134 "t3.large": 60.74,
135 "t3.xlarge": 121.47,
136 "m6i.large": 70.08,
137 "m6i.xlarge": 140.16,
138 "m6i.2xlarge": 280.32,
139 "m6i.4xlarge": 560.64,
140 "m6i.8xlarge": 1121.28,
141 "m6i.16xlarge": 2242.56,
142 "c6i.large": 62.05,
143 "c6i.xlarge": 124.1,
144 "c6i.2xlarge": 248.2,
145 "c6i.4xlarge": 496.4,
146 "r6i.large": 110.38,
147 "r6i.xlarge": 220.75,
148 "r6i.2xlarge": 441.5,
149 "r6i.4xlarge": 735.84,
150 "r6i.8xlarge": 1766.02,
151 "m7g.large": 59.57,
152 "m7g.xlarge": 119.14,
153 "m7g.2xlarge": 238.27,
154 "m7g.4xlarge": 476.54,
155 "c7g.large": 52.92,
156 "c7g.xlarge": 105.85,
157 "c7g.2xlarge": 211.7
158 },
159 "pod_cost": 0
160 },
161 "nat_gateway": {
162 "monthly_fixed": 32.85,
163 "per_gb_processed": 0.045
164 },
165 "ebs": {
166 "_comment": "EBS volume pricing (us-east-1). Used to price EC2-backed compute root volumes (Elastic Beanstalk instances, EKS nodes) so EB estimates need no known-omission caveat.",
167 "gp3_per_gb_month": 0.08,
168 "eb_root_volume_gb_default": 8,
169 "_default_note": "eb_root_volume_gb_default is the AL2023 EB default root size; use aws_config.root_volume_gb when the design specifies one."
170 },
171 "rds_proxy": {
172 "per_vcpu_hour": 0.015
173 },
174 "route53": {
175 "hosted_zone_monthly": 0.5,
176 "per_million_queries": 0.4
177 },
178 "sqs": {
179 "standard_per_million_requests": 0.4,
180 "fifo_per_million_requests": 0.5,
181 "_note": "Azure Service Bus queues / Storage Queues map to SQS. Standard $0.40/M requests, FIFO $0.50/M; 1M requests/mo free tier (not subtracted). Harvested from gcp-to-aws references/shared/pricing-cache.md (Supporting Services > SQS)."
182 },
183 "sns": {
184 "per_million_publishes": 0.5,
185 "sqs_delivery_per_million": 0.0,
186 "http_delivery_per_million": 0.6,
187 "_note": "Azure Event Grid / Service Bus topics map to SNS. $0.50/M publishes; SQS delivery $0.00/M; HTTP delivery $0.60/M; 1M publishes/mo free tier. Harvested from gcp-to-aws references/shared/pricing-cache.md (Supporting Services > SNS)."
188 },
189 "fast_path_services": {
190 "_comment": "Flat monthly_baseline_est per fast-path add-on \u2014 PINNED stated assumptions for the stopgap (these are estimates, not measured rates; an external pricing source will replace them). per-unit rates kept as documentation of the basis. Use monthly_baseline_est as the breakdown mid; mark the line as an estimate.",
191 "s3": {
192 "storage_per_gb_month": 0.023,
193 "monthly_baseline_est": 5,
194 "_basis": "assumes ~50GB + light requests; storage_per_gb_month is the rate basis"
224 "_use": "same node rates as elasticache (Memcachier mapping)"
225 }
226 },
227 "cloudwatch": {
228 "log_ingestion_per_gb": 0.5,
229 "log_storage_per_gb_month": 0.03,
230 "custom_metric_month": 0.3,
231 "standard_alarm_month": 0.1,
232 "xray_per_million_traces": 5
233 },
234 "ec2": {
235 "_comment": "EC2 On-Demand hourly rates (Linux/x86, us-east-1). Used by the Elastic Beanstalk cost formula to price underlying instances. Every instance_type the EB design can emit MUST have a rate here.",
236 "instances": {
237 "t3.micro": 0.0104,
238 "t3.small": 0.0208,
239 "t3.medium": 0.0416,
240 "t3.large": 0.0832,
241 "t3.xlarge": 0.1664,
242 "m5.large": 0.096,
243 "m5.xlarge": 0.192,
244 "m5.2xlarge": 0.384,
245 "m5.4xlarge": 0.768,
246 "r5.xlarge": 0.252,
247 "m5.8xlarge": 1.536,
248 "t4g.micro": 0.0083,
249 "t4g.small": 0.0166,
250 "t4g.medium": 0.0333,
251 "t4g.large": 0.0666,
252 "m6g.large": 0.0768,
253 "m6g.xlarge": 0.1536,
254 "m6g.2xlarge": 0.3072,
255 "m6g.4xlarge": 0.6144,
256 "m6g.8xlarge": 1.2288,
257 "m6g.16xlarge": 2.4576,
258 "r6g.xlarge": 0.2016,
259 "r6g.4xlarge": 0.8064,
260 "m6i.large": 0.096,
261 "m6i.xlarge": 0.192,
262 "m6i.2xlarge": 0.384,
263 "m6i.4xlarge": 0.768,
264 "m6i.8xlarge": 1.536,
265 "c6i.large": 0.085,
266 "c6i.xlarge": 0.17,
267 "c6i.2xlarge": 0.34,
268 "c6i.4xlarge": 0.68,
269 "r6i.large": 0.1512,
270 "r6i.xlarge": 0.3024,
271 "r6i.2xlarge": 0.6048,
272 "r6i.4xlarge": 1.2096,
273 "r6i.8xlarge": 2.4192,
274 "m7g.large": 0.0816,
275 "m7g.xlarge": 0.1632,
276 "m7g.2xlarge": 0.3264,
277 "m7g.4xlarge": 0.6528,
278 "c7g.large": 0.0725,
279 "c7g.xlarge": 0.145,
280 "c7g.2xlarge": 0.29
281 },
282 "_instances_note": "x86 rates match dyno-eb-sizing ec2_instance_type; Graviton rates ~20% below x86 counterparts for workshop arm64 path \u2014 verify via MCP for large estimates.",
283 "_m6i_note": "m6i.large and m6i.xlarge were the first current-generation rates added; the full m6i/c6i/r6i/m7g/c7g size ladders the design's sizing tables (vm-ec2-sizing.json, appservice-eb-sizing.json) can emit are now all present, at published us-east-1 Linux on-demand rates scaled linearly within each family. The EB/EC2 formula looks up ec2.instances[instance_type]; a design emitting a current-generation type must find a row here or it silently prices from a floor. Graviton (m7g/c7g) rates are ~15-20% below the x86 counterpart. Verify against the published EC2 on-demand pricing page for large estimates.",
284 "_windows_note": "THESE RATES ARE LINUX. An instance whose design carries license_model 'License Included' (Windows Server, SQL Server) costs materially MORE than the row above \u2014 roughly 2x for a general-purpose size \u2014 and no Windows rate or per-vCPU license adder is in this file. Pricing a Windows instance from a Linux row understates it, in the direction that flatters AWS and can invert a migrate/stay recommendation. Pricing is cache-only, so there is no live lookup for the Windows rate: label the line per the estimate phase's partial-line rule rather than silently using the Linux number."
285 },
286 "lambda": {
287 "_comment": "AWS Lambda rates (us-east-1). HARVESTED VERBATIM from gcp-to-aws references/shared/pricing-cache.md (Last updated 2026-08-24), which is where these lived when this file's _comment still called Lambda 'gcp-specific'. Azure Function Apps on a consumption plan map to Lambda, so the exclusion no longer holds.",
288 "per_request": 2e-07,
289 "per_gb_second_x86_first_6b": 1.66667e-05,
290 "per_gb_second_x86_over_6b": 1.5e-05,
291 "per_gb_second_arm64_first_6b": 1.33334e-05,
292 "per_gb_second_arm64_over_6b": 1.2e-05,
293 "free_tier": "1M requests + 400K GB-seconds per month",
294 "multi_az_handling": "intrinsic",
295 "_no_invocation_data_note": "Lambda cost is invocation-driven, and IaC declares no invocation count. With no measured request volume there is no figure to compute: emit null with a stated reason rather than a remembered default. A source consumption plan provisions no worker capacity, so there is no source-side number to carry across either."
296 },
297 "_rate_row_coverage": {
298 "_comment": "THE GAP CLASS this file kept hitting: a service can be present here while the specific RATE ROW a design needs is absent. 'ec2' is in the file; a design emitting m6i.2xlarge finds no row. The shared pricing-mode.md hierarchy keyed its first rung on SERVICE presence, so that case fell through labeled 'cached' with no number behind it. Rung 1b in pricing-mode.md now covers it.",
299 "_who_owes_what": "A skill's sizing tables and this file are a PAIR: every instance_type/instance_class/node_type a sizing table can emit needs a row here, or the estimate has a hole. The pair is not enforced by any tool today. heroku never diverged because its sizing table and these rates were co-authored; a skill whose sizing tables were written from source-cloud SKUs will diverge on day one.",
300 "_do_not_paper_over": "Do NOT substitute a neighbouring row for a missing one (an m5 rate for an m6i design, an rds_postgresql row for a DocumentDB class). A near-miss rate is indistinguishable from a correct one in the output and is never caught. Query the MCP, or mark the line unpriced."
301 },
302 "_absent_services": {
303 "_comment": "Services a consuming skill's design can emit that have NO rates here or in the gcp-to-aws pricing cache. Listed so the hole is visible in the data rather than discovered mid-estimate. Pricing is cache-only, so each stays unpriced until a rate row is added here; until then the estimate marks the line unavailable and excludes it from totals. NEVER fabricate a rate for one of these.",
304 "documentdb": "Azure Cosmos DB (Mongo API) maps to DocumentDB. No documentdb section exists. db.t3.medium is a DOCUMENTDB instance class here \u2014 do not read it from rds_postgresql.instances: different service, and those rates are baked-in Multi-AZ. MCP: AmazonDocDB.",
305 "fsx_windows": "Azure Files (SMB) maps to FSx for Windows File Server. No fsx section exists. Needs per-GiB-month SSD/HDD, single-AZ vs multi-AZ, and throughput capacity. MCP: AmazonFSx.",
306 "ec2_windows_license": "See ec2._windows_note. MCP: AmazonEC2 with operatingSystem=Windows.",
307 "ecr": "Azure Container Registry maps to Amazon ECR. No ecr rates here or in the gcp-to-aws pricing cache. Needs per-GB-month storage + data-transfer rates. Surface it as a visible excluded line rather than pricing it silently. MCP: AmazonECR.",
308 "dynamodb": "Azure Cosmos DB (Core/Table API) maps to DynamoDB. No dynamodb rates here. Needs on-demand vs provisioned WCU/RCU + storage. Surface as a visible excluded line; never fabricate. MCP: AmazonDynamoDB.",
309 "efs": "Azure Files (NFS) maps to EFS. No efs section. Needs per-GiB-month (Standard/IA) + throughput mode. Excluded line until priced. MCP: AmazonEFS.",
310 "kinesis": "Azure Event Hubs (AMQP/SDK) maps to Kinesis Data Streams. No kinesis rates. Needs shard-hour + PUT payload units (on-demand vs provisioned). Excluded line. MCP: AmazonKinesis.",
311 "neptune": "Azure Cosmos DB (Gremlin API) maps to Neptune. No neptune rates. Needs instance-hour + I/O + storage. Excluded line. MCP: AmazonNeptune.",
312 "keyspaces": "Azure Cosmos DB (Cassandra API) maps to Amazon Keyspaces. No keyspaces rates. Needs on-demand/provisioned RU + storage. Excluded line. MCP: AmazonMCS.",
313 "backup": "Azure Backup / Recovery Services vault maps to AWS Backup. No backup rates. Needs per-GB-month warm/cold storage by resource type. Excluded line. MCP: AWSBackup.",
314 "network_firewall": "Azure Firewall maps to AWS Network Firewall. No rates. Needs endpoint-hour + per-GB processed. Excluded line. MCP: AWSNetworkFirewall.",
315 "appconfig": "Azure App Configuration maps to AWS AppConfig. No rates. Needs config-store + API-call pricing. Excluded line. MCP: AWSAppConfig."
316 },
317 "_no_cost_services": {
318 "_comment": "AWS services a consuming skill's design can emit that carry NO standalone charge (control-plane, IAM, or free-tier resources). Listed so the coverage oracle treats them as intentionally rate-free rather than a missing rate. A service here must be genuinely free of a direct hourly/GB/request charge \u2014 costs it INDUCES (e.g. NAT for a VPC, data transfer) are priced on their own lines.",
319 "vpc": "A VPC itself is free; NAT gateway, data transfer, endpoints are separate priced lines.",
320 "vpc_subnet": "Free.",
321 "vpc_route_table": "Free.",
322 "vpc_peering": "No hourly charge; cross-AZ/region data transfer is a separate concern.",
323 "security_group": "Free.",
324 "iam_role": "IAM is free.",
325 "kms_key": "A customer-managed KMS key is ~$1/mo but is bundled into the security baseline, not a per-design line; treated as no standalone design cost here.",
326 "acm_certificate": "Public ACM certificates are free.",
327 "route53_routing_policy": "A routing policy is a config of a hosted zone (route53 is priced); no separate charge.",
328 "session_manager": "Systems Manager Session Manager (Azure Bastion target) has no per-hour charge \u2014 the deliberate cost win over an EC2 bastion.",
329 "ami": "An AMI itself has no charge beyond the EBS snapshot backing it (ebs snapshot is a separate concern)."