DEV Community

Cover image for How to schedule EC2 instances easily (start/stop)
Federico Navarrete
Federico Navarrete

Posted on • Edited on • Originally published at supernovaic.blogspot.com

1 1

How to schedule EC2 instances easily (start/stop)

Everyone would like to schedule EC2 instances and save a couple of bucks. Today, I'm bringing you a small Python that can help you. The steps are the following ones:

Step 1. Create a lambda function called: ec2_scheduler

Step 2. Copy and paste the following code:

import boto3
import os
import json

region = os.environ['REGION']
ec2 = boto3.client('ec2', region_name=region)

instances = []

def lambda_handler(event, context):
    action = event['Action']
    response = ec2.describe_instances(Filters=[{'Name' : 'instance-state-name','Values' : [action]}, {'Name': 'tag-key', 'Values': ['auto-scheduled']}])
    reservations = response['Reservations']
    for reservation in reservations:
        for instance in reservation['Instances']:
            instanceId = instance['InstanceId']
            for tag in instance['Tags']:
                if tag['Key'] == 'auto-scheduled' and tag['Value'] == 'true':
                    instances.append(instanceId)

    if (action == 'stopped'):
        if (len(instances) > 0):
            ec2.start_instances(InstanceIds=instances)
    else
        if (len(instances) > 0):
            ec2.stop_instances(InstanceIds=instances)
Enter fullscreen mode Exit fullscreen mode

Step 3. Set a tag to your EC2 instance called: auto-scheduled that has a value assigned as true.

Step 4. Add a new Policy in the configuration and permission section of your Lambda that contains:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Start*",
                "ec2:Stop*",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Step 5. Schedule your Lambda as triggers with cron expressions like these ones:

  • For starting: cron(0 6 ? * MON-FRI *)
  • For stopping: cron(0 16 ? * MON-FRI *)

Step 6. Set a JSON that contains the following expression to know if it's starting or stopping:

  • For starting:
{
    "Action": "stopped"
}
Enter fullscreen mode Exit fullscreen mode
  • For stopping:
{
    "Action": "running"
}
Enter fullscreen mode Exit fullscreen mode

And that's all!

Follow me on:

Personal LinkedIn YouTube Instagram Cyber Prophets Sharing Your Stories
Personal LinkedIn YouTube Instagram RedCircle Podcast RedCircle Podcast

sponsor me

Banner credits:

https://tridentsys.net/howto-schedule-ec2/

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs