This steering file provides comprehensive guidance for analyzing and attributing expenditure aligned with the AWS Well-Architected Cost Optimization Pillar's fifth design principle: Analyze and Attribute Expenditure.
Understand cost drivers and allocate costs accurately to enable informed decision-making, accountability, and optimization at the appropriate organizational level.
Goal: Implement a comprehensive tagging strategy for accurate cost attribution
1. Assess Current Tagging Coverage
Use get_tag_values to analyze:
- Existing tag coverage across resources
- Tag consistency and standardization
- Missing or incomplete tags
- Tag value standardization needs
2. Design Hierarchical Tagging Structure
Use session_sql to plan:
- Organizational hierarchy mapping
- Project and application taxonomy
- Cost center and business unit structure
- Environment and lifecycle tags
3. Implement Tag-Based Cost Allocation
Use getCostAndUsage to enable:
- Multi-dimensional cost grouping
- Hierarchical cost rollups
- Cross-functional cost analysis
- Time-series cost attribution
// Step 1: Analyze current tagging coverage
const taggingCoverage = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getTagValues",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"tag_key": "CostCenter"
})
// Step 2: Assess tag consistency across multiple dimensions
const tagConsistencyAnalysis = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
WITH tag_coverage AS (
SELECT
service,
COUNT(*) as total_resources,
COUNT(CASE WHEN cost_center IS NOT NULL THEN 1 END) as cost_center_tagged,
COUNT(CASE WHEN project IS NOT NULL THEN 1 END) as project_tagged,
COUNT(CASE WHEN environment IS NOT NULL THEN 1 END) as environment_tagged,
COUNT(CASE WHEN owner IS NOT NULL THEN 1 END) as owner_tagged
FROM resource_tags
GROUP BY service
)
SELECT
service,
total_resources,
(cost_center_tagged * 100.0 / total_resources) as cost_center_coverage,
(project_tagged * 100.0 / total_resources) as project_coverage,
(environment_tagged * 100.0 / total_resources) as environment_coverage,
(owner_tagged * 100.0 / total_resources) as owner_coverage,
((cost_center_tagged + project_tagged + environment_tagged + owner_tagged) * 100.0 / (total_resources * 4)) as overall_coverage
FROM tag_coverage
ORDER BY overall_coverage ASC
`
})
// Step 3: Implement hierarchical cost allocation
const hierarchicalAllocation = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"BusinessUnit\"}, {\"Type\": \"TAG\", \"Key\": \"CostCenter\"}, {\"Type\": \"TAG\", \"Key\": \"Project\"}]",
"metrics": "[\"UnblendedCost\"]"
})
// Step 4: Identify untagged resources and costs
const untaggedResources = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"}]",
"filter": "{\"Not\": {\"Tags\": {\"Key\": \"CostCenter\", \"MatchOptions\": [\"EQUALS\"]}}}",
"metrics": "[\"UnblendedCost\"]"
})
Goal: Implement comprehensive chargeback and showback mechanisms for cost accountability
1. Design Cost Allocation Methodology
Use session_sql to implement:
- Direct cost allocation rules
- Shared cost distribution algorithms
- Proportional allocation methods
- Business logic for cost attribution
2. Implement Automated Chargeback Calculations
Use getCostAndUsage with complex filtering:
- Department-level cost aggregation
- Project-based cost allocation
- Service-level cost distribution
- Time-based cost attribution
3. Generate Chargeback Reports
Use generate_cost_report to create:
- Executive chargeback summaries
- Department cost statements
- Project cost allocations
- Trend analysis and variance reports
// Step 1: Implement shared cost allocation algorithm
const sharedCostAllocation = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
WITH shared_services AS (
SELECT
SUM(cost) as total_shared_cost
FROM costs
WHERE service IN ('AWS Support', 'AWS CloudTrail', 'AWS Config', 'AWS CloudWatch')
AND month = '2024-11'
),
department_usage AS (
SELECT
department,
SUM(cost) as direct_cost
FROM costs
WHERE service NOT IN ('AWS Support', 'AWS CloudTrail', 'AWS Config', 'AWS CloudWatch')
AND month = '2024-11'
AND department IS NOT NULL
GROUP BY department
),
total_usage AS (
SELECT SUM(direct_cost) as total_direct_cost
FROM department_usage
)
SELECT
d.department,
d.direct_cost,
(d.direct_cost / t.total_direct_cost) as usage_percentage,
(d.direct_cost / t.total_direct_cost) * s.total_shared_cost as allocated_shared_cost,
d.direct_cost + ((d.direct_cost / t.total_direct_cost) * s.total_shared_cost) as total_allocated_cost
FROM department_usage d
CROSS JOIN shared_services s
CROSS JOIN total_usage t
ORDER BY total_allocated_cost DESC
`
})
// Step 2: Generate project-level chargeback
const projectChargeback = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"Project\"}, {\"Type\": \"TAG\", \"Key\": \"Environment\"}, {\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"}]",
"metrics": "[\"UnblendedCost\"]"
})
// Step 3: Calculate cost center allocations with variance analysis
const costCenterVariance = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_comparison", {
"operation": "getCostAndUsageComparisons",
"baseline_start_date": "2024-10-01",
"baseline_end_date": "2024-11-01",
"comparison_start_date": "2024-11-01",
"comparison_end_date": "2024-12-01",
"metric_for_comparison": "UnblendedCost",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"CostCenter\"}]"
})
// Step 4: Generate comprehensive chargeback report
const chargebackReport = usePower("aws-cost-optimization", "aws-pricing", "generate_cost_report", {
"pricing_data": {
"shared_allocation": sharedCostAllocation,
"project_costs": projectChargeback,
"variance_analysis": costCenterVariance
},
"service_name": "Monthly Chargeback Report",
"assumptions": [
"Shared services allocated based on direct usage percentage",
"All costs allocated to tagged resources only",
"Untagged resources allocated to 'Unallocated' cost center",
"Cross-charges applied for shared infrastructure"
],
"exclusions": [
"Credits and refunds not allocated",
"Tax and support fees allocated separately",
"Reserved Instance benefits distributed proportionally"
],
"recommendations": {
"immediate": [
"Improve tagging compliance to 95%+ coverage",
"Implement automated tagging for new resources",
"Establish monthly chargeback review process"
],
"strategic": [
"Implement cost center budget controls",
"Develop cost optimization incentives",
"Create cost awareness training program"
]
}
})
Goal: Identify and analyze the root causes of cost changes and trends
1. Analyze Cost Change Drivers
Use get_cost_comparison_drivers to identify:
- Top cost change contributors
- Service-level cost drivers
- Usage pattern changes
- Pricing impact analysis
2. Correlate Costs with Business Activities
Use session_sql to analyze:
- Cost correlation with business metrics
- Seasonal cost patterns
- Project lifecycle cost impacts
- Business event cost attribution
3. Implement Predictive Cost Attribution
Use get_cost_forecast with attribution:
- Forecast costs by cost center
- Predict project cost trajectories
- Model business growth cost impact
- Plan capacity and cost allocation
// Step 1: Identify top cost change drivers
const costChangeDrivers = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_comparison", {
"operation": "getCostComparisonDrivers",
"baseline_start_date": "2024-10-01",
"baseline_end_date": "2024-11-01",
"comparison_start_date": "2024-11-01",
"comparison_end_date": "2024-12-01",
"metric_for_comparison": "UnblendedCost",
"group_by": "[{\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"}]"
})
// Step 2: Analyze cost drivers by business dimension
const businessCostDrivers = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
WITH cost_changes AS (
SELECT
project,
service,
current_month_cost,
previous_month_cost,
(current_month_cost - previous_month_cost) as cost_change,
((current_month_cost - previous_month_cost) / previous_month_cost * 100) as cost_change_percent
FROM monthly_cost_comparison
WHERE current_month = '2024-11' AND previous_month = '2024-10'
),
business_events AS (
SELECT
project,
event_type,
event_date,
expected_cost_impact
FROM business_events
WHERE event_date BETWEEN '2024-10-01' AND '2024-11-30'
)
SELECT
c.project,
c.service,
c.cost_change,
c.cost_change_percent,
b.event_type,
b.expected_cost_impact,
CASE
WHEN ABS(c.cost_change - b.expected_cost_impact) < (b.expected_cost_impact * 0.1) THEN 'Expected'
WHEN c.cost_change > (b.expected_cost_impact * 1.1) THEN 'Higher than Expected'
WHEN c.cost_change < (b.expected_cost_impact * 0.9) THEN 'Lower than Expected'
ELSE 'No Business Event'
END as variance_category
FROM cost_changes c
LEFT JOIN business_events b ON c.project = b.project
ORDER BY ABS(c.cost_change) DESC
`
})
// Step 3: Correlate costs with business metrics
const businessCorrelation = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
SELECT
month,
total_cost,
active_users,
transactions,
revenue,
total_cost / active_users as cost_per_user,
total_cost / transactions as cost_per_transaction,
revenue / total_cost as revenue_efficiency,
LAG(total_cost / active_users) OVER (ORDER BY month) as prev_cost_per_user,
((total_cost / active_users) - LAG(total_cost / active_users) OVER (ORDER BY month)) / LAG(total_cost / active_users) OVER (ORDER BY month) * 100 as cost_per_user_change
FROM business_cost_correlation
WHERE month >= '2024-06-01'
ORDER BY month
`
})
// Step 4: Forecast attributed costs
const attributedForecast = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostForecast",
"start_date": "2024-12-01",
"end_date": "2025-03-01",
"granularity": "MONTHLY",
"metric": "UNBLENDED_COST",
"filter": "{\"Tags\": {\"Key\": \"CostCenter\", \"Values\": [\"Engineering\", \"Marketing\", \"Sales\"], \"MatchOptions\": [\"EQUALS\"]}}"
})
Goal: Implement advanced analytics for sophisticated cost attribution and optimization
1. Implement Activity-Based Costing
Use session_sql to implement:
- Activity cost driver identification
- Resource consumption modeling
- Service cost allocation algorithms
- Business process cost attribution
2. Develop Cost Attribution Models
Use getCostAndUsage with complex analytics:
- Multi-dimensional cost modeling
- Predictive cost attribution
- Scenario-based cost planning
- Optimization impact modeling
3. Create Advanced Attribution Reports
Use generate_cost_report for:
- Executive cost attribution dashboards
- Detailed cost driver analysis
- Optimization opportunity identification
- ROI and business value correlation
// Step 1: Implement activity-based costing model
const activityBasedCosting = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
WITH activity_drivers AS (
SELECT
activity_name,
resource_type,
driver_metric,
cost_per_unit
FROM activity_cost_drivers
),
resource_consumption AS (
SELECT
project,
resource_type,
SUM(usage_quantity) as total_usage,
SUM(cost) as direct_cost
FROM resource_usage
WHERE month = '2024-11'
GROUP BY project, resource_type
),
activity_allocation AS (
SELECT
rc.project,
ad.activity_name,
rc.total_usage,
rc.direct_cost,
(rc.total_usage * ad.cost_per_unit) as allocated_activity_cost
FROM resource_consumption rc
JOIN activity_drivers ad ON rc.resource_type = ad.resource_type
)
SELECT
project,
activity_name,
SUM(total_usage) as total_usage,
SUM(direct_cost) as direct_cost,
SUM(allocated_activity_cost) as activity_cost,
SUM(direct_cost + allocated_activity_cost) as total_attributed_cost
FROM activity_allocation
GROUP BY project, activity_name
ORDER BY total_attributed_cost DESC
`
})
// Step 2: Develop predictive cost attribution model
const predictiveAttribution = usePower("aws-cost-optimization", "aws-billing-cost-management", "session_sql", {
"query": `
WITH historical_patterns AS (
SELECT
cost_center,
month,
total_cost,
business_metric_value,
LAG(total_cost, 1) OVER (PARTITION BY cost_center ORDER BY month) as prev_month_cost,
LAG(business_metric_value, 1) OVER (PARTITION BY cost_center ORDER BY month) as prev_month_metric
FROM cost_attribution_history
WHERE month >= '2024-06-01'
),
growth_rates AS (
SELECT
cost_center,
month,
total_cost,
business_metric_value,
CASE
WHEN prev_month_cost > 0 THEN (total_cost - prev_month_cost) / prev_month_cost
ELSE 0
END as cost_growth_rate,
CASE
WHEN prev_month_metric > 0 THEN (business_metric_value - prev_month_metric) / prev_month_metric
ELSE 0
END as metric_growth_rate
FROM historical_patterns
WHERE prev_month_cost IS NOT NULL
)
SELECT
cost_center,
AVG(cost_growth_rate) as avg_cost_growth,
AVG(metric_growth_rate) as avg_metric_growth,
CORR(cost_growth_rate, metric_growth_rate) as growth_correlation,
STDDEV(cost_growth_rate) as cost_volatility,
MAX(total_cost) * (1 + AVG(cost_growth_rate)) as predicted_next_month_cost
FROM growth_rates
GROUP BY cost_center
ORDER BY predicted_next_month_cost DESC
`
})
// Step 3: Create multi-dimensional attribution analysis
const multiDimensionalAttribution = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"BusinessUnit\"}, {\"Type\": \"TAG\", \"Key\": \"Project\"}, {\"Type\": \"TAG\", \"Key\": \"Environment\"}, {\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"}]",
"metrics": "[\"UnblendedCost\"]"
})
// Step 4: Generate advanced attribution report
const advancedAttributionReport = usePower("aws-cost-optimization", "aws-pricing", "generate_cost_report", {
"pricing_data": {
"activity_based_costing": activityBasedCosting,
"predictive_attribution": predictiveAttribution,
"multi_dimensional": multiDimensionalAttribution
},
"service_name": "Advanced Cost Attribution Analysis",
"assumptions": [
"Activity-based costing model reflects actual resource consumption patterns",
"Historical patterns are predictive of future cost behavior",
"Business metrics correlate with infrastructure usage",
"Multi-dimensional attribution provides complete cost visibility"
],
"exclusions": [
"One-time migration and setup costs",
"Extraordinary business events and their cost impacts",
"External factors affecting pricing (AWS price changes)"
],
"recommendations": {
"immediate": [
"Implement automated cost attribution reporting",
"Establish cost center accountability processes",
"Create cost optimization targets by attribution dimension"
],
"strategic": [
"Develop predictive cost management capabilities",
"Implement cost-aware resource provisioning",
"Create business value-driven cost optimization"
]
}
})
// Example organizational cost attribution
const organizationalAttribution = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"Division\"}, {\"Type\": \"TAG\", \"Key\": \"BusinessUnit\"}, {\"Type\": \"TAG\", \"Key\": \"Department\"}, {\"Type\": \"TAG\", \"Key\": \"Team\"}]",
"metrics": "[\"UnblendedCost\"]"
})
// Example project-based cost attribution
const projectAttribution = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"granularity": "MONTHLY",
"group_by": "[{\"Type\": \"TAG\", \"Key\": \"Portfolio\"}, {\"Type\": \"TAG\", \"Key\": \"Program\"}, {\"Type\": \"TAG\", \"Key\": \"Project\"}, {\"Type\": \"TAG\", \"Key\": \"Application\"}]",
"metrics": "[\"UnblendedCost\"]"
})
// Example technical cost attribution
const technicalAttribution = usePower("aws-cost-optimization", "aws-billing-cost-management", "cost_explorer", {
"operation": "getCostAndUsage",
"start_date": "2024-11-01",
"end_date": "2024-12-01",
"end_date": "2024-12-01"
},
"granularity": "MONTHLY",
"group_by": ["TAG:Environment", "TAG:Service", "TAG:Component", "TAG:Resource"],
"metric": "UnblendedCost"
})
Solution:
Solution:
Solution:
Solution: