[Report][AWS Summit Online ASEAN RE:CAP 2020]Cung cấp các ứng dụng gốc container mà không cần quản lý máy chủ

Trong phần này, hãy tìm hiểu cách thiết kế và cung cấp một ứng dụng hiện đại có thể mở rộng và bảo mật trên Fargate
2020.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Ngày 29/09/2020 vừa rồi đã diễn ra sự kiện AWS Summit Online ASEAN RE:CAP. Link sự kiện: https://live.awsevents.com/ASEANSummitreCap/

Chủ để của session lần này là "Cung cấp các ứng dụng gốc container mà không cần quản lý máy chủ" Diễn giả: Timothee Cruse, Principal IoT Specialist - Solution Architect, Amazon Web Services

AWS Fargate là một công cụ tính toán hoàn toàn không có máy chủ, chứa container. Nó không yêu cầu người dùng cung cấp, chia tỷ lệ hoặc quản lý máy chủ và nó hoạt động với Amazon ECS và Amazon EKS. Trong phần này, hãy tìm hiểu cách thiết kế và cung cấp một ứng dụng hiện đại có thể mở rộng và bảo mật trên Fargate. Ngoài ra, hãy tìm hiểu cách sử dụng Bộ công cụ phát triển đám mây AWS (AWS CDK) để xác định các thành phần đám mây có thể sử dụng lại bao gồm toàn bộ kiến trúc ứng dụng.

Rất nhiểu khách hàng đã bắt đầu triển khai ứng dụng của họ bằng cách sử dụng container. Container cho phép ta dễ dàng đóng gói ứng dụng của mình cùng với các thư viện và các dependency và chạy chúng trong một môi trường nhất quán. Container cũng trở nên phổ biến cho các ứng dụng hiện đại, sử dụng kiến trúc microservices. Tuy nhiên khách hàng nói rằng họ không muốn khởi tạo và cài đặt cơ sở hạ tầng phức tạp chỉ để hỗ trợ tác vụ load container. Họ cũng không muốn mở rộng, tương tác hoặc quản lý các máy ảo. Để gỉải quyết những vấn đề này, AWS Fargate đã được tạo ra.

1. Cơ chế hoạt động của AWS Fargate

AWS Fargate là một serverless compute engine để chạy các ứng dụng container. Ta có thể tập trung vào code của ứng dụng và trực tiếp triển khai các container trên Fargate mà không cần quản lý bất kì máy chủ nào.

AWS Fargate hoạt động với cả 2 dịch vụ quản lý và điều phối container trên AWS đó là Amazon Elastic Container Service và Amazon Kubernetes Services.

Ở đây chúng ta có Amazon ECS chạy với EC2:

  • Ở trên cùng của sơ đồ chúng ta có Control Plane là thành phần thực hiện lập trình lịch và sắp xếp các Task
  • Ở phía dưới chúng ta có Data Plane của ECS, là một AutoScaling group của các EC2 Instance chạy trên nhiều Availability Zones. Các EC2 instances này sẽ chạy các mục load dưới dạng các ECS Task và liên lạc với Control Plane bằng cách thông qua ECS agent.

Nếu chúng ta launch ECS trên Fargate

  • Ta sẽ thấy không còn các EC2 Instances trong sơ đồ nữa. Ta sẽ chỉ có các ECS Task trong VPC của mình.

Vậy các EC2 Instance đã đi đâu? Để trả lời câu hỏi này chúng ta sẽ cùng xem cách ECS chạy các task trên EC2 (Quá trình tương tự cũng áp dụng cho Amazon EKS). Khi ECS chạy với các EC2 data plane, quá trình sẽ diễn ra như sau:

  • Đầu tiên ta gửi API request từ tài khoản AWS của mình tới control plane do AWS quản lý, yêu cầu control plane launch một ECS task
  • Sau đó control plane sẽ tương tác với tài khoản AWS để tạo các tài nguyên cần thiết cho task để chạy.
  • Ta sẽ phải khởi tạo đủ các EC2 Instance cho cluster của mình và cũng phải quản lý vòng đời của các instance này cũng như dung lượng tổng dùng chung của cluster.

Giờ ta so sánh với ECS trên Fargate:

  • Tương tự, ta bắt đầu bằng việc gửi API request từ tài khoản AWS của mình tới control plane của ECS và yêu cầu control plane launch một ECS task
  • Sau đó ECS sẽ launch task trên một nhóm EC2 Instance do Fargate quản lý.
  • Tiếp theo, control plane sẽ yêu cầu khởi tạo ENI cho VPC và gắn vào Fargate task. Bằng cách này, Fargate task có thể kêt nối với các tài nguyên khác trên AWS như Database hoặc LoadBalancer.
  • Nhưng lúc này, ta không hề cung cấp bất kì EC2 Instance nào trong VPC của mình hoặc quản lý vòng đời của bất kì Instance nào cũng như cập nhật agent hoặc cập nhật bản vá lỗi cho hệ điều hành. Ta cũng không cần phải quản lý dung lượng của cluster. Fargate sẽ scale các container dựa trên các autoscaling policy mà ta đã định nghĩa cho task

Ví dụ cách launch một task trên Fargate

  • Đầu tiên, chỉ định lượng CPU và Ram
  • Sau đó cung cấp container image
  • Sau đó tạo cluster
  • Run task sử dụng API

2. Triển khai một ứng dụng Java trên Fargate

Ta có một ứng dụng chạy Java Spring Boot thực hiện các chức năng API cơ bản cho một ứng dụng ghi chú

  • Ta muốn đạt được tính sẵn sàng cao thông qua cân bằng tải
  • Troubleshoot với log tập trung
  • Operation Dashboard để theo dõi các metrics về hiệu suất của container
  • Cần đảm bảo bảo mật ví dụ như với mật khẩu ứng dụng database

Triển khai hệ thống:

  • Bắt đầu với cơ sở hạ tầng cho toàn hệ thống: chúng tôi có một VPC với một ECS Fargate Cluster. Đây chỉ là một logical group và không có EC2 Instance nào được cung cấp.
  • Đối với Database, chúng tôi sẽ sử dụng Amazon Aurora Serverless là một engine tương thích mới MySQL và Postgre. Aurora Serverless có thể tự động scale up và scale down dung lượng Database dựa trên lượng yêu cầu gửi tới ứng dụng.
  • Định nghĩa task definition và thiết lập Autoscale dựa trên ngưỡng hiệu suất của CPU. Chúng ta cũng có thể sử dụng các Metrics khác như số lượng yêu cầu gửi tới LoadBalancer, lượng Memory hoặc bất kì Custom Metrics nào hỗ trợ trên Cloudwatch. Task Definition bao gồm thông tin về nơi lưu trữ container image, cấu hình ghi log tập trung và truy xuất mật khẩu Database
  • Cấu hình dịch vụ ECS để tích hợp ECS task với Application LoadBalancer. LoadBalancer cũng sẽ thực hiện kiểm tra sức khoẻ trên ứng dụng trước khi gửi yêu cầu của người dùng đến cho các task.
  • Để bảo mật mật khẩu cho Database, ứng dụng Java của chúng ta sẽ lưu trữ và truy xuất mật khẩu từ Amazon Secrets Manager. Secret Manager là dịch vụ giúp bảo vệ mật khẩu Database bằng cách mã hoá nó bằng dịch vụ AWS KMS. Nó cũng giúp dễ dàng rotate càng secret.
  • Đối với container image của ứng dụng, ta sẽ lưu trữ nó trên Amazon Elastic Container Registry (ECR). ECR là kho lưu trữ container image được quản lý hoàn toàn bởi AWS nhằm giúp Developer dễ dàng lưu trữ, quản lý và triển khai container image. ECR còn thực hiện image scanning để phát hiện bất kì lỗ hổng phần mềm nào có trong image của bạn
  • Cuối cùng, để giúp các Developer troubleshoot ứng dụng của họ, Amazon Cloudwatch Log là dịch vụ cho phép ta tìm kiếm và phân tích log trên các ứng dụng trên nhiều container khác nhau. Cloudwatch cũng cung cấp Container Insight Services cho phép ta theo dõi hiệu suất ứng dụng của mình trên một Dashboard đã được tạo sẵn.

Khi chúng ta muốn cấp phát các tài nguyên AWS mà chúng ta đã thảo luận ở trên, để triển khai các tài nguyên này một cách nhất quán, ta sẽ cần xây dựng một template sử dụng Infrastructure as code. Thông thường điều này có nghĩa là ta sẽ phải viết code JSON hoặc YAML, vừa dài vừa phức tạp, sau đó ta cấp phát các tài nguyên này thông qua AWS CloudFormation. Ngoài JSON và YAML ta cũng có thể sử dụng các ngôn ngữ lập trình quen thuộc để mô hình hoá các tài nguyên AWS của mình bằng cách sử dụng Cloud Development Kit (CDK). Các ngôn ngữ này bao gồm TypeScript, Javascript, Python, C#,... Dưới đây là 1 đoạn TypeScript code định nghĩa Fargate Cluster và ứng dụng chạy Java Spring Boot để chạy dưới dạng ECS ẩn đằng sau Application LoadBalancer.

Tương tự với EKS

Phần Demo là một video nên nếu bạn thấy thú vị và muốn tìm hiểu thêm. Hay truy cập đường link của sự kiện và tìm video của session "Cung cấp các ứng dụng gốc container mà không cần quản lý máy chủ"

Cảm ơn các bạn đã theo dõi blog. Xin chào và hẹn gặp lại!