Contents
Giới thiệu
Nhiều tổ chức (đặc biệt trong giáo dục và phát triển phần mềm) gặp phải chi phí bất ngờ tăng cao khi để EC2 chạy liên tục ngoài giờ làm việc. Ví dụ, một instance cho phát triển chạy 24/7 trong 1 tháng là ~730 giờ, trong khi nếu chỉ hoạt động 8 giờ/ngày, 5 ngày/tuần thì chỉ ~220 giờ ( giảm 30% thời gian). Việc tắt EC2 ngoài giờ (vào ban đêm và cuối tuần) có thể cắt giảm tới ~65% hoá đơn EC2. Vì vậy, tự động Shutdown EC2 mỗi đêm là cách hiệu quả để tiết kiệm chi phí và tăng bảo mật. Bài viết này hướng dẫn từng bước cách bạn thiết lập giải pháp: tạo IAM Role phù hợp, đặt EventBridge Scheduler với cron, kiểm thử, và áp dụng các best practices về bảo mật.
Tại sao cần tự động tắt EC2?
Nhiều tổ chức (như trường học hay dev team) thường để các EC2 chạy 24/7 ngoài giờ làm việc, dẫn tới lãng phí tài nguyên và tiền bạc. Theo kinh nghiệm của mình, việc tắt EC2 ban đêm và cuối tuần có thể giảm khoảng 65% hoá đơn EC2. Đơn cử, một instance chạy 730 giờ/tháng (24/7) nhưng nếu chỉ chạy 220 giờ (10h/ngày, 5 ngày/tuần) sẽ tiết kiệm ~65% chi phí. Do đó, tự động stop EC2 ngoài giờ hoạt động là cơ hội lớn để tiết kiệm chi phí và tăng an toàn (giảm bề mặt tấn công khi không dùng). AWS cũng khuyến nghị nhiều cơ chế tự động shutdown EC2 để tối hóa ưu chi phí và tuân thủ best practices.
Kiến trúc giải pháp
Amazon EventBridge Scheduler là một dịch vụ serverless, được quản lý tập trung cho phép tạo và quản lý các tác vụ theo lịch biểu ở quy mô lớn. Giải pháp của chúng ta đơn giản gồm 3 thành phần chính:
- EventBridge Scheduler (lịch theo định kỳ): Đặt lịch (cron) để gọi API StopInstances vào giờ cố định mỗi đêm (ví dụ 22:00).
- IAM Role: Một IAM Role chỉ định amazonaws.com là principal (trust) và gán quyền stop EC2 (AmazonEC2FullAccess hoặc policy giới hạn). Scheduler sẽ assume role này để thực thi lệnh.
- EC2 Instances: Các máy chủ EC2 cần tắt. Bạn nên gắn tag (ví dụ AutoShutdown=true) để quản lý theo nhóm.

Hình 1: Kiến trúc giải pháp – EventBridge Scheduler dùng IAM Role để gọi API StopInstances, tự động stop EC2.
Các bước thực hiện
Giả sử bạn có một EC2 instance cần phải tắt hàng đêm, vậy từ AWS EC2 Console> Copy Instance ID của EC2 này và lưu lại như hình dưới:

Tạo một EventBridge Schedule
1. Sử dụng thanh tìm kiếm ở trên cùng để tìm dịch vụ Amazon EventBridge >Click Amazon EventBridge:

2. Từ menu bên trái, chọn Schedules> Click Create schedule:

3. Trong màn hình Create schedule, hãy cấu hình như sau:
- Schedule name: Đặt tên là 11PMshutdownDevSvr01
- Schedule pattern > Occurrence: Select Recurring schedule.
- Schedule pattern > Cron expression: Nhập 0 23 * * ? *
Để thử nghiệm và có thể kiểm tra lại sau này, bạn có thể nhập thời gian gần với thời điểm bạn thực hiện thử nghiệm này ngay bây giờ hoặc khoảng thời gian tiếp theo mà bạn muốn. Bạn có thể copy và dán biểu thức trên vào các trường văn bản riêng biệt ở đây, nhưng phần sau đây sẽ chỉ ra rõ hơn những gì được nhập cho việc cấu hình.
- Minutes: 0
- Hours: 23
- Day of month: *
- Month: *
- Day of the week: ?
- Year: *
Biểu thức Cron trên thiết lập thời gian kích hoạt vào lúc 11:00 PM (23:00) mỗi ngày trong mỗi tháng (và mỗi năm).
Ở mục tiếp theo của trang này là mục Flexible time window: Chọn 5 minutes.

4. Sau khi đã thực hiện xong các bước trên, cuộn xuống dưới cùng của trang và Click Next để tiếp tục.
5. Trong màn hình Select target> Trong mục Target API: Chọn All APIs> Trong ô tìm kiếm, nhập EC2 và click Amazon EC2> Cuộn xuống cuối trang Click Next:

6. Trong trường tìm kiếm API, nhập StopInstances và chọn Amazon EC2 StopInstances:

7. Trong phần Input (trình chỉnh sửa JSON), hãy thay thế phần MyData bằng ID phiên bản mà bạn đã copy trước đó, đảm bảo nó vẫn nằm trong dấu ngoặc kép.
EC2 Instance ID Của bạn có thể khác, nhưng ví dụ, dòng đó trong JSON sẽ trông tương tự như “i-01157205370e7dc87”.

8. Cuộn xuống dưới cùng của trang và Click Next để tiếp tục.
9. Trên trang Cài đặt, đặt mục Action after schedule completion thành NONE, và cuộn xuống phần cấu hình Permissions.
Bây giờ bạn sẽ thiết lập IAM Role, việc này sẽ được thực hiện trong phần tiếp theo.
Cấu hình Permissions (IAM Role)
1. Trong mục Permissions, Click vào nút Go to IAM console. Thao tác này sẽ mở một tab trình duyệt mới. Hãy giữ tab trình duyệt EventBridge mở, vì bạn sẽ quay lại tab này ngay sau đó.

2. Tại trang IAM Roles, click vào Create role.
3. Trong Trusted entity type, chọn Custom trust policy.
4. Trong Custom trust policy JSON của Chính sách tin cậy tùy chỉnh, ghi đè dòng Principal bằng đoạn code sau:
“Principal”: { “Service”: “scheduler.amazonaws.com” }, Điều này chỉ định EventBridge Scheduler và cho phép dịch vụ đó đảm nhận (assume) role mà bạn đang tạo.

5. Cuộn xuống dưới cùng của trang và Click Next để tiếp tục.
6. Trên trang Add permissions, trong mục Permissions policies, tìm kiếm AmazonEC2FullAccess>Chọn AmazonEC2FullAccess>Click Next.

Lưu ý: Trong môi trường chạy thật Production nên dùng policy tinh gọn hơn (chỉ cho phép ec2:StopInstances, ec2:DescribeInstances trên một resource cụ thể) để tuân thủ nguyên tắc least privilege.
7. Trong trang tiếp theo, đặt Tên Role trong trường Role name là: Stop-EC2
8. Cuộn xuống cuối trang và click Create role:

Hoàn thành cấu hình Schedule
1. Quay lại tab trình duyệt EventBridge > Ở cuối trang, click vào nút refresh (Nút này nằm bên trái nút “Go to IAM console” mà bạn đã click trước đó.)
2. Từ menu thả xuống bên trái nút refresh, chọn role mới được tạo có tên là Stop-EC2 đây sẽ là tùy chọn cuối cùng. Bạn cũng có thể tìm kiếm role này > Click Next để tiếp tục:

5. Xem lại chi tiết lịch trình ở trang cuối cùng, và ở phía dưới cùng, Click vào nút Create schedule để tạo lịch shutdown EC2.

Kiểm thử và hoàn tất
Nếu trước đó bạn đã đặt thời gian của Cron trong vòng vài phút nữa để stop EC2 của bạn, bạn có thể kiểm tra xem EC2 của mình đã tự động tắt chưa (Bạn cũng có thể quay lại và sửa đổi thời gian cho phù hợp, khoảng năm phút sau đó). Thực hiện các bước sau:
1. Quay lại dịch vụ EC2 và chọn Instances ở bên trái. Nếu tồn tại, hãy click vào dấu X của Instance state = running filter’s để xóa nó.
2. Chờ đến thời gian đã lên lịch tự động stop EC2 của bạn, cộng thêm khoảng một hoặc hai phút, có thể lên đến khoảng bảy phút. Bạn cần click vào nút “Refresh“, và thấy nó sẽ thay đổi trạng thái từ running sang stopping rồi stopped sau vài phút.
Nếu cần tự động khởi động lại EC2 của bạn vào sáng hôm sau, bạn có thể tạo lịch tương tự như các bước trên nhưng gọi API StartInstances.
Sau khi verify thành công, nhớ xoá lịch (trong EventBridge) nếu chỉ dùng để test. Đồng thời, kiểm tra logs trên CloudWatch (hoặc EventBridge Console) để đảm bảo không có lỗi khi kích hoạt.

So sánh: EventBridge Scheduler vs Lambda
| Tiêu chí | EventBridge Scheduler | Lambda (với EventBridge Rule) |
| Tổ chức | Cấu hình trực tiếp API StopInstances (không cần code). | Cần viết Lambda (Python/Node) để gọi StopInstances. |
| Độ phức tạp | Đơn giản, giao diện quản lý lịch trực quan. | Phức tạp hơn (deploy function, IAM role của Lambda, trigger rule). |
| Chi phí | Miễn phí 14 triệu sự kiện đầu mỗi tháng, sau đó \$1/million invocations; không có chi phí Lambda. | Lambda free tier ~1M invocations/tháng, sau đó tính theo thời gian chạy; thêm chi phí CloudWatch Events nhỏ. |
| Tính linh hoạt | Gọi được trực tiếp >200 AWS API (Stop, Start, Snapshot, v.v) mà không viết code. | Có thể thực hiện logic phức tạp (lọc tag, điều kiện, gửi thông báo, v.v.). |
| Khả năng mở rộng | Hỗ trợ lên lịch quy mô lớn, hàng triệu sự kiện, đáng tin cậy. | Mở rộng theo Lambda (có cold start, timeout). |
| Bảo mật | IAM Role rõ ràng (scheduler.amazonaws.com assume). | Cần cấp IAM Role cho Lambda (thường là dịch vụ lambda.amazonaws.com). |
| Trường hợp điển hình | Tắt theo lịch cố định cho nhóm instance (dev/test). | Khi cần lọc phức tạp: ví dụ chỉ tắt instance có tag AutoShutdown. |
Bình luận: Đối với kịch bản tắt EC2 theo giờ cố định, EventBridge Scheduler là giải pháp gọn nhẹ, chi phí rẻ hơn (không trả tiền thêm cho Lambda). Nếu cần chạy logic tùy chỉnh (tag, tính toán lịch), bạn có thể dùng thêm AWS Lambda. Tuy nhiên ở đây chúng ta ưu tiên EventBridge Scheduler để tận dụng lợi thế không cần code và chi phí invokes rẻ.
Best Practices (Bảo mật & FinOps)
- Tag tài nguyên hợp lý: Gắn tag cho EC2 instance cần quản lý (ví dụ AutoShutdown=true). Điều này giúp kiểm soát dễ hơn và phối hợp với các công cụ như AWS Instance Scheduler nếu mở rộng.
- Nguyên tắc tối thiểu: Cho role amazonaws.com chỉ quyền dừng và mô tả instance (ec2:StopInstances, ec2:DescribeInstances), thay vì full access. Ví dụ policy nhỏ gọn:
- {
“Statement”: [{
“Effect”: “Allow”,
“Action”: [“ec2:StopInstances”,”ec2:DescribeInstances”],
“Resource”: “*”
}]
} - Ghi log và cảnh báo: Kết hợp với CloudWatch Logs hoặc SNS để theo dõi khi lịch kích hoạt. Có thể tạo CloudWatch Alarm để gửi email/SMS khi có lỗi hoặc khi EC2 tắt thành công.
- Khởi động lại tự động (tuỳ chọn): Nếu cần, tạo thêm lịch EventBridge gọi API StartInstances vào buổi sáng để sẵn sàng làm việc.
- Điều chỉnh lịch chi tiết: Xác định rõ giờ làm việc thực tế (có thể khác nhau theo nhóm). Thí dụ, nếu giờ làm việc 8h-17h, bạn có thể tắt lúc 18h và mở lúc 7h sáng. Hỗ trợ timezone của EventBridge Scheduler giúp tự điều chỉnh theo DST.
- Tích hợp FinOps: Theo dõi chi phí trước/sau khi triển khai (bằng AWS Cost Explorer, Budgets). Xem xét dùng AWS Budget để cảnh báo chi phí EC2, hoặc sử dụng AWS Cost Anomaly Detection để phát hiện khác thường.
Ước tính tiết kiệm chi phí
Giả sử instance t3.large (2 vCPU, 8GB) có giá ~0.083 USD/giờ ở US East. Chạy 24/7 trong 1 tháng (730 giờ) tốn ~60.6 USD. Nếu chỉ chạy 8 giờ/ngày, 5 ngày/tuần (220 giờ), chi phí ~18.3 USD, tiết kiệm ~42 USD/tháng (tương đương ~70%). Với 10 instances tương tự, tiết kiệm ~420 USD mỗi tháng. Với instance lớn hơn hoặc số lượng EC2 nhiều, lợi ích càng rõ ràng cho công ty của bạn.
Có thể tính chung: Chi phí tiết kiệm = Giá_h * Số_giờ_tắt * Số_instance. Ví dụ: tắt 16 giờ/ngày (từ 18h đến 10h sáng) cho 1 instance t3.large tiết kiệm ~16 * 0.083 = 1.33 USD/ngày (~40 USD/tháng). Đây là các con số minh họa để thấy lợi ích của giải pháp này.
Checklist triển khai
- [ ] Xác định instance cần tắt: Liệt kê hoặc tag các EC2 target (ví dụ dùng tag AutoShutdown=true).
- [ ] Tạo IAM Role: Role cho phép amazonaws.com assume và quyền ec2:StopInstances.
- [ ] Cấu hình EventBridge Scheduler: Tạo lịch (cron expression) và chọn target API StopInstances, điền các InstanceIds.
- [ ] Kiểm thử: Đặt lịch thử (ví dụ vài phút sau hiện tại), kiểm tra EC2 có stop như mong đợi.
- [ ] Điều chỉnh: Kiểm tra CloudWatch logs, sửa policy/lịch nếu cần.
- [ ] Khởi động lại tự động (tuỳ chọn): Tạo lịch tương tự dùng API StartInstances để bật lại EC2 vào sáng hôm sau.
- [ ] Theo dõi & Báo cáo: Tạo CloudWatch Alarm hoặc SNS để thông báo tới bạn khi lịch chạy, và đánh giá báo cáo tiết kiệm định kỳ.
Kết luận
Việc tự động tắt EC2 theo lịch biểu là một giải pháp đơn giản nhưng hiệu quả để tối ưu chi phí AWS và nâng cao an ninh. Amazon EventBridge Scheduler cho phép chúng ta triển khai chỉ với vài bước cấu hình mà không cần viết mã phức tạp[3]. Hy vọng hướng dẫn chi tiết trên đã giúp bạn hiểu rõ cách thiết lập và cảm thấy tự tin triển khai.
Nếu bạn thấy hữu ích, hãy đăng ký và theo dõi kênh YouTube của mình để xem video hướng dẫn chi tiết từng bước và nhiều nội dung về tự động hoá AWS:
https://www.youtube.com/@luuhophuong733
Đăng ký khóa học AWS trên Udemy của mình để nắm vững kiến thức chuyên sâu về AWS, DevOps và tiết kiệm chi phí trên đám mây:
Chúc bạn thành công!
AWS #AmazonEC2 #EventBridgeScheduler #Automation #AWSAutomation #CloudComputing #DevOps #FinOps #ChiPhiIT #TietKiemChiPhi #AWSLambda #BaoMatAnNinh
Nguồn: Tham khảo tài liệu chính thức của AWS về EventBridge Scheduler[3][4] và các bài kỹ thuật (ví dụ các ví dụ về tiết kiệm chi phí EC2[1][2]).
[1] Reduce IT costs by implementing automatic shutdown for Amazon EC2 instances | AWS Public Sector Blog
[2] How to Schedule EC2 Instance Start and Stop to Save Costs
https://oneuptime.com/blog/post/2026-02-12-schedule-ec2-start-stop-save-costs/view
[3] [4] Serverless Task Scheduler – Amazon EventBridge Scheduler – Amazon Web Services


