AWS Cost and Usage Analysis - Identify the Most Used Service
In this article, we'll review a JavaScript code extract that uses AWS SDK's CostExplorer
object to retrieve the cost and usage data of your AWS services. The goal is to identify the service which incurs the highest cost during a specific time period.
Code
const AWS = require('aws-sdk'); const costexplorer = new AWS.CostExplorer(); let params = { TimePeriod: { Start: '2023-10-01', End: '2023-11-01' }, Granularity: 'MONTHLY', Metrics: ['UnblendedCost'], GroupBy: [ { Type: 'DIMENSION', Key: 'SERVICE' } ] }; costexplorer.getCostAndUsage(params) .promise() .then(data => { let results = data.ResultsByTime.map(item => item.Groups.map(group => ({Service: group.Keys[0], Amount: group.Metrics.UnblendedCost.Amount}) ) .reduce((max, current) => (parseFloat(current.Amount) > parseFloat(max.Amount) ? current : max), {Service: '', Amount: '0'})) console.log(results); });
Detailed Code Explanation
The above code works in the following way:
- First, we initialize the
CostExplorer
object. - We set our parameters for
getCostAndUsage()
method. We're specifying a monthly report for the time period from Oct 1, 2023, to Nov 1, 2023. Note: Adjust these dates as per your requirement. - The metrics we're using is the
UnblendedCost
, which represents the cost of a service regardless of any discounts or credits. - We use the
GroupBy
parameter to group costs by AWS services. - We then call the getCostAndUsage method of Cost Explorer.
- When the Promise resolves, we transform the returned data into an array of highest spending services for each month of the specified range.
Expected Output Format
The program will print the result in the console in the following structure.
[ { "Service": "<Service-Name>", "Amount": "<Cost>" }, ... ]
Each object in the array corresponds to a month in the time range, providing a service name and the corresponding cost.
Considerations & Caveats
- The
getCostAndUsage
method can be throttled. To avoid hitting the rate limit, consider running the script with pauses or at different times. - Ensure you understand AWS's cost and billing structure, as this script only provides a cost breakdown for 'UnblendedCost'.
- Cost data may take 24-48 hours to be processed and appear in AWS Cost Explorer. As a result, this script might not show the most recent cost data.
- Make sure the time range doesn't exceed one year, AWS Cost Explorer doesn't allow a bigger time range.
Required IAM permissions and example policy
Your IAM policy should have permissions for ce:GetCostAndUsage
. Here's an example policy:
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "ce:GetCostAndUsage" ], "Effect": "Allow", "Resource": "*" }] }
FAQ
Q: What does UnblendedCost
refer to?
UnblendedCost
is the unadjusted cost of a service before accounting for any discounts, savings, or credits.
Q: Why am I not getting the most recent cost data? The cost data in AWS Cost Explorer takes up to 24-48 hours to process. If you run this script within this timeframe, you might not see the most recent costs.
Q: How often should I run this script?
This depends on your specific needs. For close monitoring of AWS costs, you might want to run this script daily. Be cautious of the getCostAndUsage
API rate limit.
Q: Can this script check costs for a specific day? Yes, the script can be modified to do so by adjusting the 'Start' and 'End' dates in the 'TimePeriod' parameter to the same day. Note that the 'Granularity' parameter should also be set as 'DAILY'.