by Eric Johnson | on 24 MAY 2023 | in AWS Lambda, AWS Step Functions, Serverless | Permalink | Share
Bài blog này được viết bởi Sam Wilson, Cloud Application Architect và John Lopez, Cloud Application Architect.
Slack,như một dịch vụ hợp tác và giao tiếp doanh nghiệp, mở ra cơ hội cho những người xây dựng cải thiện hiệu suất thông qua việc triển khai Slack Applications được viết tùy chỉnh (apps). Một trong những cơ hội như vậy là tiết lộ các tài nguyên AWS hiện có của bạn cho tổ chức mà không cần nhân viên của bạn cần truy cập AWS Management Console hoặc AWS CLI.
Ví dụ, một thành viên của nhóm phân tích dữ liệu của bạn cần kích hoạt một luồng làm việc AWS Step Functions để xử lý lại một công việc dữ liệu hàng loạt. Thay vì cấp quyền truy cập trực tiếp cho người dùng vào quá trình làm việc Step Functions trong AWS Management Console hoặc AWS CLI, bạn có thể cung cấp quyền truy cập để gọi quá trình làm việc từ bên trong một kênh Slack được chỉ định.
Blog này giải thích cách kiến trúc serverless cho phép người dùng Slack gọi các tài nguyên AWS như các chức năng AWS Lambda và Step Functions thông qua Slack Desktop UI và Mobile UI bằng cách sử dụng các ứng dụng Slack. Kiến trúc Serverless là lựa chọn lý tưởng cho một ứng dụng Slack vì khả năng mở rộng của nó. Nó có thể xử lý hàng ngàn yêu cầu đồng thời cho người dùng Slack mà không gánh nặng của việc quản lý chi phí vận hành.
Ví dụ này hỗ trợ tích hợp với các tài nguyên AWS khác thông qua Step Functions. Truy cập tài liệu để biết thêm thông tin về tích hợp với các tài nguyên AWS khác.
Bài viết này giải thích kiến trúc ví dụ serverless và hướng dẫn cách triển khai ví dụ trong tài khoản AWS của bạn. Nó minh họa ví dụ và thảo luận về các ràng buộc phát hiện trong quá trình phát triển.
Tổng quan
Mã được bao gồm trong bài viết này tạo ra một ứng dụng Slack được xây dựng bằng một loạt các dịch vụ không máy chủ của AWS:
- Amazon API Gateway nhận tất cả các yêu cầu đến từ Slack. Step Functions điều phối các hoạt động yêu cầu như xác thực người dùng, lấy cấu hình, định tuyến yêu cầu và định dạng phản hồi.
- Một Lambda Function gọi chức năng xác thực cụ thể cho Slack và gửi phản hồi đến Slack UI.
- Amazon EventBridge hoạt động như một tích hợp pub-sub giữa một yêu cầu và bộ xử lý yêu cầu.
- Amazon DynamoDB lưu trữ quyền cho mỗi người dùng Slack để đảm bảo họ chỉ có quyền truy cập vào các tài nguyên bạn chỉ định.
- AWS Systems Manager lưu trữ kênh Slack cụ thể mà bạn sử dụng ứng dụng Slack.
- AWS Secrets Manager lưu trữ bí mật ký của ứng dụng Slack và mã thông báo bot được sử dụng cho xác thực.
AWS Cloud Development Kit (AWS CDK) triển khai các tài nguyên AWS. Ví dụ này có thể kết nối vào bất kỳ nền tảng CI/CD hiện có nào mà bạn lựa chọn.
- Người dùng Slack trên máy tính hoặc di động bắt đầu yêu cầu bằng cách sử dụng lệnh gạch chéo /my-slack-bot hoặc tương tác với một phần tử giao diện người dùng Slack Block Kit.
- API Gateway chuyển tiếp yêu cầu và chuyển đổi tải vào một định dạng mà luồng làm việc xác nhận yêu cầu có thể chấp nhận.
- Trình xác nhận yêu cầu kích hoạt chức năng Lambda xác thực Slack để xác minh rằng yêu cầu xuất phát từ tổ chức Slack được cấu hình. Chức năng Lambda này sử dụng thư viện Slack Bolt library for TypeScript để thực hiện xác thực yêu cầu và trích xuất thông tin yêu cầu thành một tải hàng đều nhau. Ngoài ra, Secrets Manager lưu trữ một bí mật ký, mà API Slack Bolt sử dụng trong quá trình xác thực.
- Trình xác nhận yêu cầu truy vấn bảng DynamoDB Authorized Users với tên người dùng được trích xuất từ tải yêu cầu. Nếu người dùng không tồn tại, yêu cầu kết thúc với một phản hồi không được ủy quyền.
- Trình xác nhận yêu cầu lấy ID kênh được phép và so sánh nó với ID kênh được tìm thấy trong yêu cầu. Nếu hai ID kênh không khớp nhau, yêu cầu kết thúc với một phản hồi không được ủy quyền.
- Trình xác nhận yêu cầu gửi yêu cầu đến bus sự kiện Command trong EventBridge.
- Bus sự kiện Command sử dụng thuộc tính hành động của yêu cầu để định tuyến yêu cầu đến một luồng làm việc xử lý yêu cầu của Step Functions.
- Mỗi luồng làm việc xử lý có thể xây dựng các phần tử giao diện người dùng Slack Block Kit, gửi cập nhật đến các phần tử giao diện người dùng hiện có, hoặc gọi các chức năng Lambda và luồng làm việc Step Functions hiện có.
- Ứng dụng Slack trên máy tính hoặc di động hiển thị các phần tử giao diện người dùng mới hoặc hiện cập nhật cho một yêu cầu hiện có khi nó được xử lý. Người dùng có thể tương tác với các phần tử giao diện người dùng mới để tiếp tục một yêu cầu hoặc bắt đầu lại với một yêu cầu bổ sung.
Kiến trúc ứng dụng này mở rộng cho các tải sản xuất, cung cấp khả năng xử lý hàng ngàn người dùng Slack đồng thời (thông qua chính nền tảng Slack), loại bỏ nhu cầu truy cập trực tiếp vào AWS Management Console. Kiến trúc này cung cấp cho việc mở rộng ứng dụng trò chuyện để hỗ trợ các lệnh mới dễ dàng khi nhu cầu của người tiêu dùng nảy sinh.
Cuối cùng, kiến trúc và triển khai của ứng dụng tuân theo hướng dẫn AWS Well-Architected cho Operational Excellence, Security, Reliability và Performance Efficiency.
- CDK quản lý cơ sở hạ tầng ứng dụng cho Operational Excellence Pillar.
- Secrets Manager và DynamoDB mã hóa dữ liệu khi lưu trữ cho Security Pillar.
- Kiến trúc này mở rộng theo chiều ngang với các chức năng Lambda và Step Functions cho Reliability Pillar.
- Kiến trúc không máy chủ loại bỏ nhu cầu duy trì máy chủ vật lý cho Performance Efficiency Pillar.
Step Functions là lựa chọn phù hợp cho ví dụ này vì dịch vụ này hỗ trợ tích hợp với nhiều dịch vụ AWS khác. Step Functions cho phép ví dụ này điều phối tương tác với các chức năng Lambda, bảng DynamoDB và bus sự kiện EventBridge với mã ít nhất.
Ví dụ này tận dụng Step Functions Express Workflows để hỗ trợ các hoạt động sự kiện phát sinh ở mức độ cao được tạo ra bởi ứng dụng Slack. Kết quả của việc sử dụng Express Workflows là một trình xử lý yêu cầu linh hoạt, có khả năng mở rộng có thể xử lý hàng chục nghìn yêu cầu mỗi giây. Để biết thêm thông tin, hãy xem xét sự khác biệt giữa standard and Express Workflows
Ví dụ được trình bày sử dụng AWS Secrets Manager để lưu trữ và truy xuất thông tin đăng nhập ứng dụng một cách an toàn. AWS Secrets Manager cung cấp những lợi ích sau:
- Lưu trữ an toàn và trung tâm của các bí mật thông qua mã hóa tại thời điểm nghỉ.
- Dễ dàng quản lý quyền truy cập thông qua các chính sách quyền IAM của AWS.
- Hỗ trợ tích hợp ngay lập tức với tất cả các dịch vụ AWS cấu thành kiến trúc.
Ngoài ra, ví dụ này sử dụng dịch vụ AWS Systems Manager Parameter Store để lưu trữ dữ liệu cấu hình của ứng dụng của chúng tôi cho Slack Channel ID. Trong số những lợi ích được cung cấp bởi AWS System Manager, ví dụ này tận dụng việc lưu trữ dữ liệu cấu hình được mã hóa với hỗ trợ phiên bản.
Ví dụ này có nhiều loại tương tác cho ứng dụng Slack trên điện thoại di động hoặc máy tính để bàn, bao gồm hiển thị màn hình chào mừng, nhập thông tin vào biểu mẫu và báo cáo trạng thái quá trình. EventBridge cho phép ví dụ này định tuyến yêu cầu từ Bước Xác nhận yêu cầu sử dụng Event Bus không máy chủ và tách biệt mỗi hành động từ nhau. Chúng tôi cấu hình Quy tắc để liên kết một sự kiện với một bước xử lý yêu cầu.
This example features a variety of interactions for the Slack Mobile or Desktop application, including displaying a welcome screen, entering form information, and reporting process status. EventBridge enables this example to route requests from the Request Validator Step Function using the serverless Event Bus and decouple each action from one another. We configure Rules to associate an event to a request processor Step Function.
Walkthrough
Các yêu cầu tiên quyết, bạn cần các điều sau:
- AWS CDK version 2.19.0 or later.
- Node version 16+.
- Docker-cli.
- Git.
- Một tài khoản Slack cá nhân hoặc của công ty với quyền tạo ứng dụng.
- Slack Channel ID của một kênh trong không gian làm việc của bạn để tích hợp với ứng dụng Slack.
Để lấy Channel ID, mở context menu trên kênh Slack và chọn View channel details. Cửa sổ hiển thị Channel ID của bạn ở phía dưới:
Để tìm hiểu thêm, truy cập trang Getting Started with Bolt for JavaScript của Slack.
Tài liệu README cho Repository GitHub có tiêu đề, Amazon Interactive Slack App Starter Kit, chứa một hướng dẫn toàn diện, bao gồm các bước chi tiết cho:
- Cấu hình API Slack
- Triển khai ứng dụng thông qua AWS Cloud Development Kit (CDK)
- Cập nhật cần thiết cho Parameters và secrets của AWS Systems Manager
Demo ứng dụng Slack
- Bắt đầu ứng dụng Slack bằng cách gọi slash command /my-slack-bot.
- Từ My Slack Bot action menu, chọn Sample Lambda.
- Nhập đầu vào lệnh, chọn Submit, sau đó quan sát phản hồi (giá trị đầu vào này áp dụng cho sample Lambda function).
Sample Lambda submit
Sample Lambda results
- Bắt đầu ứng dụng Slack bằng cách gọi slash command /my-slack-bot, sau đó chọn Sample State Machine:
Start sample state machine invocation
Select Sample State Machine
- Nhập vào command input, chọn Submit, sau đó quan sát phản hồi (giá trị đầu vào này áp dụng cho downstream state machine).
Sample state machine submit
Sample state machine results
Hạn chế trong ví dụ này
Slack có các ràng buộc khi gửi và nhận yêu cầu, nhưng các mẫu ánh xạ của API Gateway cung cấp cơ chế để tích hợp với một loạt các ràng buộc yêu cầu
Slack sử dụng application/x-www-form-urlencoded để gửi yêu cầu đến một URL tùy chỉnh. Chúng tôi đã thiết kế một mẫu yêu cầu để định dạng đầu vào từ Slack thành một định dạng nhất quán cho Bước Xác nhận yêu cầu. Các tiêu đề như X-Slack-Signature và X-Slack-Request-Timestamp cần được chuyển tiếp để đảm bảo yêu cầu từ Slack là xác thực.
Dưới đây là mẫu ánh xạ yêu cầu cần thiết cho việc tích hợp:
| { “stateMachineArn”: “arn:aws:states:us-east-1:827819197510:stateMachine:RequestValidatorB6FDBF18-FACc7f2PzNAv”, “input”: “{\”body\”: \”$input.path(‘$’)\”, \”headers\”: {\”X-Slack-Signature\”: \”$input.params().header.get(‘X-Slack-Signature’)\”, \”X-Slack-Request-Timestamp\”: \”$input.params().header.get(‘X-Slack-Request-Timestamp’)\”, \”Content-Type\”: \”application/x-www-form-urlencoded\”}}” } |
Slack gửi tải dữ liệu tin nhắn theo hai định dạng khác nhau: URL-encoded và JSON. May mắn thay, thư việnSlack Bolt for JavaScript có thể hợp nhất hai định dạng yêu cầu thành một tải dữ liệu JSON duy nhất và xử lý xác thực.
Slack yêu cầu một phản hồi trạng thái 204 cùng với một thân trống để nhận biết rằng một yêu cầu đã thành công. Một mẫu phản hồi tích hợp ghi đè phản hồi của Bước Xử lý thành một định dạng mà Slack chấp nhận.
Dưới đây là mẫu ánh xạ phản hồi cần thiết cho việc tích hợp:
| #set($context.responseOverride.status = 204) {} |
Kết luận
Trong bài đăng trên blog này, bạn đã tìm hiểu cách cho phép người dùng Slack trong tổ chức của bạn có khả năng kích hoạt các tài nguyên AWS hiện có của bạn mà không cần truy cập vào AWS Management Console hoặc AWS CLI. Ví dụ không máy chủ này cho phép bạn xây dựng các luồng làm việc tùy chỉnh để đáp ứng nhu cầu của tổ chức của bạn.
Để tìm hiểu thêm về các khái niệm được thảo luận trong bài viết này, hãy truy cập:
- AWS Lambda Node.js library
- Using TypeScript — Slack Bolt for JavaScript
- AWS Secrets Manager construct library
- Using AWS Step Functions with other services
Để tìm hiểu thêm về các tài nguyên học serverless, hãy truy cập Serverless Land.