của James Beswick | ngày 30 tháng 01 Năm 2024 | trong AWS IoT Core, AWS Step Functions, Serverless | Permalink | Share
Bài viết này được viết bởi Alex Paramonov, Sr. Solutions Architect, ISV và Pieter Prinsloo, Customer Solutions Manager.
Khối lượng công việc trong AWS đôi khithường xuyên yêu cầu truy cập những dữ liệu lưu trữ tại cơ sở dữ liệu tại và vị trí lưu trữ tại on-premises. Các giải pháp truyền thống để thiết lập kết nối các tài nguyên ở on-premises yêu cầu nhiều inbound rules đến tường lửa, một VPN tunnel hoặc một public endpoints.
Bài đăng trên blog này trình bày cách làm sao để sử dụng giao thức MQTT protocol (AWS IoT Core) với AWS Step Functions để gửi công việc đến on-premises để truy cập hoặc truy xuất dữ liệu được lưu trữ ở các thiết bị tại on-premises các tác vụ tới nhân viên tại on-premises, cho phép họ truy cập hoặc lấy dữ liệu được lưu trữ nội bộ. Các máy chủ có thể giao tiếp với các thiết bị ở on-premises mà không cần mở những inbound port hoặc những public endpoint trên tài nguyên tại on-premises. Các thiết bị ở on-premises có thể chạy sau bộ định tuyến Network Access Translation (NAT) trong khi vẫn duy trì kết nối 2 chiều với AWS Cloud. Điều này cung cấp tính bảo mật cao hơn và tiết kiệm chi phí hơn để truy cập dữ liệu được lưu trữ tại on-premises.
Tổng quan
Bằng cách sử dụng Step Functions với AWS Lambda và AWS IoT Core, bạn có thể truy cập dữ liệu lưu trữ on-premises một cách an toàn mà không cần làm thay đổi cấu hình mạng hiện có.
AWS IoT Core cho phép bạn kết nối các thiết bị IoT và định tuyến các message đến AWS services mà không cần quản lý cơ sở hạ tầng. Bằng cách sử dụng Docker container image chạy trên on-premises như một proxy cho IoT Thing, bạn có thể tận dụng MQTT message broker được quản lý hoàn toàn của AWS IoT Core dành cho các trường hợp sử dụng không phải IoT.
Các MQTT subscribersubscribers nhận thông tin thông qua MQTT topic. Một MQTT topic đóng vai trò như một cơ chế phù hợp giữa publisher và subscriber. Về mặt khái niệm, một MQTT topic hoạt động giống như một kênh thông báo nhất tạm thời. Bạn có thể tạo những topic trên quy mô lớn mà hầu như không có giới hạn số lượng topic. Ví dụ, trong các ứng dụng SaaS bạn có thể tạo topic cho mỗi tenant. Tìm hiểu thêm về MQTT topic ở đây.
Kiến trúc tham chiếu sau đây sử dụng AWS Serverless Application Model (AWS SAM) để phát triển, Step Functions để sắp xếp quy trình công việc, AWS Lambda để gửi và nhận on-premises message, và AWS IoT Core để cung cấp MQTT message broker, certificate và policy management, và publish/subscribe topics.
- Khởi động máy trạng thái state machine, “theo yêu cầu” hoặc theo lịch trình.
- Trạng thái: “Lambda: Kích hoạt Gửi Công việc đến On-Premises” publish một message đến một MQTT message broker trong AWS IoT Core.
- Message broker gửi message đến topic tương ứng với các tenant trong on-premises container để thực hiện các công việc
- On-premises container nhận message và bắt đầu thực thi công việc. Xác thực người dùng được hoàn thành bằng cách sử dụng các certificate và các policy đính kèm giới hạn quyền truy cập của các thiết bị vào tenant topic.
- Các thiết bị tại on-premises container có thể truy cập những tài nguyên tại chỗ như cơ sở dữ liệu (DBs) hoặc vị trí lưu trữ
- On-premises container gửi kết quả và trạng thái công việc trở về lại với MQTT topic khác
- AWS IoT Core rule gọi hàm Lambda “TaskToken Done”
- Lambda function gửi kết quả đến Step Functions thông qua SendTaskSuccess hoặc SendTaskFailure API.
Triển khai và kiểm tra ví dụ
Đảm bảo rằng bạn có thể quản lý các tài nguyên AWS từ terminal của bạn và:
- Đã cài đặt AWS CLI và AWS SAM CLI version mới nhất.
- Bạn có một tài khoản AWS. Nếu không bạn có thể tạo tại đây.
- Tài khoản user của bạn phải có đủ quyền để quản lý các tài nguyên AWS.
- Cài đặt Git.
.
- Cài đặt Python phiên bản 3.11 trở đi.
- Cài đặt Docker.
Bạn có thể truy cập GitHub repository này và làm theo các bước này để triển khai ví dụ.
Thư mục aws-resources bao gồm máy chủ trạng thái, các lambda function, các topic và các policy. Thư mục on-prem-worker bao gồm các Docker container image. Sử dụng nó để chạy các thiết bị tại on-premises.
Trong ví dụ này, các container được thêm 2 số, cung cấp như một input với định dạng như sau:
Trong trường hợp thực tế, bạn có thể thay thế các thao tác này bằng business logic của mình. Ví dụ, nhận dữ liệu từ các cơ sở dữ liệu tại on-premises, tạo và tổng hợp sau đó gửi kết quả trở về lại những máy chủ trạng thái.
Làm theo các bước này để kiểm tra toàn bộ ví dụ.
Sử dụng AWS IoT Core mà không cần các thiết bị IoT
Không có bất kỳ thiết bị IoT nào trong ví trường hợp ví dụ. Tuy nhiên MQTT message broker được quản lý hoàn toàn trong AWS IoT Core cho phép bạn định tuyến các message đến các dịch vụ AWS mà không cần quản lý cơ sở hạ tầng.
AWS IoT Core xác thực client sử dụng X.509 client certificates. Bạn có thể gắn một policy tới client certificate để cho phép client có thể publish và subscribe trên những topic nhất định. Các tiếp cận này không yêu cầu IAM credentials bên trong container tại on-premises.
Tính bảo mật, hiệu quả chi phí, cơ sở hạ tầng được quản lý và khả năng mở rộng của AWS IoT Core khiến giải pháp này phù hợp với nhiều ứng dụng kết hợp ngoài các trường hợp sử dụng IoT thông thường.
Gửi Phân công việc đến Step Functions và đợi phản hồi
Khi một state machinemáy chủ trạng thái đến bước để gửi công việc đến một thiết bị trên on-premises, việc quá trình thực thi tạm dừng và chờ đợi cho đến khi công việc hoàn thành. Các hàm hỗ trợ 3 mô hình tích hợp: Request-Response, Sync Run a Job, and Wait for a Callback with Task Token. Trong ví dụ này sử dụng tích hợp “Wait for a Callback with Task Token“ . Nó cho phép các máy chủ trạng thái dừng và đợi một callback lên đến 1 năm.
Khi thiết bị trên on-premises hoàn tất công việc, nó publish một message đến topic trong AWS IoT Core. Một rule trong AWS IoT Core sau đó gọi một Lambda function để gửi kết quả trở về máy chủ trạng thái bằng cách gọi SendTaskSuccess hoặc SendTaskFailure API trong Step Functions.
Bạn có thể ngăn chặn state machinemáy chủ trạng thái hết thời gian chờ bằng cách thêm HeartbeatSeconds vào công việc trong Amazon States Language (ASL). Hết thời gian chờ xảy ra nếu một công việc bị treo và SendTaskFailure API không được gọi. HeartbeatSeconds sẽ gửi heartbeats đến các thiết bị thông qua việc gọi SendTaskHeartbeat API và phải nhỏ hơn TimeoutSeconds được chỉ định.
Để tạo ra một công việc trong ASL cho máy chủ trạng thái của bạn đang đợi một callback token, làm theo đoạn code sau:
Hậu tố .waitForTaskToken biểu thị rằng công việc phải đợi một callback. State machine Máy chủ trạng thái tạo ra một callback token duy nhất, có thể truy cập từ biến tích hợp $$.Task.Token, và chuyển nó thành input của Lambda function được định nghĩa xác định trong FunctionName.
Lambda function sau đó sẽ gửi token đến thiết bị tại on-premises thông qua một AWS IoT Core topic.
Lambda không phải là dịch vụ duy nhất hỗ trợ tích hợp Wait for Callback – xem tất cả dịch vụ hỗ trợ tại đây.
Ngoài việc gửi nhiệm vụ và nhận lại kết quả, bạn có thể triển khai cơ chế theo dõi tiến độ và tắt máy. Để theo dõi tiến độ, các thiết bị gửi số liệu qua một topic riêng.
Tùy thuộc vào cách triển khai của bạn, bạn có một vài tùy chọn:
- Lưu dữ dữ liệu tiến trình từ các thiết bị tại on-premises trong Amazon DynamoDB và trực quan hóa nó thông qua các lệnh gọi REST API tới Lambda function để đọc từ DynamoDB table. Hãy tham khảo tutorial này để biết làm cách nào lưu dữ liệu trực tiếp vào DynamoDB từ topic
- Để có một trải nghiệm người dùng tốt, tạo ra một rule để gọi Lambda function khi dữ liệu tiến trình mới tới. Ở một kết nối WebSocket đến backend của bạn. Lambda function sẽ gửi dữ liệu tiến trình thông qua WebSocket trực tiếp đến frontend.
Để triển khai một cơ chế tắt máy, bạn có thể thực hiện công việc trong các luồng khác nhau trên các thiết bị tại on-premises và subscribe đến topic, đề topic mà máy trạng thái của bạn publish các thông báo tắt máy. Nếu một thông báo tắt máy đến, kết thúc chuỗi công việc trên các thiết bị trên on-premises và gửi lại trạng thái bao gồm mã thông báo gọi lại của tác vụ.
Sử dụng AWS IoT Core Rules và Lambda Functions
Một message với kết quả của công việc từ các thiết bị trên on-premises không đến trực tiếp Step Functions API. Thay vào đó, một AWS IoT Core Rule và một Lambda function chuyên dụng sẽ điều hướng trạng thái của message đến Step Functions. Điều này cho phép cấp các quyền chi tiết hơn vì các container chỉ có thể publish và subscribe đến những topic nhất định. Không có IAM credentials tồn tại tong on-premises.
Lambda function’s execution role chứa các quyền để chỉ gọi SendTaskSuccess, SendTaskHeartbeat, và SendTaskFailure API.
Ngoài ra, các thiết bị trên on-premises có thể chạy các lệnh gọi API trong quy trình làm việc của Step Function một các trực tiếp, thay thế nhu cầu về môt topic trong AWS IoT Core, một rule và một Lambda function để gọi Step Functions API. Cách tiếp cận này yêu cầu IAM credentials bên trong các container. Bạn có thể sử dụng AWS Identity and Access Management Roles Anywhere để có được các credentials tạm thời. Khi các chức năng của thiết bị trên on-premises của bạn phát triển theo thời gian, bạn có thể thêm các lệnh gọi API AWS khác trong khi thêm quyền vào IAM execution role.
Dọn dẹp
Các dịch vụ được sử dụng trong giải phảipháp này đủ điều kiện để hưởng AWS Free Tier. Để dọn dẹp tài nguyên trong folder aws-resources/ chạy lệnh:
Thao tác này sẽ xóa tất cả tài nguyên được cung cấp bởi tệp template.yml.
Để xóa client certificate khỏi AWS, truy cập AWS IoT Core Certificates và xóa certificate mà bạn đã thêm vào trong các bước triển khai thủ công.
Tiếp theo, dừng các Docker container trên on-premises và xóa nó:
Cuối cùng, xóa các container image:
Kết luận
Truy xuất các tài nguyên trên on-premises với các thiết bị thông qua Step Functions sử dụng MQTT và AWS IoT Core là một cách an toàn, phản ứng nhanh và tiết kiệm chi phí để thực hiện các công việc tại on-premises. Hãy cân nhắc việc cập nhật khối lượng công việc kết hợp của bạn từ việc sử dụng công cụ lập lịch hoặc polling không hiệu quả sang phương pháp phản ứng được mô tả trong bài đăng này. Điều này mang lại trải nghiệm người dùng được cải thiện với khả năng điều phối và theo dõi công việc nhanh chóng bên ngoài Cloud.
Để biết thêm tài nguyên học tập không có máy chủ, hãy truy cập Serverless Land.