CloudBudgetMasterCloudBudgetMaster

← All articles

Strategy

Advanced Cloud Cost Optimization Strategy Teams Overlook

September 20, 2026·6 min read·CloudBudgetMaster

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:

How to Find These Workloads in AWS

  1. Open the AWS Cost Explorer console.
  2. Choose Usage type → Instance Hours.
  3. Group by Service and Usage Type and set the time range to Last 30 days.
  4. Look for patterns where usage spikes at the same hour each day or on specific weekdays.
  5. 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

  1. Open the AWS CloudFormation console.
  2. Click Create stack → With new resources (standard).
  3. In the Specify template field, paste the public URL: https://s3.amazonaws.com/solutions-reference/instance-scheduler/latest/instance-scheduler.template.
  4. Provide a stack name, e.g., my-instance-scheduler.
  5. Set the required parameters: - SchedulerFrequency – cron(0/5 * ? * * *) (runs every 5 minutes) - TagName – Schedule - TagValue – workhours
  6. 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

  1. Batch jobs – Run on Spot. Configure your job scheduler (e.g., AWS Batch, Airflow) to request Spot capacity. Use --allocation-strategy SPOT_CAPACITY_OPTIMIZED to get the most stable Spot pools.
  2. 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.
  3. 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.

  1. Create a CloudWatch metric filter that captures StopInstances and StartInstances API calls from the scheduler Lambda.
  2. 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)
  3. Schedule a monthly Cost Explorer report that groups by Tag Schedule to 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


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.

Stop guessing where your AWS bill comes from

Upload a CSV, no signup. CloudBudgetMaster finds idle, unused, and overspending AWS resources automatically. GCP and Azure coming soon.

Run a free check