SaveMyCert
Log in
5 of 5 free questions left today·for 10 a day
Cost-Optimized Architecture Design

SAP-C03 Cost Allocation and Visibility: Tagging Enforcement, CUR 2.0, Cost Categories, Split Costs, Bedrock Chargeback, Budgets and Anomaly Detection

24 min readSAP-C03 · Cost-Optimized Architecture DesignUpdated

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.

What you’ll learn
  • 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, costcenter and Cost-Center are 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 typeWhere it comes fromWhat it covers
User-defined resource tagsYour teams, pipelines and IaCCharges of the tagged resources only
AWS-generated aws:createdBySet by AWS from the creating identity, after the management account activates itOnly 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 tagsTags on the AWS account itself in AWS OrganizationsAll 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.

Why do Organizations account tags matter for chargeback?

Organizations account tags matter because they are the only tag that reaches charges which have no taggable resource. When you tag accounts in AWS Organizations (for example BusinessUnit applied by the account vending pipeline) and activate that key as a cost allocation tag, every line item of the account carries the value: all metered usage in the account, including credits, refunds and service charges that have no taggable resource. Resource-tag reports show those charges under "No tag key".

  • Account tags can be used as filters and dimensions in Cost Explorer, CUR 2.0, AWS Budgets, cost categories and Cost Anomaly Detection.
  • Because the pipeline already maintains them, they avoid a second account-to-owner mapping that someone must keep in sync.
  • A budget filtered on an account tag value picks up new accounts automatically when the pipeline tags them, whereas a budget filtered on a list of linked accounts must be edited each time an account is added.

Account tags cannot split a shared account between owners. For that you need resource tags, split charges or split cost allocation data, covered below.

Tag policies vs SCPs vs AWS Config: how do you enforce cost allocation tags?

You enforce cost allocation tags with three layered controls, each of which does one job: an SCP makes a tag key mandatory when a resource is created, an Organizations tag policy defines and (optionally) enforces the key's exact spelling and allowed values and reports noncompliance, and an AWS Config required-tags rule finds existing resources that are missing the key and can remediate them. None of them alone covers all three needs.

ControlTypeWhat it doesWhat it does not do
Tag policy (AWS Organizations)Standard + optional preventive + reportingDefines the compliant key (including case) and allowed values; enforced_for blocks noncompliant tagging operations on listed resource types (or ALL_SUPPORTED for a service); produces an organization-wide compliance reportDoes not evaluate resources that lack the key, so it cannot find untagged resources or by itself force a key to be present
SCP with aws:RequestTagPreventiveDenies create actions when the request does not carry the key, from every interface (console, CLI, SDK, IaC)Defines no standard and reports nothing about existing resources
AWS Config required-tagsDetective (+ remediation)Continuously flags supported resources missing required keys (or with values outside a list); with automatic Systems Manager Automation remediation it can add a default tagActs after the resource exists, so it never prevents creation

Tag policy details that decide scenarios

  • Untagged resources are not evaluated by tag policy compliance. A compliance report that looks clean can coexist with large unallocated costs from resources that have no key at all.
  • enforced_for rejects tagging operations that would create a noncompliant value; it does not require the key to exist.
  • The report_required_tag_for setting marks a key as required, but that requirement is enforced only through infrastructure-as-code integrations (an AWS CloudFormation hook, Terraform, Pulumi). Creates from the console or CLI are not blocked by it.

The SCP condition

To require a key at creation, the SCP denies the create action (for example ec2:RunInstances on the instance resource) with "Null": {"aws:RequestTag/CostCenter": "true"}. The keys to tell apart:

  • aws:RequestTag/key is the tag sent in the request; it is the right key for creation. aws:ResourceTag/key refers to tags already on an existing resource, so a new resource has none at launch and a deny on it would block every launch.
  • Null true matches when the key is absent; false matches when it is present.
  • aws:TagKeys lists all keys in the request; a null check on it only catches requests with no tags at all.

The SCP checks presence; a tag policy with enforced_for then restricts the value to the approved list, so the two together make a tag both mandatory and valid. SCPs apply to every principal in the member accounts they are attached to (never the management account), which is what makes them an organization-wide guardrail rather than a per-role setting.

Cleaning up what already exists

Resources created before the controls existed are found with the Config required-tags rule (case-sensitive, so it also flags spelling variants), deployed to all member accounts with an organization conformance pack. Conformance packs and Config rules are Regional, so deploy them in every Region where workloads run. Add automatic remediation to tag with a default or looked-up value instead of asking owners by email.

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.

ToolGranularityHistoryTypical use
Cost ExplorerMonthly or daily aggregates (hourly granularity is an opt-in, paid setting in Cost Management preferences); resource-level daily data only for services enabled thereUp to 13 months by default (multi-year monthly data can be enabled); resource-level daily data covers only the last 14 daysExploring trends, filters, forecasts, saved reports
CUR 2.0 (AWS Data Exports)Line items, hourly/daily/monthly, with resource IDs, tag and cost category columnsAs long as you keep the files in Amazon S3Chargeback 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 filesMulti-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.

How do split charges allocate shared costs?

Split charge rules allocate the cost of one cost category value (the source, such as a SharedPlatform value for central logging and security tooling accounts) to other values of the same cost category (the targets, such as the business units that use it). There are three methods:

MethodHow the source is dividedFits when
ProportionalBy each target's share of total cost, recalculated every periodAllocation should follow each unit's spend with no percentages to maintain
FixedBy percentages you setOwners have agreed percentages in advance
EvenEqually across targetsEvery target should bear the same share regardless of size

The critical limitation: split charge results appear only on the cost category details page (and its downloadable CSV). They are not written into CUR, CUR 2.0, FOCUS exports or Cost Explorer, whatever method or effective date you choose. If a chargeback pipeline reads CUR in Athena and must match the details page, the pipeline has to apply the same allocation itself.

Tags on shared infrastructure label only the charges those resources generate; they cannot apportion a shared service's cost in line with each consumer's use. Split charges, or the equivalent allocation in your own reporting, do that.

Split cost allocation data: chargeback for shared ECS and EKS clusters

Split cost allocation data allocates the cost of shared Amazon EC2 instances to the Amazon ECS tasks or Amazon EKS pods running on them, so teams sharing one cluster can be charged for their own containers without splitting the cluster into per-team node groups. Tagging an instance with one team cannot work when many teams' tasks share it.

  • Opt in from Cost Management preferences in the management (payer) account, separately for ECS and for EKS.
  • Where it appears: only in CUR and CUR 2.0 (you include split cost allocation data in the export). It is not available in Cost Explorer, so per-task or per-pod grouping is done in Athena or a BI tool over CUR.
  • How costs are attributed: each instance's amortized cost is divided by the CPU and memory the containers reserve or use; capacity no container claims shows as unused instance cost. Task and pod labels such as aws:eks:namespace, cluster and deployment, plus ECS service and task tags, become columns you can group by.

EKS: requests only vs Prometheus

EKS optionCost basisConsequence
Resource requestsEach pod's CPU and memory requestsTeams that request little but use a lot pay for what they request
Amazon Managed Service for PrometheusThe higher of each pod's requests and its actual utilization measured by PrometheusUnder-requesting no longer lowers a team's charge; needs AWS Organizations with all features enabled

Accelerated (GPU) instance costs are split by resource requests. Allocation is a billing question, separate from rightsizing: making nodes smaller changes the cost to divide, not who it is charged to.

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:

MechanismHow it worksCode change?Where you see cost
Application inference profilesCreate 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 IDYes: callers must use the profile ARNCost Explorer, Budgets, CUR, grouped by the profile's tags
IAM principal cost allocationTag 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 exportNo: callers keep calling the model IDCUR 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.

OptionGives owners interactive Cost Explorer and Budgets?Needs management account access?
Custom billing view shared to the owner's accountYes, over all accounts in the viewNo
IAM role in the management accountYesYes (assuming the role is signing in to it)
Member account's own Cost ExplorerYes, but one account at a timeNo
Scheduled report by email or CUR + dashboardNo (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

MonitorCoversThresholdWhere 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 laterOne threshold per alert subscription for all valuesAWS services monitor: any account, including member accounts. Linked account, cost allocation tag and cost category monitors: management account only
Customer managed monitorSpecific values you choose (a small list)Its own subscription, so a different thresholdManagement 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.

Key takeaways
  • 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.

Test yourself on this topic
Practice now

Sign up free to mark lessons complete, bookmark topics and track your exam readiness.

Spotted a mistake in this lesson?