Tự động bật/tắt EC2 instance vào thứ hai đầu tiên của tháng
Bài toán:
Tôi muốn cho tự động khởi động lại EC2 instance mỗi tháng một lần vào 8h sáng thứ hai đầu tiên của tháng (giờ JST) => sử dụng AWS event rule để trigger SSM Runbook bật tắt instance!
Vấn đề:
Bạn có thể define cron sau trên AWS EventBridge rule:
Cron(00 08 * * 2#1 *)
Tuy nhiên, giờ bạn lại muốn nó theo giờ JST (UTC+9) cơ, bạn có thể làm như sau:
Cron(00 23 * * 1#1 *)
Nhưng vấn đề là sẽ có TH giả sử như ngày thứ hai đầu tiên của tháng lại là ngày mùng 1 chẳng hạn, thì cron của bạn sẽ trigger Lambda vào thứ 2 thứ hai của tháng, không phải thứ hai đầu tiên (do chênh lệch múi giờ đó :3 8h ngày hôm sau của JST thì mới là 23 giờ ngày hôm trước theo giờ UTC thôi)
Để sử dụng event cron theo giờ JST, bạn có thể kết hợp với Lambda để đánh giá thời gian, rồi trigger target dựa trên kết quả đánh giá của Lamba.
VD, trong trường hợp này:
Tại EventBridge, configure để cron run Lambda Function vào 23h00 UTC (8h00 JST) của các ngày 28, 29, 30, 31, 1, 2, 3, 4, 5, 6 trong tháng (nghĩ cron cho cái này cũng mệt phết nhỉ). Để xác định chính xác ngày mùng 1 của tháng ở Timezone JST, cần run vào các ngày mà có thể là ngày cuối tháng ở Timezone UTC (28, 29, 30, 31).
Tại Lambda Function, viết code check xem ngày hiện tại có phải là ngày thứ 2 đầu tiên trong tháng ở Timezone JST không. Nếu là ngày thứ 2 đầu tiên thì sẽ call API để run SSM Automation Runbook, nếu không phải thì thôi
Tham khảo:
[AWS Lambda を毎月 1 日の 00:00 (JST) に実行する]
https://michimani.net/post/aws-run-lambda-at-1st-day-of-month/
Tuy nhiên, như bạn đã thấy, cách làm trên rất phức tạp, vì chúng ta không biết được ngày cuối cùng của tháng là 28,29,30 hay 31 cũng như không biết được trong 7 ngày đầu tháng hôm nào là thứ hai => phải run các ngày 28-31 xác định được ngày cuối tháng và đầu tháng, rồi lại run từ 1-6 để check phải thứ hai không :3 (Mình ngu toán nên mới hình dung qua qua vậy, còn không rõ có cái cách nào check ngon gọn hơn không, bạn feedback cho mình nếu bạn có cách ngon hơn nhé!)
=> Cách đơn giản hơn cho bạn (mình học lỏm được): Hãy sử dụng Maintenance Window của Systems Manager (SSM), cái thằng này nó được tạo ra để dùng với Automation runbook, mà tiện cái là nó cho customize thời gian theo timezone!
Tại Maintenance Windows, configure Schedule theo timezone Asia/Tokyo (JST) để run SSM Automation task. Cách làm:
Step 1: Tạo Maintenance Windows theo [1]
Step 2: Tại Maintenance Windows đã tạo tại Step 1, tạo Automation Task theo [2].
Tuy không giống hoàn toàn với usecase, nhưng bạn có thể tham khảo các step làm tại blog [3] để có cái nhìn trực quan (ý là có ảnh :v )
Lưu ý:
Với Automation Runbook như là AWS-StartEC2Instance/AWS-StopEC2Instance nếu làm như dưới đây thì sẽ không cần phải tạo Target group:
- tại Target, chọn 「Task target not required」
- tại Input parameters, chỉ định EC2 InstanceID.
Tài liệu tham khảo:
[1] https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-maintenance-create-mw.html
[2] https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-mw-target.html
[3][待望の機能!AWS Systems Manager Change Calendar でより柔軟な定期処理実行が可能に!! | Maintenace Window 作成]
https://dev.classmethod.jp/articles/systems-manager-change-calendar-release/#toc-12