How can I start or stop EC2 instances based on a schedule (night, weekend)? are AWS EC2 API only solution for this?
AWS does not have any built-in method to schedule instances to start or stop. You have a few options:
Run your own EC2 instance that used cron or Task Manager to run your own scripts using the AWS SDK/CLI to start and stop the instances.
Use scheduled Auto Scaling to terminate and re-launch EC2 instances for you.
Use AWS Lambda to execute a Lambda function that starts and stops your instances, using the Lambda scheduler to schedule the execution of your Lambda function.
Use a third-party service that will start and stop your EC2 instances for you.
You can try my software, CloudRoboAWSScheduler. Download it from http://cloudrobo.net/download/
Please go through the setup details mentioned in http://cloudrobo.net/setup/
It is absolutely free.
Features:
- Easy to use GUI
- START / STOP EC2 Instances
- Reduce costs by starting and stopping your EC2 instances automatically
- Create dynamic schedules using ClouRobo AWS scheduler
- Manage multiple accounts in different AWS regions - Easy to use user interface
- Installs on Windows Server 2008/2012 or Windows 7/8/10
Note: This is a beta release.
-Viswanath
Related
I have scheduled 2 cronjobs for my application.
My Application server is in an autoscaling group and I kept a minimum of 2 instances because of High availability. Everything working is fine but cron job is running multiple times because of 2 instances in autoscaling.
I could not limit the instance size to 1 because already my application in the production environment I prefer to have HA.
How should I have to limit execute cron job on a single instance? or should i have to use other services like AWS Lamda or AWS ELasticBeanstalk
Firstly you should consider whether running the crons on these instances is suitable. If you're trying to keep this highly available and it is directly interacted via customers what will the impact of the crons performance be?
Perhaps consider using a separate autoscaling group or instance with a total of 1 instances to run these crons? You could launch the instance or update the autoscaling group just before the cron needs to run and then automate the shutdown after it has completed.
Otherwise you would need to consider using a locking mechanism for your script. By using this your script write a lock to confirm that it is in process, at the beginning of the script run it would check whether there was any script lock in progress. To further prevent the chance of a collision between multiple servers consider adding jitter (random seconds of sleep) to the start of your script.
Suitable technologies for writing a lock are below:
DynamoDB using strongly consistent reads.
EFS for a Linux application, or FSX for a Windows application.
S3 using strong consistency.
Solutions suggested by Chris Williams sound reasonable if using lambda function is not an option.
One way to simulate cron job is by using CloudWatch Events (now known as EventBridge) in conjunction with AWS Lambda.
First you need to write a Lambda function with the code that needs to be executed on a schedule. Lambda supports cron expressions.
You can then use Schedule Expressions with EventBridge/CloudWatch Event in the same way as a cron tab and mention the Lambda function as target.
you can enable termination protection on of the instance. Attach necessary role & permission for system manager. once the instance is available under managed instance under system manager you can create a schedule event in cloudwatch to run ssm documents. if you are running a bash script convert that to ssm document and set this doc as targate. or you can use shellscript document for running commands
I am trying to start and stop my EC2 instances at a specific time of the day.
There is a scheduled start and stop VMS options available in Azure.
I am wondering if something similar to that is present in AWS.
if not what is the best way to achieve it?
assuming 7am I start my EC2 and stop it by 9pm IST. I am also aware of the cloud watch event integrated with lamnda option
Based on the comments.
The lambda function would be only required to start your instance, if you want to trigger it using CloudWatch (CW) Event rule. The reason is, that you can stop the instance directly, using CW built-in targets:
Built-in targets: EC2 CreateSnapshot API call, EC2 RebootInstances API call, EC2 StopInstances API call, and EC2 TerminateInstances API call.
Sadly, there is no build-in target for starting the instance, thus lambda function is needed for that.
Create two different Lambda function to launch and terminate an EC2 instance and schedule them via CloudWatch. For the Lambda you can use any language from the AWS SDK. To select a particular instance to terminate, the EC2 instance can be tagged to segregate it. Here is the solution for the same.
Here is the complete guide https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/. Let me know if that helps.
As suggested by Praveen Sripati https://aws.amazon.com/solutions/implementations/instance-scheduler/ works pretty well.
I am already doing scale in scale out for auto scaling stack through scheduled actions.
I am in need of to auto start and stop for standalone EC2 ( not part of ASG)just wondering if CF support that ?
You can use the AWS Instance Scheduler to automate the starting and stopping of EC2 machines. Here you can find the documentation on how to set this up manually, and there is also a nice tutorial to follow along if the documentation is a bit too heavy.
The AWS Instance Scheduler deployment can also be setup using CloudFormation. AWS provides these examples as a starting point.
There is no capability in AWS (or CloudFormation) to schedule a start and stop of an instance.
However, you can code-up a simple solution using Amazon CloudWatch Events to trigger an AWS Lambda function on a schedule. You could even use Tags to identify when to start/stop instances.
For some examples, see: Simple EC2 Stopinator in Lambda - DEV Community
I have a full deployment job that takes an ip of a running instance and deploys my system on it.
I currently hold an EC2 instance for automation tests that run every night, but the instance is expensive and im looking for a way to initiate it before the tests and terminate it after the test.
I looked for EC2 plugins that can help and the closest one was this but this is for making slaves and thats not what I want.
I want to be able to launch an EC2 instance, and pass its IP address to the automation tests job, then terminate that instance once done.
I started making a command line bash file for this, but this seems like too much work, and I thought maybe there is something im missing.
Your requirement is valid and amazon knows:
When you stop an instance, we shut it down. We don't charge usage for a stopped instance, or data transfer fees, but we do charge for the storage for any Amazon EBS volumes.
Reference :
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html
Here some approaches to start/stop your instaces
Amazon EC2 HTTP API
This is an api rest and you can perform a simple http request to start or stop your instance:
Amazon EC2 API Reference
Start Instance endpoint
https://ec2.amazonaws.com/?Action=StartInstances&...
Stop Instance endpoint
https://ec2.amazonaws.com/?Action=StopInstances&...
You can invoke this api from Jenkins in many ways : simple shell execution,groovy and scripted/declarative, pipelines.
AWS CLI
start instance
stop instance
Here more about how suspend instances using aws cli:
https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-suspend-resume-processes.html
Also with powershell: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html
You can invoke this api from Jenkins in many ways : simple shell execution,groovy and scripted/declarative, pipelines.
AWS Instance Scheduler
In 2018, AWS launched the AWS Instance Scheduler, a new and improved scheduling solution that enables customers to schedule Amazon EC2 instances.
With this tool you can automatically start and stop the Amazon EC2 and Amazon RDS instances.
Reference :
https://aws.amazon.com/answers/infrastructure-management/instance-scheduler/
With this approach you don't need Jenkins :b
I have a Docker image containing Python code and third-party binary executables. There are only outbound network requests. The image must run hourly and each execution lasts ~3 minutes.
I can:
Use an EC2 instance and schedule hourly execution via cron
Create a CloudWatch Event/Rule to run an ECS Task Defintion hourly
Setup an Elastic Beanstalk environment and schedule hourly deployment of the image
In all of these scenarios, an EC2 instance is running 24/7 and I am being charged for extended periods of no usage.
How do I accomplish scheduling the starting of an existing EC2 instance hourly and the stopping of said instance after the completion of my docker image?
Here's one approach I can think of. It's very high-level, and omits some details, but conceptually it would work just fine. You'll also need to consider the Identity & Access Management (IAM) Roles used:
CloudWatch Event Rule to trigger the Step Function
AWS Step Function to trigger the Lambda function
AWS Lambda function to start up EC2 instances
EC2 instance polling the Step Functions service for Activity Tasks
Create a CloudWatch Event Rule to schedule a periodic task, using a cron expression
The Target of the CloudWatch Event Rule is an AWS Step Function
The AWS Step Function State Machine starts by triggering an AWS Lambda function, which starts the EC2 instance
The next step in the Step Functions State Machine invokes an Activity Task, representing the Docker container that needs to execute
The EC2 instance has a script running on it, which polls the Activity Task for work
The EC2 instance executes the Docker container, waits for it to finish, and sends a completion message to the Step Functions Activity Task
The script running on the EC2 instance shuts itself down
The AWS Step Function ends
Keep in mind that a potentially better option would be to spin up a new EC2 instance every hour, instead of simply starting and stopping the same instance. Although you might get better startup performance by starting an existing instance vs. launching a new instance, you'll also have to spend time to maintain the EC2 instance like a pet: fix issues if they crop up, or patch the operating system periodically. In today's world, it's a commonly accepted practice that infrastructure should be disposable. After all, you've already packaged up your application into a Docker container, so you most likely don't have overly specific expectations around which host that container is actually being executed on.
Another option would be to use AWS Fargate, which is designed to run Docker containers, without worrying about spinning up and managing container infrastructure.
AWS Step Functions
AWS Fargate
Blog: AWS Fargate: An Overview
Creating a CloudWatch Event Rule that triggers on a schedule