#2 Từ Beanstalk sang ECS: quyết định đầu tiên của mình với hạ tầng AWS
Đây là một phần trong series mình chia sẻ về những gì mình đã làm khi xây dựng và vận hành hạ tầng backend trên AWS cho công ty. Không phải là best practice hoàn hảo, cũng không phải kiến thức quá cao siêu. Chỉ đơn giản là những gì mình đã học được, thử nghiệm và áp dụng trong quá trình làm việc hằng ngày. Mình bắt đầu công ty mới vào đầu năm ngoái. Lý do mình chuyển việc thì đã viết ở bài trước.
Bình yên trước giông bão
Mới vào làm, mình bắt đầu làm quen với hệ thống mới, đồng nghiệp mới, những dự án mới, làm quen với văn hoá của công ty. Ngoài đời, mình là một người hướng nội, nhưng trong công việc thì không
. Chỗ nào không hiểu thì mình hỏi luôn để không bị block.
May mắn là sau khoảng 1 tháng thì mình đã gia nhập được dự án và đồng nghiệp. Lúc này, những yêu cầu nhiệm vụ của mình trong quá trình tuyển dụng bắt đầu.
Hệ thống có gì lúc đó?
Hệ thống backend lúc đó có khoảng dưới 10 microservices nhỏ viết bằng Java Spring Boot, với RabbitMQ là broker cho việc gửi các sự kiện (events). Khi cần sửa trên một service, tất cả các services được dockerize và deploy một lần cùng nhau trên AWS Beanstalk.
Mỗi lần deploy sẽ mất tầm 4 đến 5 phút services không khả dụng. Chính vì thế, công ty sẽ thường deploy lúc ít traffic nhất, trừ những hotfix.
Nhiệm vụ đầu tiên được giao
CTO giao nhiệm vụ: với kinh nghiệm AWS, hãy tìm một cách khác để deploy từng service một, và khi deploy sẽ không bị gián đoạn dịch vụ. Sử dụng Kubernetes nếu cần thiết.
Với các bạn có kinh nghiệm thì nói: cái này có gì mà khó, quá dễ. Nhưng với mình tại thời điểm đó, không phải dễ dàng.
Trước đây, mình chỉ thuần dev, kinh nghiệm DevOps chỉ là những pet project, chưa từng chạm tay vào thực tế.
Mình có gì?
Có certificate AWS SAA, còn lại không có gì.
Mình là người rất hay đọc các blog tech và xem YouTube hướng dẫn. Tiện đây, mình cũng cảm ơn anh Viet Tran với các video hướng dẫn AWS của anh, và anh Nguyễn Văn Mạnh với các chia sẻ về DevOps.
Có một tư duy mà anh Mạnh nói đã theo mình khi mình làm DevOps:
Đừng làm phức tạp mọi thứ.
Nên nhớ, một pipeline chỉ có 2 stages quan trọng nhất: build và deploy, những thứ khác chỉ là phụ.
Các video hướng dẫn chi tiết các services AWS và những lời khuyên, phân tích của người đi trước của anh Viet Tran cũng đã hướng mình nên chọn cái gì và làm như nào.
Bắt đầu thôi
Bây giờ đây, mình đứng giữa 3 lựa chọn dịch vụ để deploy container Docker trên AWS:
- EKS (Kubernetes on AWS)
- ECS (AWS native)
- EC2
EC2
Lựa chọn thứ 3 thì mình bỏ ngay từ đầu.
Nếu sử dụng EC2 (deploy qua docker-swarm, docker-compose), sẽ mất rất nhiều công sức để deploy và bảo trì, ít nhất là với mình — người chưa có nhiều kinh nghiệm. Hiệu quả thì cũng chưa nói trước được, dù mình nghĩ đây là cách có chi phí tiết kiệm nhất.
Hiện tại khi deploy qua Beanstalk cũng tương tự như vậy. Beanstalk sẽ tạo những cụm ECS và deploy tất cả các services lên các EC2.
EKS
Với EKS, dù mình chưa có kinh nghiệm nhưng nếu có thời gian mình cũng sẽ làm được, vì phần khó nhất thì AWS đã làm hộ chúng ta.
Nếu dùng dịch vụ này, sẽ rất đẹp CV và cũng có cơ hội tìm hiểu sâu hơn về Kubernetes.
Nhưng rõ ràng đây là bài toán trade-off.
Nếu bạn chỉ có số ít services mà dùng EKS thì khác nào dùng dao mổ trâu để diệt ruồi, quá phức tạp.
Ngoài ra, để quản lý và bảo trì cũng phải là một người có nhiều kinh nghiệm, hiểu rõ về Kubernetes. Nếu không thì bạn sẽ canh infra cả ngày để debug lỗi.
Chi phí cho EKS cũng không hề rẻ. Bạn không làm gì cũng đã mất gần 100 USD để duy trì cluster
(dễ ăn quá).
ECS
Cuối cùng mình đã chọn ECS Fargate, dịch vụ cây nhà lá vườn của AWS.
Nó có đầy đủ mọi thứ như:
- Load Balancer
- Auto Scaling
- Rolling Update
- Blue-Green Deployment
Khá là gọn nhẹ, serverless. Đẩy hết cho AWS làm, mình tập trung phát triển ứng dụng là được rồi, haha.
Giá cả của ECS với mình cũng không quá đắt và rất dễ cho người mới bắt đầu.
Mình làm trong vòng 3 tuần là đã có thể lên production từ đầu tới cuối. Tất nhiên sau đó vẫn còn có những chỉnh sửa, nhưng gần như mọi thứ rất dễ để tích hợp vào thực tế dự án của mình.
Hiện tại
ECS vẫn chạy ổn định và phù hợp với dự án của công ty, và mình tin quyết định chọn của mình là khá hợp lý.
Đôi khi mọi thứ chỉ là sự phù hợp mà thôi.
Mình không thể tưởng tượng nếu chọn EKS thì lúc này sẽ như thế nào. Có lẽ vẫn ok, nhưng khi ngó đến bill AWS, mình sẽ phải giật mình 
Bài viết này cũng được mình dịch sang tiếng Anh trên blog substack của mình.
Mình viết lại những điều này như một cách để ghi nhớ hành trình làm nghề của mình. Nếu bạn cũng đang làm backend, devops hoặc cloud, hy vọng những chia sẻ này có thể giúp bạn một chút gì đó. Còn nếu có chỗ nào mình hiểu chưa đúng, mình vẫn luôn sẵn sàng học thêm.
All rights reserved
