Giới thiệu dịch vụ AWS Copilot

Công cụ dòng lệnh (command line tool) đầu tiên cho Amazon Elastic Container Service (Amazon ECS) được phát triển từ 2015. Tới tháng 12/2019, chúng tôi chia sẻ phần preview của phiên bản công cụ dòng lệnh mới, được thiết kế lại hoàn toàn để giúp khách hàng triển khai ứng dụng trên Amazon ECS dễ dàng hơn. Hôm nay, chúng tôi chia sẻ thêm về tiến độ phát triển công cụ này, cũng như là tên gọi chính thức của nó: AWS Copilot

AWS Copilot được thiết kế dành cho cả người dùng đã sử dụng ECS cũng như người dùng mới, với mong muốn giúp họ tập trung nhiều hơn vào việc thiết kế ứng dụng và vòng đời của nó thay vì dành thời gian cho quản lý thủ công phần hạ tầng. Copilot hoạt động dựa trên các khuôn mẫu (patterns) dành cho môi trường production và đi kèm các best practices được thiết kế bởi các kĩ sư và các khách hàng sử dụng ECS trong suốt nhiều năm qua.

Nếu bạn đang thiết kế một ứng dụng mới, bạn có thể sẽ bắt đầu vẽ với bảng trắng hoặc mô hình hoá trong đầu với những hình khối đại diện cho từng dịch vụ và các đường kết nối diễn tả cách thức các dịch vụ giao tiếp với nhau như thế nào. Nhưng khi bắt đầu tạo kiến trúc, sẽ có rất nhiều thành phần khác trên cloud mà bạn phải cân nhắc, bao gồm: các dải mạng (VPC subnets), cân bằng tải (load balancers), các tiến trình triển khai (deployment pipelines), và phần lưu trữ (durable storage) cho các dữ liệu có trạng thái của ứng dụng (stateful data). Copilot xử lý tất cả các thành phần trên cho bạn. Bạn chỉ cần cung cấp container và để Copilot xử lý phần triển khai (deployments) với tính sẵn sàng cao (high availability) và cả các tác vụ tạo & cấu hình bộ cân bằng tải. Bạn thậm chí có thể dùng Copilot để tạo một deployment pipeline có khả năng tự triển khai phiên bản mới nhất của ứng dụng mỗi khi bạn đẩy một commit mới lên code repository.

Tóm lại, nếu bạn sử dụng Copilot, bạn có thể đi từ ý tưởng tới triển khai thực tế nhanh hơn rất nhiều và vẫn tự tin rằng phần hạ tầng sẽ được triển khai theo đúng các chuẩn cấu hình của dành cho môi trường production.

Cài đặt Copilot như thế nào

Bạn có thể cài đặt Copilot lên máy chủ ở môi trường development bằng cách sử dụng Brew:

brew install aws/tap/copilot-cli

Hoặc nếu bạn không dùng Brew và muốn cài đặt trực tiếp thì bạn có thể tải và cài đặt từ các bản releases trên GitHub:

curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-darwin && chmod +x /usr/local/bin/copilot && copilot --help

Bạn cũng có thể xem thông tin đầy đủ về cách thức cài đặt cho các hệ điều hành macOS, Linux và Windows trên các tài liệu về Copilot.

Copilot dùng chung thông tin xác thực (credentials) với AWS CLI, nên nếu bạn đã đang sử dụng AWS CLI thì bạn đã hoàn toàn sẵn sàng để tiếp tục. Nếu ban chưa từng cài đặt hay cấu hình AWS CLI, bạn có thể làm theo các hướng dẫn sau. Hãy đảm bảo là bạn chạy câu lệnh aws configure sau khi cài đặt AWS CLI.

Cuối cùng, bạn sẽ cần chắc chắn là Docker đã được cài đặt. AWS Copilot sẽ sử dụng Docker để build và đóng gói ứng dụng của bạn.

Giới thiệu các khái niệm của Copilot

Đầu tiên, hãy cùng xem nhanh các dòng lệnh ở mức high-level có trong Copilot:

Có 3 khái niệm chính trong Copilot:

  • Application – Một ứng dụng (application) là một phương thức nhóm các thành phần trong hệ thống của bạn. Theo định luật Conway, bạn sẽ phân tách các thành phần ra các Copilot applications tương ứng với các đội (teams) khác nhau trong tổ chức của bạn. Ví dụ, nếu bạn có một tổ chức nhỏ với một nhóm phát triển ứng dụng hợp nhất, xử lý mọi phần việc thì bạn có thể quy hoạch một application đơn lẻ, được cấu thành từ một hoặc nhiều dịch vụ. Nhưng nếu bạn có nhiều nhóm khác nhau và mỗi đội chịu trách nhiệm cho một nhóm các thành phần, và mức độ cần giao tiếp giữa các đội là không nhiều thì mỗi đội nên có một Copilot application riêng.
  • Environment – Một môi trường (environment) là một giai đoạn triển khai (stage of deployment) của một ứng dụng. Ví dụ, bạn có thể sẽ triển khai một ứng dụng lên môi trường “QA” trước để ứng dụng có thể được kiểm thử và đảm bảo không có ảnh hưởng xấu tới khách hàng. Khi nó đã được kiểm tra là hoạt động đúng như dự kiến, bạn có thể triển khai phiên bản đó của ứng dụng lên môi trường “Production” để khách hàng có thể truy cập và sử dụng nó.
  • Service – Một dịch vụ (service) là một tiến trình chạy dài hạn (long running code process) trong một container. Một ứng dụng có thể bao gồm một hoặc nhiều services. Nếu bạn đang sử dụng kiến trúc đơn khối (monolithic architecture), thì thông thường mỗi ứng dụng sẽ chỉ có một service. Còn ứng dụng theo kiến trúc phân tán (distributed architecture) sẽ bao gồm nhiều services cho mỗi ứng dụng. Ví dụ, bạn có thể sẽ có một “website” service với một bộ cân bằng tải phơi ra Internet, một “API” service nội bộ mà chỉ có thể truy cập thông qua service discovery, và một tiến trình chạy nền (“background worker” service) để xử lý các jobs từ hàng đợi. Các thành phần này cùng câú thành một ứng dụng.

Bắt đầu với ứng dụng container đầu tiên

Bước đầu tiên đối với bất kì một ứng dụng được container hoá nào (containerized application) là bắt đầu với Dockerfile. Dockerfile là một file dung lượng nhỏ dùng để mô tả các thành phần phụ thuộc (dependencies) và các files mà ứng dụng cần đến, cũng như là program cần để chạy trong container. Trong ví dụ này, tôi sẽ sử dụng một máy chủ web tĩnh của NGINX làm ứng dụng demo. Dockerfile của tôi trông sẽ như sau:

Docker
FROM nginx:alpine
EXPOSE 80
COPY . /usr/share/nginx/html

Dockerfile này chỉ dẫn Docker để khởi chạy một container đã được build sẵn với NGINX và thêm vào một số file HTML vào container. Tôi cũng thêm vào một mô tả (statement) EXPOSE cho Copilot để chỉ định port nào sẽ được ứng dụng phơi ra thông qua bộ cân bằng tải.

Tiếp theo tôi chạy lệnh copilot init từ đường dẫn của ứng dụng:

Copilot sẽ tự động tìm tới Dockerfile ở trên. Dịch vụ sẽ hỏi tôi một số câu hỏi như tôi muốn đặt tên cho ứng dụng là gì. Sau đó, Copilot tạo một environment (môi trường) để triển khai service lên đó. Copilot cũng build và đẩy container lên cloud. Và cuối cùng, Copilot trả lại một đường dẫn URL để tôi có thể truy cập vào ứng dụng.

Giờ ta có một ứng dụng được khởi tạo và chạy và tôi có thể truy cập nó từ URL trên trình duyệt và gửi yêu cầu (requests) tới.

Sau khi tạo một số web requests tới NGINX services, tôi có thể sử dụng Copilot để theo dõi logs cho ứng dụng bằng cách chạy lệnh:

copilot svc logs --follow

Trong trường hợp này, logs của services chỉ là log truy cập (access logs) của NGINX, nhưng nếu tôi đang chạy một ứng dụng thì mọi thông tin debug mà tôi đẩy ra stdout sẽ xuất hiện tại đây.

Triển khai một môi trường Production

Ứng dụng đầu tiên bản triển khai trên Copilot sẽ chạy với cấu hình mặc định – chỉ triển khai một container đơn lẻ sử dụng Fargate. Thiết lập này là tối ưu về chi phí và rất phù hợp cho các nhu cầu phát triển ứng dụng. Tuy nhiên, nó không dành cho môi trường production.

Để phù hợp và sẵn sàng cho môi trường production, ta cần khởi tạo một môi trường mới:

copilot env init

Giờ trước khi ta triển khai service của mình lên môi trường production, ta cần thay đổi một số cấu hình. Ta có thể tìm thấy file cấu hình (configuration manifest) cho service tại đường dẫn nyan/manifest.yml

File cấu hình này chứa tất cả các cấu hình mặc định của ứng dụng, cũng như port sử dụng, lượng tài nguyên CPU và bộ nhớ (memory) mà ứng dụng cần, cũng như bao nhiêu bản copies mà ứng dụng sẽ chạy. Cụ thể ở đây, ta muốn chỉnh sửa một số tuỳ chỉnh dành cho môi trường production, nên ta thêm vào các khai báo (statements) sau:

YAML

environments:
  production:
    count: 2
    cpu: 1024
    memory: 2048

Chúng sẽ yêu cầu Copilot rằng khi triển khai ứng dụng lên môi trường production, ta muốn chạy với 2 bản copies, và mỗi bản sử dụng 1 CPU và 2 GB memory.

Giờ ta có thể triển khai service lên môi trường production với câu lệnh sau:

copilot svc deploy --env production

Lần này, Copilot sẽ triển khai ứng dụng của tôi lên môi trường production theo mô hình có tính sẵn sàng cao với các bản khả dụng phân tán trên các vùng sẵn sàng (Availability Zones) khác nhau, và mỗi container được cấp phát nhiều tài nguyên CPU và memory hơn. Ta có thể chạy một tiến trình kiểm tra tải (load test), sử dụng ApacheBench để có thể hình dung rõ hơn lượng tải (traffic) mà deployment này có thể xử lý được:

ab -n 5000 -c 25 http://nyan-Publi-WI97060DJP1B-2041999651.us-east-1.elb.amazonaws.com

Câu lệnh này ra lệnh cho ApacheBench tạo ra 5000 yêu cầu (requests) tới service của tôi, với số lượng yêu cầu đồng thời tại cùng một thời điểm (concurrency) là 25.

Kết quả cho thấy khả năng xử lý ở mức khả thi là 353 yêu cầu mỗi giây, phân vị thứ 99 (p99) chỉ là 165 ms (hay chỉ có 1% trên tổng số yêu cầu có độ trễ lớn hơn 165 ms), và thời gian xử lý trung bình cho mỗi yêu cầu là 70 ms.

Concurrency Level:      25
Time taken for tests:   14.140 seconds
Complete requests:      5000
Failed requests:        0
Total transferred:      7565000 bytes
HTML transferred:       6395000 bytes
Requests per second:    353.60 [#/sec] (mean)
Time per request:       70.701 [ms] (mean)
Time per request:       2.828 [ms] (mean, across all concurrent requests)
Transfer rate:          522.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       12   34  15.6     30     161
Processing:    14   37  16.1     34     334
Waiting:       14   36  16.1     33     334
Total:         32   70  23.1     65     402

Percentage of the requests served within a certain time (ms)
  50%     65
  66%     71
  75%     77
  80%     80
  90%     93
  95%    117
  98%    143
  99%    165
 100%    402 (longest request)

Nếu tôi cần xử lý một lưu lượng tải lớn hơn, tôi có thể dễ dàng điều chỉnh file cấu hình của ứng dụng để mở rộng theo chiều ngang (scale out) bằng cách tăng số lượng copies, hoặc mở rộng theo chiều dọc (scale up) bằng cách tăng thêm CPU cho service của mình, rồi chạy lại lệnh copilot svc deploy

Kết luận

Như bạn có thể thấy, Copilot được thiết kể để giúp ta triển khai một ứng dụng container dành cho production với chỉ vài dòng lệnh. Bạn chỉ phải cung cấp Dockerfile, và để Copilot build và đẩy image rồi triển khai container lên AWS.

Tuy nhiên đó mới chỉ là một phần nhỏ trong nhiều tính năng mạnh mẽ của Copilot. Với Copilot, bạn có thể dễ dàng:

Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về các tính năng mạnh mẽ của Copilot. Còn bây giờ, các bạn hãy gửi các nhận xét, góp ý hoặc yêu cầu về tính năng trên GitHub repository chính thức của dự án; và cả các pull requests nữa. 


Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: