วิธีเริ่มและหยุดการทำงานของอินสแตนซ์ AWS EC2 ตามตารางเวลาตาม


17

มีวิธีง่าย ๆ ในการเริ่มและหยุดอินสแตนซ์ AWS EC2 ตามเวลาที่กำหนดในแต่ละวันหรือไม่? สิ่งนี้สามารถช่วยฉันประหยัดเงินได้มากสำหรับการพัฒนาและทดสอบเซิร์ฟเวอร์ของฉัน

คำตอบ:


16

ปรับปรุง

AWS ได้เปิดตัวเครื่องมือที่เรียกว่า " Instance Scheduler " รวมถึงคู่มือการกำหนดค่าแบบเต็มซึ่งเชื่อมโยงจากหน้านั้น ดูเหมือนว่าเป็นการปรับปรุงของตัวกำหนดตารางเวลา EC2 ที่ฉันอธิบายด้านล่างพร้อมกับคุณสมบัติเพิ่มเติมไม่กี่อย่าง

คำแนะนำด้านล่างจะยังคงใช้งานได้ แต่น่าจะดีกว่าถ้าดูตัวกำหนดตารางเวลาอินสแตนซ์สำหรับการติดตั้งใหม่

โพสต์ต้นฉบับ

AWS มีเครื่องมือที่ชื่อว่าEC2 Schedulerที่ให้คุณควบคุมการเริ่มและหยุดอินสแตนซ์ EC2 ได้อย่างยืดหยุ่น

เครื่องมือช่วยให้คุณกำหนดเวลาเริ่มและหยุดเริ่มต้นเมื่อคุณตั้งค่าเครื่องมือซึ่งคุณสามารถเปลี่ยนได้ในภายหลัง คุณสามารถเลือกอินสแตนซ์ที่ได้รับการควบคุมคุณและคุณสามารถระบุเวลาเริ่มต้นและหยุดที่แตกต่างกันสำหรับแต่ละอินสแตนซ์โดยใช้แท็ก

แม้ว่ามันจะเป็นเครื่องมือที่ยอดเยี่ยม แต่เอกสารนั้นค่อนข้างคลุมเครือและสับสน มันเหมือนกับเอกสารที่เขียนขึ้นโดยวิศวกรผู้เขียนเครื่องมือและรู้ทุกอย่างเกี่ยวกับมันมากกว่านักเขียนทางเทคนิค

หมายเหตุ : หากคุณมีข้อเสนอแนะหรือความคิดเห็นการแก้ไขความชื่นชม หากคุณมีคำถามตามนี้โปรดเริ่มคำถามของคุณเอง

EC2 Scheduler คืออะไร

เครื่องมือนี้เป็นฟังก์ชั่นแลมบ์ดาที่ทำงานกับ Cloudwatch Events และ DynamoDB มันถูกปรับใช้โดยใช้แม่แบบ Cloudformation ซึ่งตั้งค่าบทบาทและนโยบายของ IAM ที่จำเป็นด้วย คุณสามารถอ่านเกี่ยวกับสถาปัตยกรรมที่นี่

สถาปัตยกรรมกำหนดการ AWS EC2

การปรับใช้

เริ่มต้นโดยไปที่หน้านี้และคลิก "เรียกใช้งานโซลูชัน" ตอนนี้ลิงค์โดยตรงอยู่ที่นี่แต่มันอาจเปลี่ยนแปลงได้

เลือกภูมิภาคที่คุณต้องการใช้ทรัพยากรที่ด้านบนของคอนโซล สคริปต์ควบคุมอินสแตนซ์ EC2 ในภูมิภาคใด ๆ แต่จะทำงานในภูมิภาคเดียว

การติดแท็กอินสแตนซ์ EC2

สิ่งนี้ครอบคลุมในเอกสารที่นี่แต่มันไม่ง่ายอย่างที่ควรเป็น

คุณสามารถควบคุมอินสแตนซ์ที่จะเริ่มและหยุดโดยการแท็กอินสแตนซ์ของคุณ

กรณีที่ง่ายที่สุดกำหนดให้คุณแท็กอินสแตนซ์ EC2 แต่ละรายการที่คุณต้องการเริ่มต้นและหยุดทำงานตามกำหนดเวลา ในการทำเช่นนี้ค้นหาอินสแตนซ์ EC2 ของคุณในคอนโซลคลิกแท็กและสร้างแท็กนี้

การติดแท็กอินสแตนซ์ EC2 สำหรับตัวกำหนดตารางเวลา

วิธีเปิดใช้งานการคัดลอกและวาง:

  • คีย์: ตัวกำหนดตารางเวลา: ec2-startstop
  • ค่า: จริง

หากคุณต้องการให้อินสแตนซ์ที่เฉพาะเจาะจงเริ่มต้นและหยุดทำงานตามกำหนดเวลาที่แตกต่างกันคุณผนวกข้อมูลเพิ่มเติมเข้ากับคีย์แท็กและค่า ตัวอย่างเช่นหากคุณต้องการให้อินสแตนซ์เริ่มต้นที่ 1500 UTC และหยุดเวลา 2400 UTC ในวันอังคารวันพฤหัสบดีและวันศุกร์ให้คุณป้อนข้อมูลต่อไปนี้

รหัส: ตัวกำหนดตารางเวลา: ec2-startstop: ล่าช้าค่า: 1500; 2400; utc; tue, thu, fri

โปรดทราบว่าคำว่า "ล่าช้า" อาจเป็นสตริงใดก็ได้ "ล่าช้า" ไม่มีความหมายพิเศษ

คุณสามารถแปลง UTC เป็นเวลาท้องถิ่นของคุณโดยใช้เครื่องมือนี้

คุณสามารถใช้ตัวแก้ไขแท็กเพื่ออินสแตนซ์แท็กจำนวนมาก ซึ่งอาจช่วยให้คุณตั้งค่าการแท็กจำนวนมากได้ง่ายขึ้นซึ่งอาจเป็นประโยชน์สำหรับการตั้งค่าที่แตกต่างกันสำหรับการทดสอบและการผลิต ฉันสงสัยว่าคุณจะใช้มันเพื่อการผลิต

พารามิเตอร์ของ CloudFormation

เมื่อคุณเรียกใช้เทมเพลต CloudFormation คุณจะต้องป้อนพารามิเตอร์จำนวนมาก ส่วนใหญ่คุณสามารถออกจากที่เริ่มต้น นี่คือพารามิเตอร์ที่สำคัญที่สุด

  • ชื่อสแต็ค: เรียกมันว่าอะไรก็ได้ที่คุณชอบ มันเป็นสิ่งที่เรียกว่าใน CloudFormation
  • ชื่อแท็กที่กำหนดเอง: นี่คือ "คีย์" ของแท็กที่คุณใส่กับอินสแตนซ์ EC2 ปล่อยให้มันเป็นค่าเริ่มต้นเว้นแต่คุณจะมีเหตุผลที่ดีหรือต้องการติดตั้งหลาย ๆ
  • เวลาเริ่มต้น / หยุดเริ่มต้น: เวลา UTC เริ่มต้นเพื่อเริ่มและหยุดอินสแตนซ์
  • DynamoDB: การตั้งค่าจะถูกเก็บไว้ใน DynamoDB คุณสามารถเปลี่ยนชื่อตารางและเช่น เนื่องจากระดับฟรีของ DynamoDB นั้นไม่หมดอายุคนส่วนใหญ่จึงไม่น่าจะถูกเรียกเก็บเงิน
  • (หน้าจอที่สอง) การอนุญาต - นี่คือปลาชนิดหนึ่งสีแดงดูส่วนด้านล่าง ปล่อยให้เป็นค่าเริ่มต้นและใช้งานเป็นผู้ดูแลระบบเมื่อคุณพยายามตั้งค่า EC2 Scheduler
  • ตัวเลือกการแจ้งเตือน: ฉันพบว่ามีประโยชน์ในการตั้งค่าการแจ้งเตือน SNS ดังนั้นฉันจึงสามารถตรวจสอบได้ว่ามันใช้งานได้ ฉันไม่ได้ใช้เวลาในการหาวิธีปิดการใช้งานฉันเพิ่งลบมันไปที่เทมเพลต 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"
    }
  ]
}

อเมซอนได้เปลี่ยนสิ่งต่าง ๆ - "ตัวกำหนดตารางเวลา EC2 ถูกแทนที่โดย AWS Instance Scheduler"
Max Barraclough

ขอบคุณสูงสุดฉันได้อัปเดตคำตอบเพื่อรวมลิงก์แล้ว มันมาพร้อมกับคู่มือการใช้งานอย่างสมบูรณ์ดังนั้นฉันไม่คิดว่าฉันต้องให้คำแนะนำแบบเต็ม
ทิม

1
ไม่น่าเชื่อว่าพวกเขาต้องการทำให้สิ่งต่าง ๆ ซับซ้อน ...
เมห์ดี้

10

หากคุณเพียงแค่ต้องการเริ่มและหยุดอินสแตนซ์นี่เป็นอีกสิ่งที่ต้องทำซึ่งใช้ประโยชน์จากบริการของแลมบ์ดา จะถือว่าคุณต้องการควบคุมรหัสอินสแตนซ์ที่เฉพาะเจาะจง คุณสามารถควบคุมได้หลายอินสแตนซ์โดยเพิ่มรหัสเพิ่มเติมคั่นด้วยเครื่องหมายจุลภาค (เช่น: 'i-3453453', 'i-45656745') คุณสามารถค้นหา id ของอินสแตนซ์ของคุณได้ในส่วนอินสแตนซ์คอนโซล AWS

ในคอนโซลแลมบ์ดา

  1. เปิดคอนโซล AWS Lambda แล้วเลือกสร้างฟังก์ชั่น
  2. เลือกผู้แต่งตั้งแต่เริ่มต้น
  3. ป้อนชื่อสำหรับฟังก์ชันของคุณเช่น "StopEC2Instance"
  4. สำหรับ Runtime เลือก Python 2.7
  5. ขยายเมนูดร็อปดาวน์บทบาทและเลือกสร้างบทบาทที่กำหนดเอง นี่เป็นการเปิดแท็บหรือหน้าต่างใหม่ในเบราว์เซอร์ของคุณ
  6. ในเมนูดร็อปดาวน์ IAM บทบาทเลือกสร้างบทบาท IAM ใหม่และป้อนชื่อบทบาทเช่น "lambda_start_stop_ec2"
  7. เลือกเอกสารนโยบายมุมมองแก้ไขแล้วเลือกตกลงเมื่อได้รับแจ้งให้อ่านเอกสาร แทนที่ข้อความทั้งหมดในนโยบายด้วยสิ่งนี้:

รหัสด้านล่าง

{
  "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": "*"
    }
  ]
}
  1. เลือกอนุญาตเพื่อสร้างบทบาทให้เสร็จและกลับไปที่คอนโซล AWS Lambda
  2. หากต้องการหยุดอินสแตนซ์ของคุณให้แทนที่ข้อความทั้งหมดในตัวแก้ไขโค้ดฟังก์ชันด้วยสิ่งต่อไปนี้:

รหัสด้านล่าง

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)

อย่าลืมแทนที่ค่าภูมิภาคและอินสแตนซ์ด้วยตัวคุณเอง

  1. จากเมนูแบบเลื่อนลง Runtime เลือก Python2.7
  2. ในการตั้งค่าพื้นฐานให้ป้อน 10 วินาทีสำหรับการหมดเวลาของฟังก์ชัน
  3. เลือกเก็บบันทึก
  4. ทำซ้ำขั้นตอนทั้งหมดเพื่อสร้างฟังก์ชั่นอื่นที่จะเริ่มต้นอินสแตนซ์ของคุณ แต่ใช้สคริปต์ python นี้เพื่อเริ่มต้นทั้งหมด:

รหัสด้านล่าง

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 ที่จะเรียกใช้ฟังก์ชันแลมบ์ดาของคุณในเวลากลางคืน

  1. เปิดคอนโซล Amazon CloudWatch
  2. เลือกกิจกรรมแล้วเลือกสร้างกฎ
  3. เลือกกำหนดเวลาภายใต้แหล่งที่มาของเหตุการณ์
  4. ป้อนช่วงเวลาหรือนิพจน์ cron ที่บอก Lambda เมื่อใดให้หยุดอินสแตนซ์ของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ที่ถูกต้องให้ดูกำหนดเวลานิพจน์ไวยากรณ์สำหรับกฎ

หมายเหตุ: นิพจน์ Cron ถูกประเมินเป็น UTC ให้แน่ใจว่าได้ปรับการแสดงออกสำหรับโซนเวลาที่คุณต้องการ นี่คือตัวอย่างที่จะเรียกใช้ฟังก์ชันทุกวันเวลา 08:00 GMT / UTC):

0 08 * * ? *
  1. เลือกเพิ่มเป้าหมายแล้วเลือกฟังก์ชั่นแลมบ์ดา
  2. สำหรับฟังก์ชั่นเลือกฟังก์ชั่นแลมบ์ดาที่หยุดอินสแตนซ์ของคุณ
  3. เลือกกำหนดค่ารายละเอียด
  4. ป้อนข้อมูลต่อไปนี้ในฟิลด์ที่ให้ไว้: สำหรับชื่อให้ป้อนชื่อที่มีความหมายเช่น "StopEC2Instance" สำหรับคำอธิบายให้เพิ่มคำอธิบายที่มีความหมายเช่น "หยุด EC2 อินสแตนซ์ทุกวันในเวลากลางคืน" สำหรับรัฐให้เลือกเปิดใช้งาน
  5. เลือกสร้างกฎ

หากต้องการเริ่มต้นอินสแตนซ์ใหม่ในตอนเช้าทำซ้ำขั้นตอนเหล่านี้และใช้เวลาเริ่มต้นที่คุณต้องการ หากคุณต้องการส่งข้อความเมลทุกครั้งที่ฟังก์ชั่นล้มเหลวคุณสามารถตั้งค่าหัวข้อ SNS และกำหนดค่าการส่งข้อความนั้นภายใต้การดีบักในหน้าต่างการสร้างฟังก์ชั่น Lmbda

แหล่งที่มาของทั้งหมดนี้สามารถพบได้ที่นี่: เอกสาร AWS


คุณจะได้รหัส Python ในโลกนี้ได้ดีแค่ไหนในตัวแก้ไขอย่างที่มันปรากฏออกมาตอนนี้?
netfed

คลิกที่ความช่วยเหลือ '?' และคุณจะพบข้อมูลเพิ่มเติมเกี่ยวกับการใช้การจัดรูปแบบเครื่องหมาย serverfault.com/editing-help
jscott

1
มันเป็นข้อผิดพลาดในรหัสการจัดรูปแบบ คุณต้องใส่ข้อความธรรมดาระหว่างการจัดรูปแบบที่แตกต่างกัน - ในกรณีนี้บล็อครหัสและบล็อกที่มีหมายเลข นั่นเป็นเหตุผลที่ฉันใส่ "โค้ดด้านล่าง" ใน - ไม่สมเหตุสมผลในทุกที่ แต่ใช้งานได้
ทิม

@Tim ขอบคุณสำหรับการชี้แจง ผมไม่ทราบว่า. มันแก้ไขการจัดรูปแบบของนิพจน์ cron ด้วย ขอบคุณอีกครั้ง.
netfed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.