___
by James Beswick | on 29 AUG 2023 | in Amazon Simple Storage Service (S3), AWS Step Functions, Serverless | Permalink |
Bài đăng này được viết bởi Isalm Elhamaky, Senior kiến trúc sư giải pháp và Adrian Tadros, Kiến trúc sư giải pháp.
S3 là dịch vụ lưu trữ đám mây được nhiều khách hàng sử dụng cho lưu trữ tệp an toàn. S3 cung cấp một tính năng gọi là URL chỉ định để tạo liên kết tải xuống tạm thời, đây là cách hiệu quả và an toàn để tải lên và tải xuống dữ liệu được người dùng ủy quyền.
Đôi khi khách hàng cần kiểm soát nhiều hơn cách truy cập dữ liệu. Ví dụ, họ có thể muốn giới hạn tải xuống dựa vào IAM roles thay vì URLs chỉ định, hoặc giới hạn số phần download đối tượng để kiểm soát chi phí truy cập dữ liệu. Ngoài ra, nó có thể hữu ích để theo dõi các cá nhân truy cập các URLs tải xuống.
Bài đăng trên blog hiện tại là một ứng dụng mẫu có thể cung cấp bổ sung chức năng bổ sung này bằng cách sử dụng các dịch vụ serverless của AWS.
Tổng quan
Mã trong ví dụ này sử dụng nhiều dịch vụ serverless:
- API Gateway nhận tất cả request từ người dùng và xác thực truy cập sử dụng Cognito.
- Step Function điều phối các hoạt động chia sẻ file và tải xuống như là xác thực người dùng, kiểm tra tính đủ điều kiện tải xuống, ghi lại sự kiện, định tuyến request và định dạng phản hồi.
- Lambda triển khai các hoạt động của quản trị viên như là truy vấn siêu dữ liệu, danh sách file và xóa.
- DynamoDB lưu trữ các quyền để đàm bảo người dùng chỉ có thể truy cập file đã được chia sẻ với họ.
- S3 cung cấp bộ nhớ bền cho người dùng tải lên và tải xuống file.
- Athena cung cấp một cách hiệu quả để truy vấn S3 Access Logs nhằm trích xuất nội dung tải xuống và mức sử dụng băng thông.
- QuickSight cung cấp dashboard trực quan để phân tích tải xuống và băng thông.
AWS Cloud Development Kit (AWS CDK) triển khai tài nguyên AWS có thể đưa vào quy trình CI/CD.
Kiến trúc tổng quan
- Giao diện người dùng: Mặt trước là một ứng dụng trang đơn React tĩnh được host trên S3 và được cung cấp qua CloudFront . UI sử dụng AWS NorthStar và Cloudscape thiết kế thành phần. Amplify UI đơn giản hóa tương tác với Cognito như là cung cấp khả năng đăng nhập, đăng ký và thực hiện xác minh email.
- API Gateway: người dùng tương tác thông qua REST API của API Gateway.
- Authentication: Cognito quản lý xác thực người dùng và truy cập. Người dùng đăng ký sử dụng với địa chỉ email của họ và sau đó xác thực địa chỉ email đó. Requests đến API bao gồm access token, được xác minh bằng Cognito authorizer.
- Microservices: Các hoạt động cốt lõi được xây dựng với Lambda. Luồng làm việc chính cho phép người dùng chia sẻ và tải xuống file, Step Function điều phối các bước trong quy trình. Chúng có thể bao gồm xác thực yêu cầu, ủy quyền người dùng có quyền chính xác truy cập file, gửi thông báo, kiểm thử, theo dõi ai đang truy cập tệp.
- Permission store: DynamoDB lưu trữ thông tin cần thiết về các tệp như chi tiết quyền sở hữu và quyền chia sẻ. Nó theo dõi ai sở hữu tệp và ai đã được cấp quyền truy cập để tải xuống tệp đó.
- File store: S3 bucket là trung tâm file dự án. Mỗi người dùng có một thư mục chuyên dụng trong S3 bucket để lưu trữ file.
- Notifications: Giải pháp sử dụng SNS để gửi thông báo email đến người nhận khi một file được chia sẻ.
- Analystics: S3 Access Logs được tạo bất cứ khi nào người dùng tải xuống hoặc tải tệp lên vùng lưu trữ tệp. Amazon Athena lọc các nhật ký này để tạo báo cáo tải xuống, trích xuất thông tin quan trọng (chẳng hạn như danh tính của người dùng đã tải xuống tệp và tổng băng thông đã sử dụng trong quá trình tải xuống).
- Reporting: QuickSight cung cấp giao diện cho quản trị viên xem tải xuống báo cáo và dashboard.
Hướng dẫn
Là điều kiện tiên quyết, bạn cần:
- Node.js phiên bản 16+.
- AWS CLI phiên bản 2+.
- Tài khoản AWS và profile được thiết lập trên máy tính của bạn.
Làm theo hướng dẫn trong nguồn code repository để triển khai ví dụ vào tài khoản AWS của bạn. Sau khi ứng dụng được triển khai, bạn có thể truy cập vào giao diện người dùng.
Trong ví dụ này, bạn sẽ thực hiện các bước để tạo tệp tải lên và chia sẻ tệp đó với người nhận:
- Ví dụ này yêu cầu người dùng nhận dạng chính họ bằng địa chỉ email. Chọn Create Account sau đó Sign In bằng thông tin đăng nhập của bạn.
2. Chọn Share a file.
3. Chọn Choose file đến trình duyệt và chọn file để chia sẻ. Chọn Next
4. Bạn phải điền ít nhất 1 người nhận. Chọn Add recipient để thêm nhiều người nhận. Chọn Next.
5. Đặt Expire date và Limit downloads để cấu hình ngày hết hạn chia sẻ và giới hạn số lượt tải xuống. Chọn Next.
6. Xem lại chi tiết yêu cầu chia sẻ. Bạn có thể điều hướng đến các màn hình trước đó để sửa đổi. Chọn Send sau khi hoàn tất.
7. Chọn My file để xem file chia sẻ của bạn
Mở rộng giải pháp
Ví dụ sử dụng Step Functions để cho phép bạn mở rộng và tùy chỉnh quy trình công việc. Điều này triển khai quy trình làm việc mặc định, cung cấp cho bạn khả năng ghi đè logic hoặc giới thiệu các bước mới để đáp ứng yêu cầu của bạn.
Phần này sẽ hướng dẫn hành vi mặc định của quy trình làm việc của Chức năng Bước chia sẻ tệp và tệp tải xuống.
Chia sẻ luồng file làm việc
Quy trình chia sẻ tệp bao gồm các bước sau:
- Xác thực: kiểm tra xem yêu cầu chia sẻ có chứa tất cả các trường bắt buộc hay không.
- Nhận thông tin người dùng: truy xuất thông tin người dùng đã đăng nhập như tên và địa chỉ email từ Amazon Cognito.
- Ủy quyền: kiểm tra các quyền được lưu trữ trong DynamoDB để xác minh xem người dùng có sở hữu tệp và có quyền chia sẻ tệp hay không.
- Kiểm toán: ghi lại nỗ lực chia sẻ cho mục đích kiểm toán.
- Quy trình: cập nhật kho cấp phép trong DynamoDB.
- Gửi thông báo: gửi thông báo qua email đến người nhận để cho họ biết rằng một tệp mới đã được chia sẻ với họ.
Quy trình làm việc tải xuống tệp
Quy trình tải xuống tệp bao gồm các bước sau:
- Xác thực: kiểm tra xem yêu cầu tải xuống có chứa các trường bắt buộc hay không (ví dụ: ID người dùng và ID tệp).
- Nhận thông tin người dùng: truy xuất thông tin của người dùng từ Amazon Cognito như tên và địa chỉ email của họ.
- Ủy quyền: kiểm tra kho lưu trữ quyền trong DynamoDB để kiểm tra xem người dùng có sở hữu tệp hay không hoặc là người nhận hợp lệ có quyền tải tệp xuống hay không.
- Kiểm tra: ghi lại nỗ lực tải xuống.
- Quy trình: tạo URL tải xuống được ký trước S3 trong thời gian ngắn và trả lại cho người dùng
Ánh xạ dữ liệu API của Step Function
Ví dụ này sử dụng API Gateway ánh xạ dữ liệu yêu cầu và phản hồi để cho phép REST API giao tiếp với đường dẫn với Step Function. Điều này chọn hiển thị làm thế nào để tùy chỉnh ánh xạ dựa vào trường hợp sử dụng.
Request dữ liệu ánh xạ
API Gateway REST API sử dụng mẫu Apache VTL để chuyển đổi và xây dựng các yêu cầu tới dịch vụ cơ bản. Giải pháp này trừu tượng hóa việc khởi tạo các mẫu này bằng cấu trúc CDK:
| JavaScriptapi.root.addResource(‘share’).addResource(‘{fileId}’).addMethod( ‘POST’, StepFunctionApiIntegration(shareStepFunction, [ { name: ‘fileId’, sourceType: ‘params’ }, { name: ‘recipients’, sourceType: ‘body’ }, /* your custom input fields */ ]), |
Cấu trúc StepFunctionApiIntegration xử lý ánh xạ yêu cầu cho phép bạn trích xuất các trường từ yêu cầu API đến và chuyển chúng làm đầu vào cho quy trình làm việc của Step Functions. Điều này tạo ra mẫu VTL sau:
| Json{ “name”: “$context.requestId”, “input”: “{\”userId\”:\”$context.authorizer.claims.sub\”,\”fileId\”:\”$util.escap eJavaScript($input.params(‘fileId’))\”,\”recipients\”:$util.escapeJavaScript($input.json(‘$.recipients’))}”, “stateMachineArn”: “…stateMachineArn”} |
Trong trường hợp này, file được trích xuất từ tham số API request, body và authorization header rồi chuyền vào luồng làm việc. Bạn có thể tùy chỉnh cấu hình để đáp ứng yêu cầu của bạn.
Ánh xạ dữ liệu phản hồi
Ví dụ này có các mẫu ánh xạ phản hồi bằng cách sử dụng Apache VTL. Đầu ra của bước cuối cùng trong quy trình làm việc được ánh xạ dưới dạng phản hồi JSON và được trả về cho người dùng thông qua API Gateway. Phản hồi cũng bao gồm các tiêu đề CORS :
| Apache#set($context.responseOverride.header.Access-Control-Allow-Headers = ‘*’)#set($context.responseOverride.header.Access-Control-Allow-Origin = ‘*’)#set($context.responseOverride.header.Access-Control-Allow-Methods = ‘*’)#if($input.path(‘$.status’).toString().equals(“FAILED”))#set($context.responseOverride.status = 500){ “error”: “$input.path(‘$.error’)”, “cause”: “$input.path(‘$.cause’)”}#else $input.path(‘$.output’)#end |
Bạn có thể tùy chỉnh mẫu phản hồi để đáp ứng nhu cầu của mình. Ví dụ bạn có thể cung cấp tùy chỉnh hành vi cho các mã phản hồi khác nhau.
Kết luận
Trong bài đăng này, bạn tìm hiểu cách chia sẻ tệp một cách an toàn với các bên được ủy quyền bên ngoài và theo dõi truy cập của họ bằng dịch vụ serverless của AWS. Ứng dụng mẫu đại diện sử dụng Step Function để cho phép bạn mở rộng và tùy chỉnh luồng làm việc nhằm đáp ứng trường hợp sử dụng của bạn.
Để tìm hiểu hơn về bối cảnh thảo luận, thăm:
- The example ứng dụng Github repo
- Sharing objects with presigned URLs
- Using AWS Step Functions with other services
- Cloudscape design system for the cloud
- Mapping template utility reference
Để biết thêm tài nguyên học tập serverless, truy cập Serverless Land. Học về xử lý dữ liệu trong Step Function bằng cách đọc hướng dẫn Introduction to Distributed Map for Serverless Data Processing.
TAGS: đã đóng góp, serverless.