stop/start RDS instance และ Aurora cluster แบบอัตโนมัติได้ง่าย ๆ ด้วย Amazon EventBridge Scheduler
ลืม stop RDS database...
ทุกท่านเคยลืม stop RDS database กันบ้างไหมครับ ส่วนตัวผมเคยอยู่นับครั้งไม่ถ้วนเลยครับ
และเนื่องจากค่าบริการของ RDS ค่อนข้างแพง พอลืม stop database แต่ละครั้งก็จะเจ็บหนักเอาเรื่องเลยครับ
อีกทั้งใน User Guide ก็มีเขียนไว้ครับว่าต่อให้เรา stop RDS instance ไปแล้ว แต่หลังจากผ่านไป 7 วันมันก็จะกลับมา start ใหม่เองอยู่ดี
If you don't manually start your DB instance after it is stopped for seven consecutive days, RDS automatically starts your DB instance for you.
เพราะฉะนั้นในบทความนี้ ผมจะมาสาธิตการใช้ Amazon EventBridge Scheduler สำหรับ stop database นานกว่า 7 วัน และถือโอกาสลอง start database ด้วยเลยครับ
สำหรับรายละเอียดของ Amazon EventBridge Scheduler สามารถดูได้จากบทความนี้ครับ
[ฟีเจอร์ใหม่]เปิดตัว Amazon EventBridge Scheduler ที่สามารถ schedule โดยระบุ Timezone ได้
ภาพโครงสร้างโดยรวม
นี่คือภาพโครงสร้างของสิ่งที่เราจะทำกันในครั้งนี้ เรียบง่ายแต่ได้ผลครับ
อธิบายคร่าว ๆ ก็คือ เราจะตั้งค่าให้ EventBridge Scheduler ทำการ stop database ซ้ำทุก ๆ 7 วัน นั่นหมายความว่าเมื่อ database ของเราเกิด start ขึ้นมาเองหลังจากผ่านมา 7 วัน EventBridge Scheduler ก็จะทำการ stop ซ้ำให้เราครับ
เตรียมตัวก่อนเริ่ม
1. สร้าง IAM policy ที่จำเป็น
ในบทความนี้ผมจะใช้ EventBridge Scheduler ทำการ stop/start ทั้ง RDS/Aurora Instance, และ Aurora Serverless V2 Cluster ครับ ซึ่ง policy ที่จำเป็นจะแตกต่างกันขึ้นอยู่กับประเภทของ database ว่าเป็น instance หรือ cluster
สำหรับท่านที่จะทำตามบทความนี้ อย่าลืมสร้าง policy ที่ตรงกับประเภทของ database ด้วยนะครับ
ก่อนอื่นไปที่หน้า console ของ IAM เลือกเมนู Policies
ที่แถบด้านซ้ายแล้วคลิก Create Policy
ที่หน้า Specify permissions ให้สลับโหมดของ policy editor เป็น JSON จากนั้นลบทุกอย่างใน policy editor ออกให้หมดแล้วใส่ policy ด้านล่างนี้ลงไปแทน (เลือก policy ให้ตรงกับประเภทของ database) จากนั้นคลิก Next
กรณีที่ประเภทของ database เป็น RDS และ Aurora ให้ใช้ policy นี้
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StopAndStartRDSInstance",
"Effect": "Allow",
"Action": [
"rds:StopDBInstance",
"rds:StartDBInstance"
],
"Resource": "*"
}
]
}
กรณีที่ประเภทของ database เป็น Aurora Serverless V2 ให้ใช้ policy นี้
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StopAndStartAuroraCluster",
"Effect": "Allow",
"Action": [
"rds:StopDBCluster",
"rds:StartDBCluster"
],
"Resource": "*"
}
]
}
ที่หน้า Review and create ให้ตั้งชื่อ policy ตามใจชอบ จากนั้นเลื่อนลงมาด้านล่างสุดแล้วคลิก Create policy
เนื่องจากในครั้งนี้ผมจะลองทำทั้ง RDS และ Aurora serverless ผมเลยสร้าง policy ไว้ 2 อันเลยครับ
2. สร้าง IAM role ที่จำเป็น
กลับมาที่หน้า console ของ IAM เลือกเมนู Roles
ที่แถบด้านซ้ายแล้วคลิก Create Role
ที่หน้า Select trusted entity ในส่วน Trusted entity type ให้เลือก Custom trust policy
และในส่วน Custom trust policy ให้ลบ policy ออกให้หมดแล้ว policy ด้านล่างนี้ลงไปแทน (policy นี้เหมือนกันหมดไม่ว่าจะใช้ database ประเภทอะไรก็ตาม เพราะฉะนั้นใส่ได้เลยไม่ต้องกังวลครับ)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ที่หน้า Add permissions ในส่วนของ Permissions policies ให้เลือก policy ที่เราสร้างไว้ในขั้นตอนก่อนหน้า จากนั้นคลิก Next
ที่หน้า Name, review, and create ให้ตั้งชื่อ role ตามใจชอบ จากนั้นเลื่อนลงมาด้านล่างแล้วคลิก Create role
และเหมือนเดิมครับ เนื่องจากในครั้งนี้ผมจะลองทำทั้ง RDS และ Aurora serverless ผมเลยสร้าง role ไว้ 2 อันเช่นกัน
RDS & Aurora
เนื่องจากทั้ง RDS และ Aurora (ที่ไม่ใช่ serverless) นั้น มีขั้นตอนการทำเหมือนกันเป๊ะ ๆ ครั้งนี้ผมเลยจะสาธิตแค่ครั้งเดียวโดยใช้ RDS ครับ
ก่อนอื่นเราก็ต้องมี database ที่อยากจะ stop/start ก่อน ซึ่งในครั้งนี้ผมได้เปิดใช้งาน database ชื่อ [my-rds-database] เตรียมเอาไว้ครับ
สำหรับวิธีการสร้าง RDS/Aurora instance สามารถดูได้ที่บทความนี้ครับ
Stop Instance
ไปที่หน้า console ของ EventBridge เลือกเมนู Schedules
ที่แถบด้านซ้ายแล้วคลิก Create schedule
ที่หน้า Specify schedule detail ในส่วนของ Schedule name and description ให้เราตั้งชื่อ schedule ตามใจชอบ
จากนั้นในส่วนของ Schedule pattern เราสามารถเลือกได้ว่าจะให้ schedule นี้ทำงานแค่ครั้งเดียว หรือทำงานแบบต่อเนื่องตามที่เรากำหนดไว้ (เช่น ทุกวัน, ทุกชั่วโมง, ฯลฯ)
ในการสาธิตครั้งนี้ผมเลือกแบบ cron-based schedule และตั้งค่าให้ schedule ทำงานทุก ๆ วันที่เวลา 12:35 น. โดยจะสังเกตได้จาก Next 10 trigger dates ที่จะบอกรายละเอียดว่า schedule นี้จะทำงานครั้งต่อ ๆ ไปที่วันไหนเวลาไหน
สำหรับรายละเอียดเกี่ยวกับ cron expression สามารถดูได้ที่ Cron expressions reference - Amazon EventBridge
แต่ถ้าเราต้องการให้ schedule นี้ทำงานทุก ๆ 7 วัน ผมสามารถเลือก rate-based schedule ตั้งค่าให้ schedule ทำงานทุก ๆ 7 วันได้ครับ
หลังจากตั้งค่าในส่วนนี้เรียบร้อยแล้ว ให้กด Next
ในส่วนต่อมาเราจะเลือก API ที่จะให้ schedule นี้เรียกใช้เมื่อถึงเวลาที่เราตั้งไว้
ในส่วนของ Target API ให้เลือก All APIs
จากนั้นค้นหา Amazon RDS
ค้นหา StopDBInstance
แล้วเลือก API ตัวนั้นได้เลยครับ
เลื่อนลงมาด้านล่าง แล้วกรอกชื่อ RDS instance ที่ต้องการ stop ลงไป ซึ่งในครั้งนี้ก็คือ my-rds-database
จากนั้นคลิก Next
ในส่วนของ Action after schedule completion ส่วนนี้ให้เราตั้งค่าว่าหลังจากที่ schedule ทำงานเสร็จแล้ว (run schedule ครั้งสุดท้ายแล้ว) เราจะเอายังไงกับ schedule นี้ เราสามารถเลือกได้ระหว่าง NONE
คือ ไม่ทำอะไร และ DELETE
คือ ให้ลบ schedule นี้ทิ้ง
เนื่องจาก schedule นี้ทำงานแบบต่อเนื่อง นั่นหมายความว่าจะไม่มีการ run schedule ครั้งสุดท้ายสำหรับ schedule นี้ เพราะฉะนั้นจริง ๆ เราสามารถเลือกอะไรก็ได้ครับ แต่เราจะเลือก NONE
กันไว้ก่อนครับ
เลื่อนลงมาด้านล่าง ในส่วน Permission ให้เลือก Use existing role แล้วเลือก role ที่สร้างไว้ก่อนหน้านี้ จากนั้นคลิก Next
จากนั้นเรามาจะอยู่ที่หน้า Review and create schedule ให้เราตรวจสอบข้อมูลการตั้งค่าทั้งหมด หากมั่นใจว่าถูกต้องแล้วให้คลิก Create schedule
ได้เลยครับ
เมื่อสร้าง schedule แล้ว สิ่งที่เหลือก็แค่รอดูการทำงานของมันครับ ตอนนี้ RDS instance ของผมอยู่ในสถานะ Available หรือก็คือเปิดอยู่
หลังจากถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ stop RDS instance ตัวดังกล่าว และสถานะของ RDS instance ก็เปลี่ยนเป็น Stopping ตามที่คาดไว้
Start Instance
หลังจาก stop instance กันไปแล้ว คราวนี้เราจะมาลอง start instance กันบ้างครับ เนื่องจากขั้นตอนในส่วนนี้แทบจะเหมือนกับตอน stop instance เพราะฉะนั้นขอให้ดูในส่วนของ Stop Instance อ้างอิงด้วยนะครับ
การ start instance ให้เราทำเหมือนกับตอน stop instance ทุกอย่างจนกระทั่งถึงขั้นตอนการเลือก API ในครั้งนี้ให้เราเลือก StartDBInstance
แทน
จากนั้นเลื่อนลงมาด้านล่าง ก็ให้กรอกชื่อ RDS instance ที่ต้องการ stop ลงไปเหมือนเดิม ส่วนขั้นตอนที่เหลือจะเหมือนกับการ stop instance ทุกประการ ก็สามารถดูในส่วนของ Stop Instance แล้วทำตามได้เลยครับ
จากนั้นเราก็รอดูผลลัพธ์การทำงานของ schedule ของเรา จะเห็นได้ว่าตอนนี้ RDS instance ของผมอยู่ในสถานะ Stopped temporarily หรือก็คือถูกปิดอยู่
เมื่อถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ start RDS instance ตัวดังกล่าว และสถานะของ RDS instance ก็เปลี่ยนเป็น Starting ตามที่คาดไว้
Aurora Serverless V2
ที่จริงแล้วขั้นตอนการ stop/start DB cluster ด้วย scheduler แทบจะเหมือนกับการ stop/start DB instance ที่สาธิตไปด้านบนเลยครับ แตกต่างกันแค่ IAM role, IAM policy และ API ที่ใช้ แต่เพื่อไม่ให้สับสน ผมจะเริ่มใหม่ตั้งแต่ต้นเลยครับ
สำหรับท่านที่อ่านเนื้อหาในส่วน RDS & Aurora มาก่อน อาจจะรู้สึกว่าทั้งเนื้อหา ลำดับ การใช้คำพูดมันเหมือนกันทุกอย่าง ซึ่งใช่ครับ ผมแทบจะ copy-paste เนื้อหาจากในส่วนก่อนหน้ามาเลย เผื่อมีผู้อ่านบางท่านที่ข้ามเนื้อหาในส่วนก่อนหน้าทั้งหมดมาอ่านในส่วนนี้เลย ก็จะได้ไม่งง และไม่ต้องกลับไปอ่านเนื้อหาด้านบนทั้งหมดมาก่อนครับ
สำหรับ database ที่ผมจะใช้ในครั้งนี้ คือ Aurora serverless v2 cluster ที่ชื่อ my-aurora-serverless-v2-database
ซึ่งใน cluster มี DB instance อยู่ 1 ตัวครับ ชื่อ my-aurora-serverless-v2-database-instance-1
สำหรับวิธีการสร้าง Aurora Serverless cluster สามารถดูได้ที่บทความนี้ครับ
Stop Cluster
ไปที่หน้า console ของ EventBridge เลือกเมนู Schedules
ที่แถบด้านซ้ายแล้วคลิก Create schedule
ที่หน้า Specify schedule detail ในส่วนของ Schedule name and description ให้เราตั้งชื่อ schedule ตามใจชอบ
จากนั้นในส่วนของ Schedule pattern เราสามารถเลือกได้ว่าจะให้ schedule นี้ทำงานแค่ครั้งเดียว หรือทำงานแบบต่อเนื่องตามที่เรากำหนดไว้ (เช่น ทุกวัน, ทุกชั่วโมง, ฯลฯ)
ในการสาธิตครั้งนี้ผมเลือกแบบ cron-based schedule และตั้งค่าให้ schedule ทำงานทุก ๆ วันที่เวลา 12:00 น. โดยจะสังเกตได้จาก Next 10 trigger dates ที่จะบอกรายละเอียดว่า schedule นี้จะทำงานครั้งต่อ ๆ ไปที่วันไหนเวลาไหน
สำหรับรายละเอียดเกี่ยวกับ cron expression สามารถดูได้ที่ Cron expressions reference - Amazon EventBridge
แต่ถ้าเราต้องการให้ schedule นี้ทำงานทุก ๆ 7 วัน ผมสามารถเลือก rate-based schedule ตั้งค่าให้ schedule ทำงานทุก ๆ 7 วันได้ครับ
หลังจากตั้งค่าในส่วนนี้เรียบร้อยแล้ว ให้กด Next
ในส่วนต่อมาเราจะเลือก API ที่จะให้ schedule นี้เรียกใช้เมื่อถึงเวลาที่เราตั้งไว้
ในส่วนของ Target API ให้เลือก All APIs
จากนั้นค้นหา Amazon RDS
ค้นหา StopDBCluster
แล้วเลือก API ตัวนั้นได้เลยครับ
เลื่อนลงมาด้านล่าง แล้วกรอกชื่อ Aurora cluster ที่ต้องการ stop ลงไป ซึ่งในครั้งนี้ก็คือ my-aurora-serverless-v2-database
จากนั้นคลิก Next
ในส่วนของ Action after schedule completion ส่วนนี้ให้เราตั้งค่าว่าหลังจากที่ schedule ทำงานเสร็จแล้ว (run schedule ครั้งสุดท้ายแล้ว) เราจะเอายังไงกับ schedule นี้ เราสามารถเลือกได้ระหว่าง NONE
คือ ไม่ทำอะไร และ DELETE
คือ ให้ลบ schedule นี้ทิ้ง
เนื่องจาก schedule นี้ทำงานแบบต่อเนื่อง นั่นหมายความว่าจะไม่มีการ run schedule ครั้งสุดท้ายสำหรับ schedule นี้ เพราะฉะนั้นจริง ๆ เราสามารถเลือกอะไรก็ได้ครับ แต่เราจะเลือก NONE
กันไว้ก่อนครับ
เลื่อนลงมาด้านล่าง ในส่วน Permission ให้เลือก Use existing role แล้วเลือก role ที่สร้างไว้ก่อนหน้านี้ จากนั้นคลิก Next
จากนั้นเรามาจะอยู่ที่หน้า Review and create schedule ให้เราตรวจสอบข้อมูลการตั้งค่าทั้งหมด หากมั่นใจว่าถูกต้องแล้วให้คลิก Create schedule
ได้เลยครับ
เมื่อสร้าง schedule แล้ว สิ่งที่เหลือก็แค่รอดูการทำงานของมันครับ ตอนนี้ Aurora cluster ของผมอยู่ในสถานะ Available หรือก็คือเปิดอยู่
หลังจากถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ stop Aurora cluster ดังกล่าว และสถานะของ Aurora cluster รวมถึง instance ใน cluster ก็เปลี่ยนเป็น Stopping ตามที่คาดไว้
Start Cluster
เช่นเดียวกับตอน stop/start DB instance ครับ การ stop DB cluster และ start DB cluster แทบจะเหมือนกัน เพราะฉะนั้นรบกวนดูส่วนของการ Stop Cluster อ้างอิงด้วยนะครับ
การ start cluster ให้เราทำเหมือนกับตอน stop cluster ทุกอย่างจนกระทั่งถึงขั้นตอนการเลือก API ในครั้งนี้ให้เราเลือก StartDBCluster
แทน
จากนั้นเลื่อนลงมาด้านล่าง ก็ให้กรอกชื่อ Aurora cluster ที่ต้องการ stop ลงไปเหมือนเดิม ส่วนขั้นตอนที่เหลือจะเหมือนกับการ stop cluster ทุกประการ ก็สามารถดูในส่วนของ Stop Cluster แล้วทำตามได้เลยครับ
จากนั้นเราก็รอดูผลลัพธ์การทำงานของ schedule ของเรา จะเห็นได้ว่าตอนนี้ Aurora cluster ของผมอยู่ในสถานะ Stopped temporarily หรือก็คือถูกปิดอยู่
เมื่อถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ start Aurora instance ตัวดังกล่าว และสถานะของ Aurora instance รวมถึง instance ใน cluster ก็เปลี่ยนเป็น Starting ตามที่คาดไว้
สุดท้ายนี้
ในบทความนี้ผมก็ได้มาสาธิตการใช้ EventBridge Scheduler ในการ stop/start RDS database ครับ ซึ่งจริง ๆ แล้ว EventBridge Scheduler ยังมีความสามารถอื่น ๆ อีกมากมาย ซึ่งถ้ามีโอกาสผมจะมาเขียนบทความเพิ่มเติมเกี่ยวกับความสามารถอื่น ๆ ของ EventBridge Scheduler ต่อไปครับ