SAP-C03 Cost Allocation and Visibility: Tagging Enforcement, CUR 2.0, Cost Categories, Split Costs, Bedrock Chargeback, Budgets and Anomaly Detection
Cost allocation and visibility on AWS means attributing every dollar of a multi-account bill to the business unit, team, project or application that caused it, and telling owners about it before it becomes a problem. For SAP-C03 that covers tagging strategy and cost allocation tag activation, policy-based tag enforcement (tag policies, SCPs and AWS Config rules), detailed billing data (Cost Explorer, CUR 2.0 and FOCUS exports from AWS Data Exports), chargeback and showback (cost categories, split charges, split cost allocation data for containers, Amazon Bedrock token chargeback and custom billing views), and cost monitoring with AWS Budgets and AWS Cost Anomaly Detection. This lesson explains what each tool covers, where it must be configured and what it cannot do, because most scenarios turn on those limits.
On this page10 sections
- How do you design a tagging strategy for cost allocation?
- Why do Organizations account tags matter for chargeback?
- Tag policies vs SCPs vs AWS Config: how do you enforce cost allocation tags?
- Cost Explorer vs CUR 2.0 vs FOCUS: which billing data answers which question?
- How do cost categories map costs to your business structure?
- How do split charges allocate shared costs?
- Split cost allocation data: chargeback for shared ECS and EKS clusters
- Charging back Amazon Bedrock token spend
- Showback vs chargeback, and sharing cost data with billing views
- AWS Budgets vs Cost Anomaly Detection: alerting on spend
- Design a cost allocation tagging strategy that combines resource tags, Organizations account tags and AWS-generated tags, and activate and backfill cost allocation tags correctly.
- Layer tag policies, SCPs and AWS Config required-tags rules to standardize, require and detect cost allocation tags across an organization.
- Choose between Cost Explorer, CUR 2.0 and FOCUS exports from AWS Data Exports for a given cost analysis question, including resource-level and filtered exports.
- Build chargeback and showback with cost categories, split charge rules, split cost allocation data for ECS and EKS, and custom billing views.
- Allocate Amazon Bedrock token spend by application inference profile or by IAM principal, and get near-real-time token visibility from invocation logs.
- Configure AWS Budgets thresholds and actions and AWS Cost Anomaly Detection monitors and alerts to match an alerting requirement.
How do you design a tagging strategy for cost allocation?
You design a tagging strategy for cost allocation by choosing a small set of mandatory tag keys that answer "who pays for this?" (for example CostCenter, BusinessUnit, Project, Environment, Application), fixing one spelling, case and list of allowed values for each, and then activating those keys as cost allocation tags in the organization's management (payer) account. A tag that exists on resources but has not been activated does not appear in AWS Cost Explorer, AWS Budgets filters or the Cost and Usage Report.
Activation rules
- Who activates: only the management account of an organization (or a standalone account) can activate cost allocation tags. Member accounts have no access to the cost allocation tags page, and one activation applies to every member account.
- Timing: a new tag key can take up to 24 hours to appear on the cost allocation tags page, and activation can take up to another 24 hours to take effect.
- Not retroactive by itself: activation labels cost data from the time it is activated. To label earlier months, the management account requests a backfill, which applies the current activation status to up to 12 previous months. A backfill only helps if the resources actually carried the tag during those months; it never invents tags.
- Tag keys are case-sensitive:
CostCenter,costcenterandCost-Centerare three different keys and three different columns in reports. Standardization (next sections) prevents this rather than cleaning it up.
User-defined, AWS-generated and account tags
| Tag type | Where it comes from | What it covers |
|---|---|---|
| User-defined resource tags | Your teams, pipelines and IaC | Charges of the tagged resources only |
AWS-generated aws:createdBy | Set by AWS from the creating identity, after the management account activates it | Only a listed set of supported resource types, and only resources created after activation; visible only in Billing and Cost Management, not in Tag Editor |
| Organizations account tags | Tags on the AWS account itself in AWS Organizations | All metered usage in the account once activated, including credits, refunds and service charges that cannot be tagged at resource level |
A practical strategy combines them: if accounts already map one-to-one to owners, account tags carry ownership; resource tags then split costs inside shared accounts (by application, project or environment). aws:createdBy answers "who launched this?", not "which business unit pays?", and because it is forward-only and limited to certain resource types it should be activated early and never relied on as the only allocation key.
Cost Explorer vs CUR 2.0 vs FOCUS: which billing data answers which question?
AWS Cost Explorer answers interactive, aggregated questions (trend, group by account, service, tag or cost category, forecast), while the Cost and Usage Report 2.0 (CUR 2.0) answers line-item questions (which resource, which hour, which tag, which discount) over the full history you keep. Both are fed by the same billing data; they differ in granularity, retention and who can use them.
| Tool | Granularity | History | Typical use |
|---|---|---|---|
| Cost Explorer | Monthly or daily aggregates (hourly granularity is an opt-in, paid setting in Cost Management preferences); resource-level daily data only for services enabled there | Up to 13 months by default (multi-year monthly data can be enabled); resource-level daily data covers only the last 14 days | Exploring trends, filters, forecasts, saved reports |
| CUR 2.0 (AWS Data Exports) | Line items, hourly/daily/monthly, with resource IDs, tag and cost category columns | As long as you keep the files in Amazon S3 | Chargeback pipelines, Athena SQL, BI dashboards, resource-level history |
| FOCUS export (AWS Data Exports) | Line items in the FinOps Open Cost and Usage Specification schema (FOCUS 1.2 with AWS columns, FOCUS 1.0) | As long as you keep the files | Multi-cloud FinOps tools that expect one schema across providers |
Cost Explorer limits that drive answers
- "No resource ID" when grouping by resource means resource-level daily data is not enabled for that service. It is enabled per service in Cost Management preferences in the management account, can take up to 48 hours to appear, and covers the last 14 days only.
- Multi-year data is monthly only, so it lengthens history without adding resource detail.
- A member account's own Cost Explorer shows only that account; organization-wide views come from the management account or a shared billing view (see showback below).
- For anything older than 14 days at resource level (for example tracing which resource drove last quarter's increase), query CUR 2.0 with resource IDs in Amazon Athena, grouping by
line_item_resource_id.
AWS Data Exports
AWS Data Exports is how you create CUR 2.0 today. Each standard export picks a table (CUR 2.0, FOCUS, cost optimization recommendations, carbon emissions), writes recurring files (Parquet or CSV) to an S3 bucket and can be queried in place with Amazon Athena. The export definition is a basic SQL statement, so it can select only the columns you need (for example omitting columns a downstream consumer should not receive) and filter rows (for example to one business unit's accounts). Filtering in the export avoids building a Glue job to strip data afterwards; an S3 bucket policy cannot do this because it controls access to whole objects, not columns or rows. The legacy Cost and Usage Report still exists but uses the older AWS-specific schema; it is neither CUR 2.0 nor FOCUS.
How do cost categories map costs to your business structure?
Cost categories map costs to business values (business unit, team, product, environment) using rules over dimensions such as linked account, cost allocation tag, service, charge type and other cost categories. Each cost category becomes a dimension you can filter and group by in Cost Explorer, AWS Budgets, CUR 2.0 and Cost Anomaly Detection, so a business mapping defined once is reused everywhere. A cost category is a billing construct; operational groupings of resources do not by themselves create a billing dimension.
Rule mechanics
- Regular rules map listed values (account IDs, tag values, services) to a fixed cost category value.
- Inherited value rules create values dynamically from a cost allocation tag key or from the account dimension. On a tag key, every tag value becomes a cost category value, including values created later. On the account dimension, values come from account names, not from account tags.
- Rule order matters: rules are evaluated top to bottom and the first match wins. Put specific overrides (for example "everything in the shared platform account is Shared") above general rules (inherit from the team tag), or tagged resources in the override account will be captured by the general rule.
- Default value: costs that match no rule get the default value (for example
Unallocated), which makes allocation gaps visible instead of silent. - Effective date: rules can be applied from an earlier month, so a corrected mapping restates past months. Changes can take up to 24 hours to process.
- Cost categories are created and managed in the management account.
Cost categories relabel costs in reports. They do not fix the tags on resources: merging prod, Prod and PRD into one value hides the problem for reporting but neither blocks new variants nor reports which resources carry them. That is the tag policy's job.
Charging back Amazon Bedrock token spend
Amazon Bedrock spend is charged back by giving each team's or application's model calls a taggable identity that billing data can group by. There are two native mechanisms, and which one fits depends on whether the callers can change the model identifier they send:
| Mechanism | How it works | Code change? | Where you see cost |
|---|---|---|---|
| Application inference profiles | Create a profile per team or application (from a foundation model or a cross-Region inference profile), tag it, activate the tag for cost allocation; callers invoke the profile ARN instead of the model ID | Yes: callers must use the profile ARN | Cost Explorer, Budgets, CUR, grouped by the profile's tags |
| IAM principal cost allocation | Tag the calling IAM roles or users (for example with a cost center), activate those principal tags for cost allocation and enable "Include caller identity (IAM principal) allocation data" in a CUR 2.0 export | No: callers keep calling the model ID | CUR 2.0, with the line_item_iam_principal column and iamPrincipal/ tag columns |
Usage types alone cannot separate teams that call the same model, because every team generates the same input-token and output-token usage types. Likewise, the Bedrock runtime metrics in Amazon CloudWatch (InputTokenCount, OutputTokenCount) are dimensioned by model ID, not by caller.
Near-real-time token visibility
Billing data arrives with billing latency, which is fine for monthly chargeback but too slow to catch a runaway prompt during the day. For per-application token usage within minutes, enable Bedrock model invocation logging (disabled by default, configured per account and Region, delivered to CloudWatch Logs and/or Amazon S3). Each log record carries the caller's identity.arn, the modelId and the input and output token counts, so a CloudWatch Logs Insights query that sums tokens grouped by identity.arn shows usage per IAM role with no application change. Joining logs with prices yourself to build a bill is possible but is a custom pipeline to maintain; use the native allocation mechanisms for money and logs for operational visibility.
Showback vs chargeback, and sharing cost data with billing views
Showback reports each owner's costs to them for visibility; chargeback actually bills those costs to the owner's budget or cost center. Both rest on the same allocation (account tags, resource tags, cost categories, split charges, split cost allocation data); chargeback adds an agreed allocation of shared costs and usually a CUR-based pipeline that finance trusts.
The common showback problem is access: owners of many accounts want one view of their costs, but security does not allow them into the management account, and each member account's Cost Explorer shows only itself. Custom billing views solve this. A billing view is a shareable resource representing a filtered slice of cost management data, filtered by accounts or by cost allocation tags, and it can combine data from multiple organizations (for example where a group runs more than one organization). Shared with another account, the view is used directly in Cost Explorer and AWS Budgets there, with no sign-in to any management account.
| Option | Gives owners interactive Cost Explorer and Budgets? | Needs management account access? |
|---|---|---|
| Custom billing view shared to the owner's account | Yes, over all accounts in the view | No |
| IAM role in the management account | Yes | Yes (assuming the role is signing in to it) |
| Member account's own Cost Explorer | Yes, but one account at a time | No |
| Scheduled report by email or CUR + dashboard | No (static summary or a custom build) | No |
AWS Budgets vs Cost Anomaly Detection: alerting on spend
AWS Budgets alerts when spend or usage crosses an amount you set; AWS Cost Anomaly Detection alerts when spend departs from the pattern it has learned for that account, service, tag or cost category. Use Budgets for known allowances and targets, and Cost Anomaly Detection for "something unusual is happening" without maintaining a fixed limit per owner.
AWS Budgets
- Budget types: cost, usage, and Savings Plans or Reserved Instance utilization (how much of the commitment is being used) and coverage (how much eligible usage the commitment covers). Utilization falling below a target is a utilization budget, not a coverage budget.
- Filters: linked account, cost allocation tag, account tag, cost category value, service and more, so one budget can follow a project, team or business unit.
- Thresholds: actual (fires once spend has crossed the threshold) or forecasted (fires when spend is on course to cross it before the period ends, which is how you warn before overspending).
- Notifications: email addresses and an Amazon SNS topic (and chat channels through SNS).
- Budget actions: automatically or after approval, apply an IAM policy, apply an SCP, or stop specific EC2 or RDS instances. Only the SCP action reaches another account, and only from a budget in the management account. EC2 and RDS targets must be in the budget's own account, and stopping instances acts on those existing instances only.
A CloudWatch billing alarm on EstimatedCharges needs a static threshold and has no tag dimension, so it cannot follow a single project or learn normal spend.
AWS Cost Anomaly Detection
| Monitor | Covers | Threshold | Where it can be created |
|---|---|---|---|
| AWS managed monitor (AWS services, linked account, cost allocation tag or cost category dimension) | Every value of the dimension evaluated independently, including values that appear later | One threshold per alert subscription for all values | AWS services monitor: any account, including member accounts. Linked account, cost allocation tag and cost category monitors: management account only |
| Customer managed monitor | Specific values you choose (a small list) | Its own subscription, so a different threshold | Management account for linked account, tag and cost category values; a member account can only monitor its own spend (services monitors and monitors scoped to itself) |
- Use an AWS managed monitor for breadth with one threshold, and add customer managed monitors only for exceptions that need a different threshold. A monitor per value has to be edited every time a team appears.
- Alert subscriptions: individual alerts are sent as soon as an anomaly is detected and require an SNS topic (relay to Slack or Microsoft Teams with Amazon Q Developer in chat applications); daily or weekly summaries go by email and arrive after the period.
- Thresholds are on the anomaly's cost impact (absolute dollars or percentage), not on total spend against an allowance.
- Root cause analysis names the service, account, Region and usage type. It does not name individual resources; find the resource in CUR with resource IDs (or in Cost Explorer if it is within the 14-day resource-level window).
Tip. SAP-C03 tests cost allocation and visibility with multi-account scenarios in which several AWS cost tools could plausibly help and only one meets every stated constraint, such as operational overhead, access boundaries, prevention versus detection, or alert timing. Expect questions that hinge on where something is configured (management account versus member account), where data appears (Cost Explorer, CUR 2.0, the cost category details page) and what a tool does not cover (untagged resources in tag policies, untaggable charges in resource tags, history beyond 14 days in Cost Explorer). Many good designs layer more than one control, so know each tool's role well enough to see where it stops.
- Tags reach billing tools only after the management account activates them as cost allocation tags; activation is not retroactive, but a backfill can restate up to 12 months for resources that carried the tag.
- Activated Organizations account tags label all metered usage in the account, including credits, refunds and charges that cannot be tagged at resource level, and need no second account-to-owner mapping.
- SCP with Null aws:RequestTag makes a key mandatory at creation; a tag policy with enforced_for makes its value valid; AWS Config required-tags finds existing resources that lack the key.
- Tag policy compliance never evaluates resources without the key, and report_required_tag_for is enforced only through IaC integrations.
- Cost Explorer resource-level daily data covers only the last 14 days and is enabled per service from the management account; older or finer questions are answered from CUR 2.0 in Athena.
- AWS Data Exports delivers CUR 2.0 and FOCUS tables to S3, and its SQL query can drop columns and filter rows before files leave AWS.
- Cost category rules are first-match in order, inherited value rules follow new tag values automatically, and split charge results appear only on the cost category details page, never in CUR or Cost Explorer.
- Split cost allocation data for ECS and EKS is opted in by the payer and delivered only in CUR; the EKS Prometheus option charges the higher of requests and actual use.
- Bedrock chargeback uses tagged application inference profiles when callers can change the model ID, or IAM principal tags plus caller identity data in CUR 2.0 when they cannot.
- Budgets watch fixed amounts (forecasted thresholds warn early; only SCP actions reach other accounts, from the management account); Cost Anomaly Detection watches patterns, with individual alerts over SNS for immediacy.
Frequently asked questions
Why does a tag on my AWS resources not appear in Cost Explorer?
A resource tag appears in AWS Cost Explorer, AWS Budgets and the Cost and Usage Report only after it is activated as a cost allocation tag in the Billing and Cost Management console of the management (payer) account or a standalone account. Member accounts in an organization cannot activate tags. A new key can take up to 24 hours to appear for activation and up to another 24 hours to take effect, and activation labels data only from then on unless the management account requests a backfill of up to 12 months.
What is the difference between an AWS tag policy and an SCP for tagging?
An AWS Organizations tag policy defines the compliant tag key, its case and its allowed values, reports noncompliant tags across the organization and, with enforced_for, blocks tagging operations that would set a noncompliant value. It does not evaluate resources that have no key at all. An SCP that denies create actions when aws:RequestTag/key is null makes a key mandatory at creation from every interface, but defines no standard and reports nothing. Using both makes a tag mandatory and valid.
How do I find existing AWS resources that are missing a cost allocation tag?
Use the AWS Config required-tags managed rule, which continuously flags supported resources that lack the required tag keys (or whose values are outside a list). Deploy it to every member account with an organization conformance pack in each Region where workloads run, and attach automatic Systems Manager Automation remediation if missing tags should be added with a default value. Tag policy compliance reports cannot do this because they skip resources without the key.
Do cost category split charges appear in the Cost and Usage Report?
No. Split charge rules (proportional, fixed or even) are applied only on the cost category details page and its downloadable CSV. They do not change CUR, CUR 2.0, FOCUS exports or AWS Cost Explorer. A chargeback pipeline that reads CUR must apply the same allocation of the shared cost value in its own queries if its totals have to match the details page.
How can I charge back a shared Amazon EKS or ECS cluster to teams?
Opt in to split cost allocation data for Amazon ECS or Amazon EKS in Cost Management preferences in the management account and include it in a CUR or CUR 2.0 export. It divides each shared EC2 instance's cost between the tasks or pods running on it, with labels such as aws:eks:namespace to group by. For EKS, the Amazon Managed Service for Prometheus option charges the higher of each pod's requests and its measured use. The data is not available in Cost Explorer.
How do I allocate Amazon Bedrock costs to teams that share one AWS account?
If the applications can change the model identifier they call, create a tagged application inference profile for each team, activate the tag for cost allocation and have each team invoke its profile ARN; Cost Explorer then groups Bedrock cost by the tag. If the code cannot change, tag each calling IAM role, activate the IAM principal tags and enable caller identity (IAM principal) allocation data in a CUR 2.0 export, which adds the calling principal and its tags to every Bedrock line item.
When should I use AWS Budgets instead of AWS Cost Anomaly Detection?
Use AWS Budgets when there is a known amount to watch: a monthly allowance, a usage limit or a Savings Plans utilization or coverage target, with actual or forecasted thresholds and optional actions that apply IAM policies or SCPs or stop EC2 and RDS instances. Use AWS Cost Anomaly Detection when there is no fixed amount and you want to know when spend departs from its learned normal pattern for an account, service, tag value or cost category value.
How can business unit owners see their AWS costs without access to the management account?
Create a custom billing view in Billing and Cost Management filtered to the owner's accounts or cost allocation tag values and share it with the owner's account. The owner then uses that view in AWS Cost Explorer and AWS Budgets from their own account, covering all accounts in the view. Billing views can also combine data from more than one organization, without anyone signing in to a management account.
Source
This lesson covers the "Cost-Optimized Architecture Design" domain of the official SAP-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Solutions Architect – Professional (SAP-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.