Stop/start EC2 instance on schedule basis to save cost

Chào mừng bạn đến với Ngày 13 của 100 Ngày DevOps, Hãy tiếp tục hành trình này nhé .

Mục tiêu đơn giản chính là : save cost

Problem : Shutdown tất cả phiên bản EC2 trong tài khoản AWS Devlúc 6 giờ tối và open nó trở lại vào ngày hôm sau lúc 9 giờ sáng (Thứ Hai đến Thứ Sáu) . thật ra yêu cầu này vẫn có nhé mấy bạn .

Solution : Bạn có thể sử dụng Lambda function kết hợp các CloudWatch Event để làm việc này .

  • Một trong những thách thức lớn trong việc thực hiện điều này là đối với những Dev cần làm việc muộn và anh ta muốn run instance của mình quá 6h tối và những bản vá lỗi gấp , làm việc lúc cuối tuần ?
  • Một giải pháp phổ biến tôi đưa ra là chỉ định manual các danh sách trong Python Code (Lamda function)

Step 1 : Chúng ta tạo IAM Role để Lambda có thể tương tác với Sự kiện CloudWatch


Go to IAM Console https://console.aws.amazon.com/iam/home?region=us-west-2#/home --> Roles --> Create role

  • Tiếp theo, chọn Create policy ,IAM Policy sẽ như thế này
{
“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”: “*”
}
]
}
  • Add poilicy cho role

Step 2 : Create Lambda function

  • Go to Lambda https://us-west-2.console.aws.amazon.com/lambda/home?region=us-west-2#/home
  • sau đó chọn Create Function

* Select Author from scratch
* Name: Give your Lambda function any name
* Runtime: Select Python2.7 as runtime
* Role: Choose the role we create in first step
* Click on Create function

Trong kịch bản tiếp chúng ta sẽ tạo 1 hàm để stop/start instance

Stop instance code :


import boto3
region = 'XX-XXXXX-X'
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)

Note :
* Change the Value of region
* In the instance field specify instance id

Start instance code :


import boto3
region = 'XX-XXXXX-X'
instances = ['X-XXXXXXXX']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.start_instances(InstanceIds=instances)
print 'started your instances: ' + str(instances)

Step 3 : Create CloudWatch event để kích hoạt chức năng Lambda này

Tương tự cho việc Start instance

Note : chỗ này bạn chỉnh lại cấu trúc crontab theo ý muốn nhé (default theo UTC TimeZone)

Tiếp đến các bạn chọn Lamda function như bên dưới .
Lambda function --> Monitoring --> View logs in CloudWatch

khi stop instance nó tương tự thế này là đúng .

khi start thì cũng tương tự .

Như vậy là bạn đã tiết kiệm được khá nhiều chi phí cho cty bạn rồi , rồi đề xuất lấy tiền đó thưởng tết cho em =))

Chúc các bạn thành công .

Trả lời

Email của bạn sẽ không được hiển thị công khai.