มีวิธีง่าย ๆ ในการเริ่มและหยุดอินสแตนซ์ AWS EC2 ตามเวลาที่กำหนดในแต่ละวันหรือไม่? สิ่งนี้สามารถช่วยฉันประหยัดเงินได้มากสำหรับการพัฒนาและทดสอบเซิร์ฟเวอร์ของฉัน
มีวิธีง่าย ๆ ในการเริ่มและหยุดอินสแตนซ์ AWS EC2 ตามเวลาที่กำหนดในแต่ละวันหรือไม่? สิ่งนี้สามารถช่วยฉันประหยัดเงินได้มากสำหรับการพัฒนาและทดสอบเซิร์ฟเวอร์ของฉัน
คำตอบ:
ปรับปรุง
AWS ได้เปิดตัวเครื่องมือที่เรียกว่า " Instance Scheduler " รวมถึงคู่มือการกำหนดค่าแบบเต็มซึ่งเชื่อมโยงจากหน้านั้น ดูเหมือนว่าเป็นการปรับปรุงของตัวกำหนดตารางเวลา EC2 ที่ฉันอธิบายด้านล่างพร้อมกับคุณสมบัติเพิ่มเติมไม่กี่อย่าง
คำแนะนำด้านล่างจะยังคงใช้งานได้ แต่น่าจะดีกว่าถ้าดูตัวกำหนดตารางเวลาอินสแตนซ์สำหรับการติดตั้งใหม่
โพสต์ต้นฉบับ
AWS มีเครื่องมือที่ชื่อว่าEC2 Schedulerที่ให้คุณควบคุมการเริ่มและหยุดอินสแตนซ์ EC2 ได้อย่างยืดหยุ่น
เครื่องมือช่วยให้คุณกำหนดเวลาเริ่มและหยุดเริ่มต้นเมื่อคุณตั้งค่าเครื่องมือซึ่งคุณสามารถเปลี่ยนได้ในภายหลัง คุณสามารถเลือกอินสแตนซ์ที่ได้รับการควบคุมคุณและคุณสามารถระบุเวลาเริ่มต้นและหยุดที่แตกต่างกันสำหรับแต่ละอินสแตนซ์โดยใช้แท็ก
แม้ว่ามันจะเป็นเครื่องมือที่ยอดเยี่ยม แต่เอกสารนั้นค่อนข้างคลุมเครือและสับสน มันเหมือนกับเอกสารที่เขียนขึ้นโดยวิศวกรผู้เขียนเครื่องมือและรู้ทุกอย่างเกี่ยวกับมันมากกว่านักเขียนทางเทคนิค
หมายเหตุ : หากคุณมีข้อเสนอแนะหรือความคิดเห็นการแก้ไขความชื่นชม หากคุณมีคำถามตามนี้โปรดเริ่มคำถามของคุณเอง
EC2 Scheduler คืออะไร
เครื่องมือนี้เป็นฟังก์ชั่นแลมบ์ดาที่ทำงานกับ Cloudwatch Events และ DynamoDB มันถูกปรับใช้โดยใช้แม่แบบ Cloudformation ซึ่งตั้งค่าบทบาทและนโยบายของ IAM ที่จำเป็นด้วย คุณสามารถอ่านเกี่ยวกับสถาปัตยกรรมที่นี่
การปรับใช้
เริ่มต้นโดยไปที่หน้านี้และคลิก "เรียกใช้งานโซลูชัน" ตอนนี้ลิงค์โดยตรงอยู่ที่นี่แต่มันอาจเปลี่ยนแปลงได้
เลือกภูมิภาคที่คุณต้องการใช้ทรัพยากรที่ด้านบนของคอนโซล สคริปต์ควบคุมอินสแตนซ์ EC2 ในภูมิภาคใด ๆ แต่จะทำงานในภูมิภาคเดียว
การติดแท็กอินสแตนซ์ EC2
สิ่งนี้ครอบคลุมในเอกสารที่นี่แต่มันไม่ง่ายอย่างที่ควรเป็น
คุณสามารถควบคุมอินสแตนซ์ที่จะเริ่มและหยุดโดยการแท็กอินสแตนซ์ของคุณ
กรณีที่ง่ายที่สุดกำหนดให้คุณแท็กอินสแตนซ์ EC2 แต่ละรายการที่คุณต้องการเริ่มต้นและหยุดทำงานตามกำหนดเวลา ในการทำเช่นนี้ค้นหาอินสแตนซ์ EC2 ของคุณในคอนโซลคลิกแท็กและสร้างแท็กนี้
วิธีเปิดใช้งานการคัดลอกและวาง:
หากคุณต้องการให้อินสแตนซ์ที่เฉพาะเจาะจงเริ่มต้นและหยุดทำงานตามกำหนดเวลาที่แตกต่างกันคุณผนวกข้อมูลเพิ่มเติมเข้ากับคีย์แท็กและค่า ตัวอย่างเช่นหากคุณต้องการให้อินสแตนซ์เริ่มต้นที่ 1500 UTC และหยุดเวลา 2400 UTC ในวันอังคารวันพฤหัสบดีและวันศุกร์ให้คุณป้อนข้อมูลต่อไปนี้
รหัส: ตัวกำหนดตารางเวลา: ec2-startstop: ล่าช้าค่า: 1500; 2400; utc; tue, thu, fri
โปรดทราบว่าคำว่า "ล่าช้า" อาจเป็นสตริงใดก็ได้ "ล่าช้า" ไม่มีความหมายพิเศษ
คุณสามารถแปลง UTC เป็นเวลาท้องถิ่นของคุณโดยใช้เครื่องมือนี้
คุณสามารถใช้ตัวแก้ไขแท็กเพื่ออินสแตนซ์แท็กจำนวนมาก ซึ่งอาจช่วยให้คุณตั้งค่าการแท็กจำนวนมากได้ง่ายขึ้นซึ่งอาจเป็นประโยชน์สำหรับการตั้งค่าที่แตกต่างกันสำหรับการทดสอบและการผลิต ฉันสงสัยว่าคุณจะใช้มันเพื่อการผลิต
พารามิเตอร์ของ CloudFormation
เมื่อคุณเรียกใช้เทมเพลต CloudFormation คุณจะต้องป้อนพารามิเตอร์จำนวนมาก ส่วนใหญ่คุณสามารถออกจากที่เริ่มต้น นี่คือพารามิเตอร์ที่สำคัญที่สุด
สิทธิ์นโยบายและบทบาท
ส่วนบทบาทการอนุญาต / IAM ของเทมเพลต CloudFormation เป็นปลาเฮอริ่งแดง - นั่นคือมันไม่เกี่ยวข้องส่วนใหญ่ มันระบุเฉพาะบทบาทที่ใช้ในการเรียกใช้สคริปต์ CloudFormation มันไม่สร้างความแตกต่างให้กับทรัพยากรที่สร้างขึ้นหรือบทบาทที่ใช้เมื่อฟังก์ชั่นแลมบ์ดาทำงาน เมื่อมองย้อนกลับไปเห็นได้ชัด แต่เมื่อฉันเริ่มมันไม่ชัดเจน
บทบาทใดก็ตามที่คุณเรียกใช้สคริปต์นี้เป็นบทบาทเดียวกันและสิทธิ์แบบอินไลน์จะถูกสร้างขึ้นภายใน IAM ฟังก์ชัน Lambda ทำงานโดยใช้ "บทบาทตัวกำหนดตารางเวลา ec2" ที่สคริปต์สร้าง
ฉันได้รวมนโยบายของฉันไว้ด้านล่างในกรณีที่มีประโยชน์สำหรับทุกคน
เหตุการณ์และตัวชี้วัด CloudWatch
หากคุณต้องการดูบันทึกจากฟังก์ชั่นแลมบ์ดาของคุณให้เข้าไปในกิจกรรม Cloudwatch การบันทึกค่อนข้างดี มีตัวชี้วัดเช่นกันดังนั้นคุณสามารถดูได้ว่าเมื่อใดเวลาที่มันทำงานเป็นต้น
เพิ่มเติม
สำหรับฟังก์ชั่นแลมบ์ดาที่มีอยู่ในGithub
นโยบาย
โดยทั่วไปแล้วสิ่งเหล่านี้ไม่จำเป็น แต่อาจเป็นสำหรับใครบางคนดังนั้นฉันจะรวมไว้ด้วย
นโยบายสำหรับบทบาทของ IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeTags",
"iam:CreateRole",
"iam:GetRole",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:DeleteRole",
"dynamodb:*",
"lambda:*",
"SNS:Publish",
"events:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "S3:GetObject",
"Resource": [
"arn:aws:s3:::solutions-us-west-2",
"arn:aws:s3:::solutions-us-west-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances",
"ec2:StartInstances"
],
"Resource": [
"arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
]
}
]
}
นโยบายความน่าเชื่อถือสำหรับบทบาท IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"cloudformation.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
หากคุณเพียงแค่ต้องการเริ่มและหยุดอินสแตนซ์นี่เป็นอีกสิ่งที่ต้องทำซึ่งใช้ประโยชน์จากบริการของแลมบ์ดา จะถือว่าคุณต้องการควบคุมรหัสอินสแตนซ์ที่เฉพาะเจาะจง คุณสามารถควบคุมได้หลายอินสแตนซ์โดยเพิ่มรหัสเพิ่มเติมคั่นด้วยเครื่องหมายจุลภาค (เช่น: 'i-3453453', 'i-45656745') คุณสามารถค้นหา id ของอินสแตนซ์ของคุณได้ในส่วนอินสแตนซ์คอนโซล AWS
รหัสด้านล่าง
{
"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": "*"
}
]
}
รหัสด้านล่าง
import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.stop_instances(InstanceIds=instances)
print 'stopped your instances: ' + str(instances)
รหัสด้านล่าง
import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.start_instances(InstanceIds=instances)
print 'started your instances: ' + str(instances)
ที่นี่คุณจะสร้างกิจกรรม CloudWatch ที่จะเรียกใช้ฟังก์ชันแลมบ์ดาของคุณในเวลากลางคืน
หมายเหตุ: นิพจน์ Cron ถูกประเมินเป็น UTC ให้แน่ใจว่าได้ปรับการแสดงออกสำหรับโซนเวลาที่คุณต้องการ นี่คือตัวอย่างที่จะเรียกใช้ฟังก์ชันทุกวันเวลา 08:00 GMT / UTC):
0 08 * * ? *
หากต้องการเริ่มต้นอินสแตนซ์ใหม่ในตอนเช้าทำซ้ำขั้นตอนเหล่านี้และใช้เวลาเริ่มต้นที่คุณต้องการ หากคุณต้องการส่งข้อความเมลทุกครั้งที่ฟังก์ชั่นล้มเหลวคุณสามารถตั้งค่าหัวข้อ SNS และกำหนดค่าการส่งข้อความนั้นภายใต้การดีบักในหน้าต่างการสร้างฟังก์ชั่น Lmbda
แหล่งที่มาของทั้งหมดนี้สามารถพบได้ที่นี่: เอกสาร AWS