Advanced Cloud Cost Optimization Strategy Teams Overlook
Why a Scheduling Strategy Is the Missing Piece in Your FinOps Playbook
Most engineering and platform teams focus on right‑sizing, reserved capacity, or eliminating orphaned resources. Those tactics capture obvious waste, but they miss a subtle, high‑impact lever: automated scheduling of compute resources. By aligning instance lifecycles with actual demand, you can run workloads on the cheapest pricing model (Spot) when possible, lock in predictable usage with Savings Plans, and shut down everything else. The result is a measurable dollar reduction that appears on the same line items you already monitor in Cost Explorer.
Identify Predictable, Time‑Bound Workloads
Before you automate anything, you need a clear inventory of workloads that have a regular schedule. Typical candidates include:
- Nightly batch jobs (ETL, data aggregation, report generation)
- Development and test environments that are only needed during business hours
- CI/CD runners that spin up for a few hours per day
- Scheduled data‑pipeline orchestrations (Step Functions, Airflow DAGs)
How to Find These Workloads in AWS
- Open the AWS Cost Explorer console.
- Choose Usage type → Instance Hours.
- Group by Service and Usage Type and set the time range to Last 30 days.
- Look for patterns where usage spikes at the same hour each day or on specific weekdays.
- Export the chart (
Download CSV) for further analysis.
Alternatively, use the CLI to list running instances and their launch times:
aws ec2 describe-instances \
--query "Reservations[].Instances[?State.Name=='running'].[InstanceId,LaunchTime,Tags]" \
--output table
Export the data to a spreadsheet, sort by LaunchTime, and spot recurring start times.
Build an Automated Schedule with AWS Instance Scheduler
AWS provides a ready‑to‑use CloudFormation template called Instance Scheduler that creates a Lambda‑driven scheduler, DynamoDB tables, and IAM roles. The solution lets you define schedules (e.g., workhours, nightly) and tag instances with Schedule=workhours to have them start/stop automatically.
Step‑by‑Step Deployment
- Open the AWS CloudFormation console.
- Click Create stack → With new resources (standard).
- In the Specify template field, paste the public URL:
https://s3.amazonaws.com/solutions-reference/instance-scheduler/latest/instance-scheduler.template. - Provide a stack name, e.g.,
my-instance-scheduler. - Set the required parameters:
- SchedulerFrequency –
cron(0/5 * ? * * *)(runs every 5 minutes) - TagName –Schedule- TagValue –workhours - Review, acknowledge IAM capabilities, and create the stack.
Tag Your Instances
aws ec2 create-tags \
--resources i-0123456789abcdef0 i-0fedcba9876543210 \
--tags Key=Schedule,Value=workhours
The Lambda function will now start those instances at 08:00 UTC and stop them at 20:00 UTC (default schedule). Adjust the schedule definition in the DynamoDB SchedulerConfig table if you need a different window.
Combine Spot Instances and Savings Plans for Maximum Savings
Once your workloads are scheduled, you can decide which pricing model to apply during the active window.
| Pricing Model | Typical Discount vs On‑Demand | Best Use Case |
|---|---|---|
| Spot | 70‑90 % | Stateless, fault‑tolerant jobs that can be interrupted |
| Savings Plans | 30‑50 % (Compute) or 40‑55 % (EC2) | Predictable, long‑running workloads that need guaranteed capacity |
| On‑Demand | 0 % | Short‑lived, unpredictable bursts |
Strategy Blueprint
- Batch jobs – Run on Spot. Configure your job scheduler (e.g., AWS Batch, Airflow) to request Spot capacity. Use
--allocation-strategy SPOT_CAPACITY_OPTIMIZEDto get the most stable Spot pools. - Development environments – Use Compute Savings Plans. Purchase a 1‑year plan that matches the average hourly usage of your dev instances (e.g., 2 vCPU, 8 GiB). The scheduler will still stop the instances outside business hours, but the plan guarantees a lower rate while they are running.
- Critical services – Keep On‑Demand for the few minutes you need immediate capacity during a scale‑out event, then let the Auto Scaling group replace them with Spot once the demand stabilizes.
Example CLI to Purchase a Compute Savings Plan
aws savingsplans create-savings-plan \
--savings-plan-type Compute \
--commitment 500 \
--term 1yr \
--payment-option PartialUpfront
Replace 500 with the hourly commitment (in USD) that matches your scheduled usage.
Use AWS Compute Optimizer to Fine‑Tune Instance Families
Even with scheduling, you can still over‑provision instance size. AWS Compute Optimizer analyzes CloudWatch metrics and recommends a smaller instance type that meets the same performance profile.
Enable Compute Optimizer
aws compute-optimizer update-enrollment-status \
--status Active
After 24 hours, pull the recommendations:
aws compute-optimizer get-recommendation-summaries \
--service-namespace EC2 \
--query "InstanceRecommendations[*].{InstanceId:InstanceArn,Current:CurrentInstanceType,Recommended:RecommendedInstanceType}" \
--output table
Apply the recommended type to your scheduled instances:
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 \
--instance-type "{\"Value\":\"t3.medium\"}"
Repeat the process quarterly to keep the fleet lean.
Monitor and Validate Savings with CloudWatch and Cost Explorer
Automation is only valuable if you can prove the dollar impact.
- Create a CloudWatch metric filter that captures
StopInstancesandStartInstancesAPI calls from the scheduler Lambda. - Set up a dashboard that shows: - Total instance‑hours saved per day (compare scheduled vs actual) - Spot vs Savings Plan spend breakdown - Estimated monthly savings (use the Savings Plans Utilization Report)
- Schedule a monthly Cost Explorer report that groups by Tag
Scheduleto see the exact cost of scheduled resources.
Sample CloudWatch Dashboard JSON Snippet
{
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"metrics": [
[ "AWS/EC2", "CPUUtilization", "InstanceId", "i-0123456789abcdef0" ]
],
"period": 300,
"stat": "Average",
"title": "CPU Utilization of Scheduled Instance"
}
}
]
}
Export the dashboard and share it with finance stakeholders to demonstrate transparency.
Frequently asked questions
How do I ensure Spot interruptions don’t break my batch pipeline?
Use AWS Batch or Amazon EMR with the Spot allocation strategy. Both services automatically checkpoint work and retry on a new Spot instance. Additionally, enable EC2 Instance Termination Notices (via CloudWatch Events) to gracefully shut down tasks before the instance is reclaimed.
Can I mix Savings Plans and Spot within the same Auto Scaling group?
Yes. Create a mixed‑instance policy that specifies a base capacity of On‑Demand or Savings‑Plan‑covered instances and a percentage of Spot capacity. The scheduler will still start/stop the group, but the pricing mix is handled by the Auto Scaling configuration.
What if my workload sometimes exceeds the Spot pool capacity?
Configure the Auto Scaling group’s allocation strategy to BEST_FIT_PROGRESSIVE. The group will first try Spot, then fall back to On‑Demand for any capacity shortfall, ensuring the job completes.
Do I need to tag every resource for the scheduler to work?
Only the compute resources you want to control need the Schedule tag. Other resources (RDS, ElastiCache) can be left untagged; the scheduler will ignore them.
Key takeaways
- Identify workloads with a predictable schedule and tag them for automation.
- Deploy AWS Instance Scheduler via CloudFormation to start/stop instances automatically.
- Pair Spot Instances for interruptible jobs with Compute Savings Plans for always‑on dev environments.
- Use AWS Compute Optimizer to continuously right‑size the instance families you schedule.
- Validate the financial impact with CloudWatch dashboards and Cost Explorer tag reports.
- The strategy works across accounts when you share the scheduler stack via AWS RAM.
CloudBudgetMaster automates the entire workflow: it scans your AWS environment in read‑only mode, discovers idle or over‑provisioned resources, and reports the exact dollar impact of each waste source. The platform currently supports AWS scanning today, with GCP, Azure, and Snowflake support coming soon. Use our free AWS waste finder to get an instant snapshot, then create a free account to start tracking savings automatically.
CloudBudgetMaster