[AWS Technical Support Note] สามารถตั้งค่าการเปิดและปิด EC2 instance โดยอัตโนมัติได้หรือไม่

สามารถใช้ฟีเจอร์ Automation ของ Amazon Systems Manager ร่วมกับ CloudWatch Events เพื่อตั้งกำหนดการเปิดและปิดการทำงานอัตโนมัติได้

ปัญหาที่เกิดขึ้น

ใน 1 วันจะมีการเปิดใช้งาน EC2 instance เฉพาะในบางช่วงเวลาเท่านั้น ซึ่งค่อนข้างจะยุ่งยากที่ต้องเปิดปิดด้วยตัวเองทุกครั้งเลยอยากจะทำให้เป็นอัตโนมัติ

วิธีแก้ปัญหา

สามารถใช้ฟีเจอร์ Automation ของ Amazon Systems Manager ร่วมกับ CloudWatch Events เพื่อตั้งกำหนดการเปิดและปิดการทำงานอัตโนมัติได้

สร้าง IAM Role

สร้าง IAM Role สำหรับใช้ในการสร้าง CloudWatch Events โดย CloudWatch Events จะต้องได้รับสิทธิ์ในการเรียกใช้ SSM Start Automation Execution ด้วยเอกสารและพารามิเตอร์ Automation

ในครั้งนี้จะสร้าง Role ผ่าน console ของ IAM และตั้งชื่อ Role เป็น event-ssm-automation-role และแนบ policy AmazonSSMAutomationRole ลงใน IAM Role ตามที่แสดงทางด้านล่าง

เปิดแท็บ "Trust Relationships" เลือกที่ "Edit Trust policy" และแก้ไขตามรายละเอียดดังนี้

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

สร้าง CloudWatch Events

สร้าง Rules ของ CloudWatch Events เพื่อให้ EC2 instance ทำงานได้อัตโนมัติ จากนั้นคลิกปุ่ม "Create rule" จากเมนู Events ในหน้า console ของ CloudWatch

ตั้งค่าให้ EC2 instance เริ่มทำงานในเวลาที่กำหนดทุกวันด้วยการระบุด้วย cron
ตรวจสอบรายละเอียดเกี่ยวกับวิธีการระบุ cron ได้ทางด้านล่าง
Schedule Expressions for Rules - Amazon CloudWatch Events (English)

ในครั้งนี้จะระบุเป็น「30 05 * * ? *」หมายถึง การตั้งค่าการเกิด Events ในเวลา 05:30 (UTC) ของทุกวัน

จากนั้นกำหนด Target ที่ปุ่ม "Add target" และเลือกที่ "Use existing role" เพื่อเปลี่ยนเป็น Role ที่สร้างไว้ก่อนหน้านี้ (event-ssm-automation-role ) หลังจากตั้งค่าทั้งหมดแล้ว ให้คลิกปุ่ม "Configuration details"

ระบุชื่อ และ Description ของ rule แล้วคลิกที่ "Create rule"

จะแสดง rule ที่เราสร้างขึ้นมา

ด้วยขั้นตอนเดียวกันให้สร้าง CloudWatch Events rule เพื่อหยุดการทำงานของ EC2 instance โดยอัตโนมัติ
เลือกที่ Schedule และ ระบุ Cron เป็น 「45 05 * * ? *」เพื่อการตั้งค่าให้เกิด Events ในเวลา 05:45 (UTC) ของทุกวัน

ส่วน Target จะตั้งค่าตามด้านล่าง โดยนอกจากรายละเอียด Document ของ SSM Automation แล้ว การตั้งค่าที่เหลือจะเหมือนกันหมด หลังจากนั้น ให้คลิกปุ่ม "Configuration details"

ระบุชื่อ และ Description ของ rule แล้วคลิกที่ "Create rule"

เมื่อสร้างเสร็จจะมี rule เพิ่มขึ้นมา

ทดสอบการทำงาน

จะเริ่มตรวจสอบการเปิดทำงานอัตโนมัติก่อน โดยจะตั้งค่าให้ EC2 instance อยู่ในสถานะ Stopped

เมื่อถึงเวลาที่กำหนดสถานะของ EC2 instance จะเป็น "Running"

สามารถตรวจสอบได้ว่าการทำงานอัตโนมัติที่ตั้งไว้สำเร็จหรือไม่ ผ่านหน้า console ของ Amazon Systems Manager

จากนั้นเป็นการตรวจสอบการหยุดทำงานอัตโนมัติ เมื่อถึงเวลาที่กำหนดสถานะของ EC2 instance จะเป็น "Stopped"

และตรวจสอบการทำงานอัตโนมัติอีกครั้งผ่านหน้า console ของ Amazon Systems Manager

นอกจากนี้ เมื่อตรวจสอบประวัติ event ด้วย console ของ CloudTrail
StartInstance จะเป็นไปตามที่คาดไว้ แต่ StopInstance จะมีประวัติถูกบันทึกไว้ 2 ครั้ง เมื่อตรวจสอบเพิ่มเติมจะพบว่า StopInstance ในครั้งที่ 2 จะเป็น "force": true ซึ่งหมายถึงการบังคับหยุดการทำงาน

"requestParameters": {
    "instancesSet": {
        "items": [
            {
                "instanceId": "i-*******"
            }
        ]
    },
    "force": true
},

เมื่อตรวจสอบรายละเอียด document ของ SSM "AWS-StopEC2Instance" จะพบว่ามันถูกสร้างขึ้นเพื่อให้ทำ forceStopInstances หลังจาก StopInstances ตามปกติ

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

ขอแนะนำเครื่องมือฟรีสำหรับการเปิดและปิดการทำงาน EC2 โดยอัตโนมัติ

Automation ของ Systems Manager และ EventBridge เป็นบริการที่มีประโยชน์มากซึ่งจะช่วยให้เปิดใช้งาน EC2 ในเวลาที่กำหนดได้ในวันธรรมดา อย่างไรก็ตาม หากคุณมีความต้องการต่างๆดังต่อไปนี้ ให้ใช้ opswitch ซึ่งเป็นเครื่องมือสนับสนุนการดำเนินการกับ AWS ของทางบริษัท

  • เมื่อ EC2 เริ่มทำงาน หากเกิดข้อผิดพลาด Insufficient Instance Capacity ก็อยากเปิดใช้งานด้วย instance type อื่น
  • ตั้งค่าไม่ให้ EC2 instance ทำงานในวันหยุด
  • ต้องการกำหนดวันหยุดบริษัทล่วงหน้าเพื่อไม่ให้ EC2 เริ่มทำงาน (ในกรณีของ EventBridge จำเป็นต้องปิดการใช้งาน rule ทุกครั้ง)
  • ต้องการเปิดและปิด EC2 และ RDS หลายๆรายการพร้อมกัน
  • ต้องการให้แจ้งผลลัพธ์ไปยัง Slack โดยไม่ต้องตั้งค่าซับซ้อน
  • ต้องการตรวจสอบว่ามีทรัพยากรใดบ้างที่ลืมหยุดการทำงาน

วิดีโอแนะนำฟังก์ชั่นของ opswitch (Japanese)

รายละเอียด URL ของ opswitch อยู่ทางด้านล่าง สามารถลงทะเบียนได้โดยคลิกที่ปุ่ม "opswitchをはじめる"

AWSの定型作業スケジュール実行サービス・opswitch(オプスウィッチ)by クラスメソッド (Japanese)

ทางด้านล่างนี้เป็นลิงค์ไปยังคู่มือผู้ใช้

ユーザーガイド opswitchを開始する (Japanese)

บทความอ้างอิง

บทความต้นฉบับ