by Eric Johnson | on 18 NOV 2020 | in Amazon API Gateway, Amazon API Gateway, AWS Serverless Application Model, Serverless | Permalink | Share
Bài viết này được viết bởi Dhiraj Thakur and Sameer Goel, Solutions Architects tại AWS.
Khi xây dựng các ứng dụng web serverless, việc sử dụng các hàm AWS Lambda làm lớp tính toán cho logic kinh doanh là phổ biến. Để quản lý canary releases, điều tốt nhất là sử dụng các tùy chọn triển khai Lambda. Tuy nhiên, nếu bạn sử dụng các tích hợp dịch vụ Amazon API Gateway thay vì các hàm Lambda, việc quản lý canary release tại cấp độ API là cần thiết. Bài đăng này sẽ hướng dẫn cách sử dụng canary releases trong REST APIs để triển khai dần dần các thay đổi cho các ứng dụng không máy chủ.
Tổng quan
Các ứng dụng hiện đại thường xuyên triển khai cập nhật để triển khai các tính năng mới. Tuy nhiên, việc cập nhật hoặc thay đổi một ứng dụng đang hoạt động có thể gây ra rủi ro và có thể dẫn đến các lỗi. Canary deployments là một chiến lược phổ biến giúp giảm thiểu rủi ro này.
Trong một canary deployment, bạn triển khai một phần tính năng phần mềm mới và chuyển một số lượng phần trăm lưu lượng sang phiên bản mới của ứng dụng. Điều này cho phép bạn xác minh tính ổn định và giảm thiểu rủi ro liên quan đến bản phát hành mới. Sau khi có đủ niềm tin vào phiên bản mới, bạn tiếp tục tăng lưu lượng truy cập cho đến khi tất cả lưu lượng đều chuyển sang bản phát hành mới. Ngoài ra, canary deployment có thể là một cách tiếp cận tiết kiệm chi phí vì không cần sao chép tài nguyên ứng dụng, so với các chiến lược triển khai khác như blue/green deployments.
Trong ví dụ này, có hai phiên bản dịch vụ được triển khai với API Gateway. Phiên bản canary nhận 10% lưu lượng và phần còn lại là 90% được định tuyến đến phiên bản ổn định.
Ví dụ canary deploy
Sau khi triển khai phiên bản mới, bạn có thể kiểm tra sức khỏe và hiệu suất của phiên bản mới. Khi bạn có đủ tin tưởng rằng nó đã sẵn sàng để phát hành, bạn có thể nâng cấp phiên bản canary và gửi 100% lưu lượng đến phiên bản API này.
Ví dụ về triển khai đã được thăng cấp
Trong bài đăng này, tôi sẽ hướng dẫn cách sử dụng AWS Serverless Application Model (AWS SAM) để xây dựng một canary release với một REST API trong API Gateway. Đây là một framework mã nguồn mở để xây dựng các ứng dụng không máy chủ. Nó cho phép nhà phát triển xác định và triển khai các canary release, sau đó chuyển đổi lưu lượng theo cách lập trình. Trong ví dụ này, AWS SAM tạo ra các cài đặt canary cần thiết để chia lưu lượng và vai trò IAM được sử dụng bởi API Gateway.
Ví dụ về triển khai canary trong API Gateway
Trong hướng dẫn này, một REST API tích hợp trực tiếp với Amazon DynamoDB. API này trả về ba thuộc tính dữ liệu từ bảng DynamoDB. Trong phiên bản canary, mã được sửa đổi để cung cấp thông tin bổ sung từ bảng.
Tạo REST API của Amazon và các tài nguyên khác
Tải code từ bài đăng này từ https://github.com/aws-samples/amazon-api-gateway-canary-deployment. Tệp template.yaml là cấu hình AWS SAM cho ứng dụng, và tệp api.yaml là cấu hình OpenAPI cho API. Triển khai ứng dụng này bằng cách làm theo hướng dẫn trong tệp README.md.
Việc triển khai sẽ tạo ra một bảng DynamoDB trống có tên “<sam-stack-name>-DataTable-*” và một REST API của API Gateway có tên “Canary Deployment” với stage “PROD”.
- Chạy lệnh put-item của Amazon DynamoDB để tạo một mục mới trong bảng DynamoDB từ AWS CLI. Đảm bảo bạn đã cấu hình AWS CLI – tham khảo hướng dẫn nhanh để tìm hiểu thêm. Thay thế <tablename> bằng tên của bảng DynamoDB.
| aws dynamodb put-item –table-name <tablename> –item “{“”country””:{“”S””:””Germany””},””runner-up””:{“”S””:””France””},””winner””:{“”S””:””Italy””},””year””:{“”S””:””2006″”}}” –return-consumed-capacity TOTAL |
Nó sẽ trả về một thông báo thành công
Cập nhật đầu ra của Amazon DynamoDB
Bạn có thể xác minh bản ghi trong bảng DynamoDB trên AWS Management Console:
Scan of Amazon DynamoDB table
- Chọn REST API “Canary Deployment” trong Amazon API Gateway. Chọn “GET” trong phần resource. Trong Integration Request, bạn sẽ thấy Mapping Template:
| { “Key”: { “year”: { “S”: “$input.params(“year”)” } }, “TableName”: “<stack-name>-DataTable-<random-string>” } |
Integration Response là một phản hồi HTTP bao gồm phản hồi từ backend và mẫu dữ liệu như sau: TableName chỉ ra bảng nào được sử dụng trong cuộc gọi REST API. Giá trị cho year được trích xuất từ URL yêu cầu bằng cách sử dụng $input.params(‘year’)
| { “year”: “$input.path(‘$.Item.year.S’)”, “country”: “$input.path(‘$.Item.country.S’)”, “winner”: “$input.path(‘$.Item.winner.S’)” } |
Bạn cũng có thể kiểm tra cấu hình logs/tracing trong API stage như theo các cài đặt sau đây. Bạn có thể thấy rằng Amazon CloudWatch Logs đã được kích hoạt cho API, điều này giúp kiểm tra trạng thái của phiên bản canary của API. Ví dụ, một mã phản hồi 2xx cho thấy hoạt động thành công. Các mã lỗi khác chỉ ra lỗi của máy khách (4xx) hoặc lỗi máy chủ (5xx). Xem liên kết này để biết chi tiết về mã trạng thái. Phân tích trạng thái của API trong các nhật ký trước khi thăng cấp phiên bản canary.
Bật ghi nhật ký trên giao diện điều khiển của Amazon API Gateway
Nếu bạn gọi đường dẫn URL của API trong trình duyệt của mình, bạn sẽ thấy nó trả về các thuộc tính “country”, “year” và “winner”, như mong đợi từ bảng DynamoDB.
Ví dụ về gọi điểm cuối từ trình duyệt
Tiếp theo, thiết lập triển khai canary release để tạo một phiên bản mới của API đã triển khai và định tuyến 10% lưu lượng API đến đó.
Triển khai Canary
Bây giờ bạn có thể tạo một phiên bản mới của API bằng cách sử dụng mẫu AWS SAM, thay đổi số lượng thuộc tính được trả về. Với phiên bản mới của API, thuộc tính bổ sung “runner-up” sẽ được trả về từ bảng DynamoDB. Đối với việc triển khai ban đầu, 10% lưu lượng API được định tuyến đến phiên bản này.
- Điều hướng đến thư mục canary-stack và triển khai ứng dụng. Hãy chắc chắn sử dụng cùng tên stack mà bạn đã sử dụng cho việc triển khai trước đó:
sam deploy -gAWS sẽ triển khai phiên bản canary và cấu hình API để định tuyến 10% lưu lượng đến phiên bản mới. Bạn có thể xác nhận điều này bằng cách kiểm tra cài đặt canary trong giai đoạn PROD. Bạn sẽ thấy “tỷ lệ yêu cầu được định tuyến đến canary” (phiên bản mới) là “10%” và “tỷ lệ yêu cầu được định tuyến đến Prod” (phiên bản trước đó) là 90%.
- Kiểm tra Integration Response. Mẫu được sửa đổi có dạng như sau:
| { “year”: “$input.path(‘$.Item.year.S’)”, “country”: “$input.path(‘$.Item.country.S’)”, “winner”: “$input.path(‘$.Item.winner.S’)”, “runner-up”: “$input.path(‘$.Item.runner-up.S’)” } |
- Bây giờ, hãy kiểm tra triển khai canary bằng cách sử dụng URL điểm cuối API. Bạn có thể làm mới trình duyệt và xem kết quả “runner-up” được hiển thị cho một phần nhỏ các yêu cầu. Điều này cho thấy rằng 10% lưu lượng được định tuyến đến canary. Nếu bạn không thấy thuộc tính mới này, ngay cả sau khi làm mới nhiều lần, hãy xóa bộ nhớ cache của trình duyệt của bạn. Xem lại Phản hồi Tích hợp, bạn sẽ thấy rằng mẫu hiện tại bao gồm thuộc tính bổ sung “runner-up”. Điều này trả về các thuộc tính “country“, “year“, “winner” và “runner-up“, theo yêu cầu của phiên bản canary mới.
Kiểm tra phản hồi trong trình duyệt sau khi thay đổi
Phân tích Amazon CloudWatch Logs
Bạn có thể phân tích trạng thái của phiên bản canary thông qua các nhật ký của Amazon CloudWatch. Để đảm bảo rằng có dữ liệu trong CloudWatch Logs, hãy làm mới trình duyệt của bạn và truy cập URL API nhiều lần.
- Trong AWS Management Console, điều hướng đến Services -> CloudWatch.
- Chọn khu vực tương ứng với khu vực của Amazon API Gateway của bạn, sau đó chọn Logs trong menu bên trái.
- Các nhật ký cho API Gateway được đặt tên dựa trên ID của API. Định dạng là “API-Gateway-Execution-Logs_<api id>/<api stage>”. Xem các nhật ký, bạn sẽ thấy một danh sách các luồng nhật ký với các định danh GUID. Sử dụng cột Thời gian Sự kiện cuối cùng để xem thời gian và tìm một lần thực thi gần đây.
- Phân tích nhật ký canary để xác nhận rằng cuộc gọi REST API đã thành công.
Các tùy chọn thăng cấp canary
Promote or delete the canary version
Để quay lại phiên bản ban đầu, chọn Delete Canary hoặc đặt “Percentage of requests directed to Canary” thành 0. Nếu phân tích của Amazon CloudWatch cho thấy phiên bản canary hoạt động thành công, bạn sẵn sàng thăng cấp canary để nhận toàn bộ lưu lượng API.
- Điều hướng đến tab Canary và chọn Promote Canary.
Nâng cấp canary trong giao diện điều khiển của Amazon API Gateway
- Chọn Update để chấp nhận các cài đặt. Điều này sẽ định tuyến 100% lưu lượng đến phiên bản mới.
Các tùy chọn thăng cấp canary
Dọn dẹp
Xem tệp README.md của kho lưu trữ để biết hướng dẫn dọn dẹp.
Kết luận
Triển khai canary là một thực hành được khuyến khích để kiểm thử các phiên bản mới của các ứng dụng. Bài đăng blog này cho thấy cách triển khai canary cho các tích hợp dịch vụ trong API Gateway. Tôi sẽ hướng dẫn cách phân tích các nhật ký được tạo ra cho các yêu cầu canary và thăng cấp canary để hoàn tất việc triển khai. Sử dụng AWS SAM, bạn triển khai một canary trong API Gateway với cấu hình và chiến lược định tuyến được xác định trước.
Để biết thêm thông tin, hãy đọc tài liệu Building APIs with Amazon API Gateway và Implementing safe AWS Lambda deployments with AWS CodeDeploy.
.