Skip to main content

Mapping AWS CUR to FOCUS 1.0: An Engineer's Guide

The Problem: The "Tower of Babel"

AWS calls it lineItem/UnblendedCost. Azure calls it PreTaxCost. Google calls it Cost. As engineers, we can't query this across clouds. FOCUS (FinOps Open Cost & Usage Specification) is the standardized schema that solves this.

The Goal

This guide maps the raw AWS Cost & Usage Report (CUR) fields to their FOCUS v1.0 equivalents. This is the "Normalization" logic required to build a multi-cloud dashboard.


1. The Identity Columns (Who & Where)

AWS CUR ColumnFOCUS ColumnTransformation Logic
lineItem/ResourceIdResourceIdDirect Map (1:1).
product/regionRegionDirect Map.
lineItem/UsageAccountIdSubAccountIdThe account where the resource lives.
bill/PayerAccountIdBillingAccountIdThe management account paying the bill.

Engineer's Note: AWS often leaves ResourceId null for support charges or taxes. FOCUS requires strict handling of these nulls.


2. The Money Columns (What we Pay)

This is where it gets dangerous. Using the wrong column ruins your unit economics.

Billed Cost (The Invoice)

  • AWS: lineItem/UnblendedCost
  • FOCUS: BilledCost
  • Logic: This is the cash leaving the bank today.

Effective Cost (The True Burn)

  • AWS: savingsPlan/SavingsPlanEffectiveCost (if covered) OR lineItem/UnblendedCost (if on-demand).
  • FOCUS: EffectiveCost
  • The Logic: FOCUS simplifies this logic. If a row is covered by a Savings Plan, EffectiveCost includes the amortized portion of the upfront fee.

3. The SQL Transformation

Here is a pseudo-code SQL snippet to normalize AWS data into FOCUS format:

SELECT
lineItem_ResourceId as ResourceId,
lineItem_UsageStartDate as ChargePeriodStart,
-- Handle the Cost Logic
CASE
WHEN lineItem_LineItemType = 'SavingsPlanCoveredUsage'
THEN savingsPlan_SavingsPlanEffectiveCost
ELSE lineItem_UnblendedCost
END as EffectiveCost
FROM aws_cur_table