-
Notifications
You must be signed in to change notification settings - Fork 0
/
lambda_scheduler.py
90 lines (73 loc) · 3.03 KB
/
lambda_scheduler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import json
import boto3
from datetime import datetime
#
# configuration
#
#
# region_name - Use your region you hosted EC2
#
region_name='us-east-1'
#
# instances_to_check - EC2 instances are found by the tag name and tag value. In the example
# below, the tag name is "scheduler_name" and the tag value is "dev_test"
#
instances_to_check = { 'tag_name': 'scheduler_name', 'tag_value': 'dev_test' }
#
# start_times - the list of the start times during the day, using 24h notation, for
# example, if the instances should be started at 8:00 only, set this value to [ '8:00' ]
# if they should be started at 4:00 and 14:00, set to [ '4:00', '14:00' ]
#
# stop_times - the list of the stop times, defined in the same way as start_times
#
start_times = [ '4:00', '14:00' ]
stop_times = [ '4:30', '16:00' ]
#
# check_by_n_minutes - Check instance if running or stopped state by n minutes
#
check_by_n_minutes = 15
#
# no changes required past this line
#
def lambda_handler(event, context):
print('Scheduler started')
print('Current time is: {}'.format(datetime.now().strftime('%H:%M')) )
#
# Checking if the instances should be started or stopped
#
action_to_take = 'no action'
current_time = datetime.now().hour * 100 + datetime.now().minute
for start_time in start_times:
num_time = int(start_time.replace(':',''))
if (current_time >= num_time) & (current_time <= (num_time + check_by_n_minutes)):
action_to_take = 'start'
for stop_time in stop_times:
num_time = int(stop_time.replace(':',''))
if (current_time >= num_time) & (current_time <= (num_time + check_by_n_minutes)):
action_to_take = 'stop'
print('Action to take: {}'.format(action_to_take))
if action_to_take != 'no action':
#
# Looking for the instances to check
#
ec2 = boto3.resource('ec2', region_name=region_name)
ec2_client = boto3.client('ec2', region_name=region_name)
custom_filter = [
{'Name':'tag:' + instances_to_check['tag_name'],
'Values': [ instances_to_check['tag_value'] ] }
]
instances = ec2.instances.filter(Filters=custom_filter)
print('----- Instances to check: -----')
for instance in instances:
print('Checking {}...'.format(instance.id))
if (instance.state['Name'] == 'running') & (action_to_take == 'stop'):
print('Instance {} in the state "{}" should be stopped'.format(instance.id, instance.state['Name']))
ec2_client.stop_instances(InstanceIds=[ instance.id ], DryRun=False)
if (instance.state['Name'] == 'stopped') & (action_to_take == 'start'):
print('Instance {} in the state "{}" should be started'.format(instance.id, instance.state['Name']))
ec2_client.start_instances(InstanceIds=[ instance.id ], DryRun=False)
print('Scheduler finished')
return {
'statusCode': 200,
'body': json.dumps('Scheduler executed')
}