Bởi James Beswick | on 30 JAN 2024 | in Amazon EventBridge, AWS AppSync, Serverless | Permalink | Chia sẻ
Bài viết này được viết bởi Josh Kahn, Tech Leader, Serverless.
Hiện nay, Amazon EventBridge hỗ trợ gửi các sự kiện tới các AWS AppSync GraphQL API dưới dạng mục tiêu gốc (native targets). Tích hợp mới này cho phép các nhà phát triển dễ dàng đưa các sự kiện tới nhiều đối tượng người dùng hơn và đơn giản hóa việc cập nhật dữ liệu khách hàng gần thời gian thực. Bạn có thể sử dụng EventBridge và AWS AppSync để xây dựng các kiến trúc bền bỉ, dựa trên kiến trúc subscription-based event-driven cho nhiều người dùng.
Để minh họa việc sử dụng EventBridge với AWS AppSync, chúng ta hãy xem xét một tình huống đơn giản về vận hành ở sân bay. Trong ví dụ này, các hãng hàng không sẽ gửi các sự kiện về chuyến bay (ví dụ như lên máy bay, lùi, thay đổi cửa lên máy bay và chậm trễ) tới một dịch vụ duy trì trạng thái chuyến bay trên bảng hiển thị trong sân bay. Các hãng hàng không cũng gửi các sự kiện hữu ích cho các đơn vị khác tại sân bay, chẳng hạn như nhân viên vận chuyển hành lý và bảo trì, nhưng không gửi cho hành khách. Biểu đồ dưới đây mô tả sơ lược về hệ thống:
Hành khách mong muốn màn hình hiển thị thông tin chuyến bay trong sân bay luôn được cập nhật và chính xác. Có một số cách để thiết kế ứng dụng hiển thị đảm bảo dữ liệu luôn mới. Nói chung, chúng bao gồm việc ứng dụng truy vấn một số API hoặc ứng dụng đăng ký (subscribing) nhận thông báo khi dữ liệu thay đổi.
Trong trường hợp này, đăng ký nhận thông báo là phương pháp hiệu quả hơn vì thay đổi dữ liệu thường nhỏ và chỉ cập nhật từng phần so với lượng lớn thông tin được hiển thị. Ví dụ, khi chuyến bay bị trễ, bảng hiển thị chỉ cần cập nhật trạng thái và thời gian khởi hành thay vì cập nhật toàn bộ chi tiết của một chuyến bay riêng lẻ trong danh sách dài các thông tin chuyến bay khác.
AWS AppSync cho phép các client lắng nghe các thay đổi dữ liệu theo thời gian thực thông qua việc sử dụng GraphQL subscription (GraphQL subscriptions). Chúng được triển khai bằng cách sử dụng kết nối WebSocket giữa client và dịch vụ AWS AppSync. Ứng dụng hiển thị ở client sẽ kích hoạt hoạt động GraphQL subscription để thiết lập một kết nối bảo mật. AWS AppSync sẽ tự động đẩy các thay đổi dữ liệu (hoặc mutation – mutations) thông qua GraphQL API tới các subscriber sử dụng kết nối đó.
Trước đây, các nhà phát triển có thể sử dụng EventBridge API Destinations để kết nối các sự kiện được published và định tuyến thông qua EventBridge tới AWS AppSync, như được mô tả trong một bài đăng trên blog trước đó và có sẵn trong các mẫu Serverless Land (API Key, OAuth). Cách tiếp cận này hữu ích khi xử lý các cập nhật “ngoài luồng” (out-of-band) trong đó dữ liệu thay đổi bên ngoài một AWS AppSync mutation. Cập nhật ngoài luồng thường yêu cầu một nguồn dữ liệu NONE trong AWS AppSync để thông báo cho các subscriber về những thay đổi, như được mô tả trong AWS re:Post Knowledge Center. Việc bổ sung AWS AppSync làm mục tiêu cho EventBridge đơn giản hóa các trường hợp sử dụng này vì giờ đây bạn có thể kích hoạt một mutation để phản hồi cho một sự kiện mà không cần thêm code.
Sự kiện hoạt động sân bay
Mở rộng bối cảnh, các sự kiện hoạt động sân bay trông như thế này:
| { “flightNum”: 123, “carrierCode”: “JK”, “date”: “2024-01-25”, “event”: “FlightDelayed”, “message”: “Delayed 15 minutes, late aircraft”, “info”: “{ \”newDepTime\”: \”2024-01-25T13:15:00Z\”, \”delayMinutes\”: 15 }” } |
Trường event xác định loại sự kiện và liệu nó có liên quan đến hành khách hay không. Chi tiết sự kiện (event details) cung cấp thêm thông tin về sự kiện, thay đổi tùy theo loại sự kiện. Sân bay gửi đi nhiều sự kiện khác nhau nhưng bảng hiển thị sân bay chỉ cần một tập hợp con của những thay đổi đó.
AWS AppSync GraphQL API bắt đầu với một lược đồ GraphQL (GraphQL schema) định nghĩa các kiểu dữ liệu (type), trường (field) và các hoạt động (operation) có sẵn trong API đó. Tài liệu của AWS AppSync cung cấp tổng quan về lược đồ và các yếu tố cần thiết khác của GraphQL. Một phần của GraphQL schema cho tình huống sân bay có dạng như sau:
| type DelayEventInfo implements EventInfo { message: String delayMinutes: Int newDepTime: AWSDateTime } interface EventInfo { message: String } enum StatusEvent { FlightArrived FlightBoarding FlightCancelled FlightDelayed FlightGateChanged FlightLanded FlightPushBack FlightTookOff } type StatusUpdate { num: Int! carrier: String! date: AWSDate! event: StatusEvent! info: EventInfo } input StatusUpdateInput { num: Int! carrier: String! date: AWSDate! event: StatusEvent! message: String extra: AWSJSON } type Mutation { updateFlightStatus(input: StatusUpdateInput!): StatusUpdate! } type Query { listStatusUpdates(by: String): [StatusUpdate] } type Subscription { onFlightStatusUpdate(date: AWSDate, carrier: String): StatusUpdate @aws_subscribe(mutations: [“updateFlightStatus”]) } schema { query: Query mutation: Mutation subscription: Subscription } |
Kết nối EventBridge tới AWS AppSync
EventBridge cho phép bạn lọc, chuyển đổi và định tuyến các sự kiện tới một số mục tiêu. Dịch vụ hiển thị ở sân bay chỉ cần các sự kiện ảnh hưởng trực tiếp đến hành khách. Bạn có thể định nghĩa một quy tắc trong EventBridge để định tuyến những sự kiện đó (bao gồm trong GraphQL schema trước đó) đến mục tiêu là AWS AppSync. Các sự kiện khác được định tuyến đến các nơi khác, theo quy tắc được xác định khác, hoặc bị loại bỏ. Bạn có thể tìm thấy chi tiết về việc tạo quy tắc EventBridge và định dạng mẫu khớp sự kiện trong tài liệu của EventBridge.
Sự kiện trễ chuyến bay trước đó sẽ được gửi thông qua EventBridge như sau:
| { “id”: “b051312994104931b0980d1ad1c5340f”, “detail-type”: “Operations: Flight delayed”, “source”: “airport-operations”, “time”: “2024-01-25T16:58:37Z”, “detail”: { “flightNum”: 123, “carrierCode”: “JK”, “date”: “2024-01-25”, “event”: “FlightDelayed”, “message”: “Delayed 15 minutes, late aircraft”, “info”: “{ \”newDepTime\”: \”2024-01-25T13:15:00Z\”, \”delayMinutes\”: 15 }” } } |
Trong trường hợp này, có một danh sách cụ thể các sự kiện đáng quan tâm, nhưng EventBridge cung cấp một bộ hoạt động linh hoạt để khớp các mẫu, kiểm tra các mảng và lọc theo nội dung bằng cách sử dụng tiền tố, số hoặc các phương thức khớp khác. Một số tổ chức cũng cho phép các subscriber xác định các quy tắc riêng của họ trên một EventBridge event bus, cho phép các mục tiêu đăng ký nhận sự kiện thông qua dịch vụ tự phục vụ.
Mẫu sự kiện sau đây khớp với các sự kiện cần thiết cho dịch vụ hiển thị sân bay:
| { “source”: [ “airport-operations” ], “detail”: { “event”: [ “FlightArrived”, “FlightBoarding”, “FlightCancelled”, … ] } } |
Để tạo một EventBridge rule mới, bạn có thể sử dụng AWS Management Console hoặc infrastructure as code (IaC – cơ sở hạ tầng dạng mã). Bạn có thể tìm thấy định nghĩa cho rule hoàn chỉnh trong CloudFormation, với AWS AppSync target, ở phần sau của bài đăng này.
Tạo AWS AppSync target
Bây giờ EventBridge đã được cấu hình để định tuyến các sự kiện được chọn, hãy xác định AWS AppSync là mục tiêu cho rule. AWS AppSync API phải hỗ trợ xác thực IAM để được sử dụng làm mục tiêu EventBridge. AWS AppSync hỗ trợ nhiều loại xác thực trên một loại GraphQL đơn, vì vậy bạn cũng có thể sử dụng OpenID Connect, Amazon Cognito User Pools hoặc các phương thức xác thực khác nếu cần.
Để cấu hình AWS AppSync làm mục tiêu của EventBridge, hãy xác định mục tiêu bằng cách sử dụng AWS Management Console hoặc infrastructure as code (IaC). Trong bảng điều khiển, chọn Target Type là “AWS Service” và Target là “AppSync”. Chọn API của bạn. EventBridge phân tích lược đồ GraphQL và cho phép bạn chọn mutation gọi khi quy tắc được kích hoạt.
Khi sử dụng AWS Management Console, EventBridge cũng sẽ cấu hình AWS IAM role cần thiết để gọi mutation được chọn. Hãy nhớ tạo và liên kết một vai trò với chính sách tin cậy phù hợp khi cấu hình với IaC.
EventBridge hỗ trợ chuyển đổi đầu vào để tùy chỉnh nội dung của một sự kiện trước khi truyền thông tin làm đầu vào cho mục tiêu. Cấu hình input transformer để trích xuất các giá trị cần thiết từ sự kiện bằng cách sử dụng JSON path và một template theo định dạng đầu vào mong đợi của API AWS AppSync. EventBridge cung cấp một tiện ích hữu ích trong bảng điều khiển để truyền và kiểm tra đầu ra của một sự kiện mẫu.
Cuối cùng, hãy cấu hình bộ lựa chọn (selection set) để bao gồm cả phản hồi từ AWS AppSync API. Đây là các trường sẽ được trả về cho EventBridge khi mutation được kích hoạt. Mặc dù kết quả trả về cho EventBridge không quá hữu ích (ngoài việc khắc phục sự cố), bộ lựa chọn mutation cũng sẽ xác định các trường khả dụng cho những người đăng ký nhận thông báo cập nhật trạng thái chuyến bay (onFlightStatusUpdate subscription).
Định nghĩa EventBridge cho AWS AppSync rule trong CloudFormation
Các mẫu infrastructure as code (IaC), bao gồm AWS CloudFormation và AWS CDK, hữu ích để mã hóa các định nghĩa cơ sở hạ tầng nhằm triển khai trên nhiều Region và tài khoản khác nhau. Mặc dù bạn có thể viết CloudFormation thủ công, EventBridge cung cấp một tính năng xuất CloudFormation hữu ích trong AWS Management Console. Bạn có thể sử dụng tính năng này để xuất định nghĩa cho một quy tắc đã xác định.
Đây là CloudFormation cho rule được cấu hình trước đó và mục tiêu AWS AppSync. Đoạn mã này bao gồm cả định nghĩa rule và cấu hình mục tiêu.
| PassengerEventsToDisplayServiceRule: Type: AWS::Events::Rule Properties: Description: Route passenger related events to the display service endpoint EventBusName: eb-to-appsync EventPattern: source: – airport-operations detail: event: – FlightArrived – FlightBoarding – FlightCancelled – FlightDelayed – FlightGateChanged – FlightLanded – FlightPushBack – FlightTookOff Name: passenger-events-to-display-service State: ENABLED Targets: – Id: 12344535353263463 Arn: <AppSync API GraphQL API ARN> RoleArn: <EventBridge Role ARN (defined elsewhere)> InputTransformer: InputPathsMap: carrier: $.detail.carrierCode date: $.detail.date event: $.detail.event extra: $.detail.info message: $.detail.message num: $.detail.flightNum InputTemplate: |- { “input”: { “num”: <num>, “carrier”: <carrier>, “date”: <date>, “event”: <event>, “message”: “<message>”, “extra”: <extra> } } AppSyncParameters: GraphQLOperation: >- mutation UpdateFlightStatus($input:StatusUpdateInput!){updateFlightStatus(input:$input){ event date carrier num info { __typename … on DelayEventInfo { message delayMinutes newDepTime } } }} |
ARN của API AWS AppSync tuân theo dạng arn:aws:appsync:<AWS_REGION>:<ACCOUNT_ID>:endpoints/graphql-api/<GRAPHQL_ENDPOINT_ID>. ARN này có sẵn trong CloudFormation (xem Giá trị trả về GraphQLEndpointArn) hoặc có thể được tạo bằng cách sử dụng định danh được tìm thấy trong AWS AppSync GraphQL endpoint. ARN được bao gồm trong role policy mà EventBridge thực thi là ARN của API AWS AppSync (một ARN khác).
Trường AppSyncParameters bao gồm GraphQL operation để EventBridge gọi trên API AWS AppSync. Hoạt động này phải được định dạng tốt và khớp với lược đồ GraphQL. Bao gồm bất kỳ trường nào cần thiết cho người đăng ký trong bộ lựa chọn (selection set).
Kiểm tra subscriptions
Hiện nay, AWS AppSync đã được cấu hình làm mục tiêu cho EventBridge rules. Ứng dụng hiển thị thực tế sẽ sử dụng một thư viện GraphQL, chẳng hạn như AWS Amplify, để đăng ký nhận thông báo thay đổi dữ liệu theo thời gian thực. AWS Management Console cung cấp một tiện ích hữu ích để kiểm tra. Điều hướng đến bảng điều khiển AWS AppSync và chọn Queries trong menu cho API của bạn. Nhập truy vấn sau và chọn Run để đăng ký nhận thông báo cập nhật dữ liệu:
| subscription MySubscription { onFlightStatusUpdate { carrier date event num info { __typename … on DelayEventInfo { message delayMinutes newDepTime } } } } |
Trong một tab riêng biệt của trình duyệt, điều hướng đến bảng điều khiển EventBridge và chọn Send events. Trên trang Send events, chọn event bus cần thiết và đặt Event source thành “airport-operations”. Sau đó, nhập một loại chi tiết theo lựa chọn của bạn. Cuối cùng, dán nội dung sau vào Event detail, sau đó chọn Send.
| { “id”: “b051312994104931b0980d1ad1c5340f”, “detail-type”: “Operations: Flight delayed”, “source”: “airport-operations”, “time”: “2024-01-25T16:58:37Z”, “detail”: { “flightNum”: 123, “carrierCode”: “JK”, “date”: “2024-01-25”, “event”: “FlightDelayed”, “message”: “Delayed 15 minutes, late aircraft”, “info”: “{ \”newDepTime\”: \”2024-01-25T13:15:00Z\”, \”delayMinutes\”: 15 }” } } |
Quay lại tab AWS AppSync trong trình duyệt của bạn để xem dữ liệu đã thay đổi trong bảng kết quả:
Kết luận
Sử dụng EventBridge để kích hoạt trực tiếp các AWS GraphQL API target của AWS AppSync giúp đơn giản hóa và hợp lý hóa tích hợp giữa hai dịch vụ này, lý tưởng để thông báo cho nhiều người đăng ký về những thay đổi dữ liệu trong event-driven workloads. Bạn cũng có thể tận dụng các tính năng khác có sẵn từ hai dịch vụ này. Ví dụ: sử dụng AWS AppSync enhanced subscription filtering để chỉ cập nhật các bảng hiển thị sân bay trong nhà ga nơi chúng đặt.
Để tìm hiểu thêm về serverless, hãy truy cập Serverless Land để có nhiều mẫu code có thể tận dụng, các hướng dẫn và tài liệu học tập. Một thhư viện mẫu mới được thêm là một EventBridge to AWS AppSync pattern tương tự như mẫu được mô tả trong bài đăng này. Truy cập tài liệu EventBridge để biết thêm chi tiết.
Để tìm hiểu thêm về các tài nguyên học hỏi serverless, hãy truy cập Serverless Land.
TAGS: contributed, serverless