Day 16- Stop/Start EC2 instance on a scheduled basis to save cost
This is one of the ask I came across in Dev env to save money where you need to shut down all the EC2 instance on a scheduled basis and bring it back the next day. To achieve that, we use Lambda in the combination of CloudWatch Events.
These are the steps we need to perform
Step1: Create IAM Role so that Lambda can interact with CloudWatch Events
Go to IAM Console https://console.aws.amazon.com/iam --> Roles --> Create role

- In the next screen select on Create Policy and paste the following policy

{
"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*"
],
"Resource": "*"
}
]
}
- Give your policy some name and click on Create policy

- Click back on Roles and Create role
Go to IAM Console https://console.aws.amazon.com/iam --> Roles --> Create role
- Select AWS service as Trusted entity type and Use case Lambda
- This time select ec2-stop-start-policy we created in the previous steps

- Give your role some meaningful name and click Create role at the bottom of screen.

Step2: Create Lambda function
- Go to Lambda https://us-west-2.console.aws.amazon.com/lambda/home?region=us-west-2#/home
- Select Create function

* Select Author from scratch * Name: Give your Lambda function any name * Runtime: Select Python3.9 as runtime * Role: Choose the role we create in first step(ec2-stop-start-role) * Click on Create function

- To stop the instance, the code will look like this
import boto3 # Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g., 'us-east-1' region = 'XX-XXXXX-X' # Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX'] instances = ['X-XXXXXXXX'] def lambda_handler(event, context): ec2 = boto3.client('ec2', region_name=region) ec2.stop_instances(InstanceIds=instances) print 'stopped your instances: ' + str(instances)
* Change the Value of region * In the instance field specify instance id
- Keep all the settings as default, just change the timeout value to 10sec
- Now we need to perform the same steps for starting the instance

- Click on Deploy
Step3: Create the CloudWatch event to trigger this Lambda function
- Open the Amazon CloudWatch console.
- Choose Events, and then choose Create rule.
- Choose Schedule under Event Source.

- Under Cron expression choose * 18 * * ? * (If you want to shutdown your instance at 6pm everyday)
- Choose Add target, and then choose Lambda function that you created earlier to stop the instance
- Click on Configure details

- Give your rule some name and click on Create rule.
NOTE: One very important point to note is that all scheduled event is in UTC timezone, so you need to customize it based on your timezone.
- Go back to your Lambda and click on View logs in CloudWatch


- The simple automation system is ready in stopping/starting the instance and to save some company money.