I implemented a fairly basic schedule engine in AWS that works on specific tags to control when the machines are up or down. The cost of our demo kit was starting to add up, so I looked into the console (which is great) and saw that the main costs were EC2 and RDS. To fix this I followed a two prong approach:
- mandatory tagging
- schedule for shutdown
Kinda chicken or egg, because the solution I chose defined the tagging.
I basically followed the guides below:
https://docs.aws.amazon.com/solutions/latest/instance-scheduler/welcome.html
https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/instance-scheduler.pdf
At Fusion5, we defined a single active Tag for schedules and a single schedule stack:
If you use the tag name ScheduleUptime on an EC2 or RDS instance, then this instance will be on a schedule – it's that simple.The fusion5 stack ID is f5sched
If you set your instance to have tag ScheduleUptime
The schedules rely on 2 building blocks, periods and schedules.
A period defines the hour day of starting and stopping, kinda like cron. The schedule uses the period, but has more controls around the behaviour of the EC2 instance when there is an issue (and importantly uses TZ).
- NZ-office-hours
- AU-office-hours
- AU-7till7
- NZ-7till7
I think that you can work out what they actually mean!
1.3 Periods:
root@localhost ~]# scheduler-cli create-period --begintime 07:00 --description "7 till 7 baby" --endtime 19:00 --weekdays 0-4 --name 7till7Mon2Fri -s f5sched
{
"Period": {
"Description": "7 till 7 baby",
"Weekdays": [
"0-4"
],
"Begintime": "07:00",
"Endtime": "19:00",
"Type": "period",
"Name": "7till7Mon2Fri"
}
}
1.4 Schedules:
[root@localhost ~]# scheduler-cli create-schedule -s f5sched --description "Shannon TEsting 9 to 5" --timezone "Australia/Melbourne" --name AU-office-hours --periods "office-hours"
{
"Schedule": {
"RetainRunning": false,
"Enforced": false,
"Description": "Shannon TEsting 9 to 5",
"StopNewInstances": true,
"Periods": [
"office-hours"
],
"Timezone": "Australia/Melbourne",
"Type": "schedule",
"Name": "AU-office-hours"
}
}
1.5 Viewing schedules and periods
1.5.1 Command line
Install the command line
wget https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/scheduler-cli.zip
python setup.py install
then you can use this, but of course you need aws command line first (https://shannonscncjdeblog.blogspot.com/2017/06/move-tb-from-nz-to-aus-via-s3-bucket-of.html)
DynamoDB
There are two tables in DynamoDB
The top one is the only one to worry about (they are not really tables either)
Basically everything is saved as JSON document:
{
"begintime": {
"S": "07:00"
},
"description": {
"S": "7 till 7 baby"
},
"endtime": {
"S": "19:00"
},
"name": {
"S": "7till7Mon2Fri"
},
"type": {
"S": "period"
},
"weekdays": {
"SS": [
"0-4"
]
}
}
No comments:
Post a Comment