Bài đăng này được viết bởi Islam Elhamaky, Senior Solutions Architect and Adrian Tadros, Senior Solutions Architect.
Amazon S3 là một dịch vụ lưu trữ đám mây mà nhiều khách hàng sử dụng để lưu trữ tập tin một cách an toàn. S3 cung cấp tính năng gọi là presigned URLs (Liên kết được đăng ký trước) để tạo ra các liên kết tải xuống tạm thời, là cách hiệu quả và an toàn để tải lên và xuống dữ liệu cho người dùng được ủy quyền.
Có những lúc khách hàng cần kiểm soát nhiều hơn về cách truy cập dữ liệu. Ví dụ, họ có thể giới hạn việc tải xuống dựa trên vai trò IAM thay vì sử dụng presigned URLs, hoặc giới hạn số lượng lần tải xuống cho mỗi đối tượng để kiểm soát chi phí truy cập dữ liệu. Ngoài ra, việc theo dõi các cá nhân truy cập vào các liên kết tải xuống cũng hữu ích.
Bài blog này trình bày một ví dụ về ứng dụng có thể cung cấp các chức năng bổ sung này, sử dụng các dịch vụ AWS serverless (Dịch vụ không máy chủ).
Tổng quan
Mã nguồn được bao gồm trong ví dụ này sử dụng một loạt các dịch vụ AWS serverless.
- Amazon API Gateway nhận tất cả các yêu cầu từ người dùng và xác thực quyền truy cập bằng cách sử dụng Amazon Cognito.
- AWS Step Functions điều phối các hoạt động chia sẻ và tải xuống tập tin như xác thực người dùng, kiểm tra độ hợp lệ khi tải xuống, ghi sự kiện, định tuyến yêu cầu và định dạng phản hồi.
- AWS Lambda thực hiện các hoạt động quản trị như lấy dữ liệu thông tin, liệt kê các tập tin và xóa chúng.
- Amazon DynamoDB lưu trữ các quyền để đảm bảo người dùng chỉ có quyền truy cập vào các tập tin đã được chia sẻ với họ.
- Amazon S3 cung cấp lưu trữ bền vững cho người dùng tải lên và tải xuống tập tin.
- Amazon Athena cung cấp một cách hiệu quả để truy vấn S3 Access Logs để trích xuất thông tin về tải xuống và sử dụng băng thông.
- Amazon QuickSight cung cấp một bảng điều khiển trực quan để xem phân tích tải xuống và băng thông.
AWS Cloud Development Kit (AWS CDK) triển khai các tài nguyên AWS và có thể kết nối với quy trình CI/CD của bạn.
Kiến trúc tổng quan
1. Giao diện người dùng: Giao diện người dùng là một ứng dụng React tĩnh được lưu trữ trên S3 và cung cấp dịch vụ thông qua Amazon CloudFront. Giao diện người dùng sử dụng các thành phần thiết kế AWS NorthStar và Cloudscape. Amplify UI đơn giản hóa các tương tác với Amazon Cognito như cung cấp khả năng đăng nhập, đăng ký và thực hiện xác minh email.
2. API Gateway: Người dùng tương tác thông qua một API Gateway REST API.
3. Xác thực: Amazon Cognito quản lý các danh tính và quyền truy cập của người dùng. Người dùng đăng ký bằng địa chỉ email của họ và sau đó xác minh địa chỉ email. Các yêu cầu đến API bao gồm một mã thông báo truy cập, được xác minh bằng cách sử dụng một bộ xác thực Amazon Cognito.
4. Microservices: Các vận hành chính được xây dựng bằng Lambda. Quy trình làm việc chính cho phép người dùng chia sẻ và tải xuống tập tin. Step Functions điều phối các bước trong quá trình. Các bước này có thể bao gồm xác minh yêu cầu, xác thực người dùng có quyền truy cập đúng để truy cập tập tin, gửi thông báo, kiểm tra và theo dõi ai đang truy cập vào tập tin.
5. Bảng phân quyền: DynamoDB lưu trữ thông tin cần thiết về các tập tin như chi tiết sở hữu và quyền truy cập để chia sẻ. Nó theo dõi ai sở hữu một tập tin và ai đã được cấp quyền truy cập để tải xuống nó.
6. Kho lưu trữ tập tin: Một S3 bucket là kho lưu trữ tập tin trung tâm. Mỗi người dùng có một thư mục riêng trong S3 bucket để lưu trữ các tập tin.
7. Thông báo: Giải pháp sử dụng Amazon Simple Notification Service (SNS) để gửi thông báo qua email cho người nhận khi một tập tin được chia sẻ.
8. Phân tích: S3 Access Logs được tạo ra mỗi khi người dùng tải xuống hoặc tải lên tập tin vào bucket lưu trữ tập tin. Amazon Athena lọc những nhật ký này để tạo ra một báo cáo tải xuống, trích xuất thông tin chính (như danh tính của người dùng đã tải xuống tập tin và tổng băng thông tiêu thụ trong quá trình tải xuống).
9. Báo cáo: Amazon QuickSight cung cấp một giao diện cho các quản trị viên để xem báo cáo tải xuống và bảng điều khiển.
Hướng dẫn
Bạn cần chuẩn bị:
- Node.js phiên bản 16+
- AWS CLI phiên bản 2+
- Một tài khoản AWS và một hồ sơ được thiết lập trên máy tính của bạn.
Làm theo hướng dẫn trong code repository (Kho lưu trữ mã) để triển khai ví dụ trên tài khoản AWS của bạn. Một khi ứng dụng được triển khai, bạn có thể đăng nhập vào giao diện người dùng.
Trong ví dụ, bạn làm theo từng bước hướng dẫn để tạo tệp tải lên và chia sẻ nó với người nhận:
- Ví dụ yêu cầu người dùng xác thực danh tính của họ bằng địa chỉ emal. Chọn Creat Account và Sign in với thông tin xác thực của bạn.
- Chọn Share a file.
- Chọn Choose file từ trình duyệt và chọn chia sẻ file. Nhấn Next.
- Bạn phải điền ít nhất một người nhận. Chọ Add recipient để thêm người nhận. Nhấn Next.
- Cài đặ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ần cho phép tải về. Nhấn Next.
- Xem lại thông tin chi tiết yêu cầu chia sẻ. Bạn có thể chuyển về bước trước đó để chỉnh sửa. Nhấn Submit để hoàn thành.
- Chọn My files để xem lại tệp tin mà bạn chia sẻ.
Giải pháp mở rộng
Ví dụ sử dụng Step Functions để cho phép bạn mở rộng và tùy chỉnh quy trình hoạt động. Điều này thực hiện một 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 nhu cầu của bạn.
Phần này đi qua tính chất mặc định của các quy trình Share File và Download File của Step Functions.
Quy trình chia sẻ tệp tin
Quy trình làm việc chia sẻ tập tin bao gồm các bước sau:
1. Validate: 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.
2. Get User Info: Lấy thông tin của người dùng đăng nhập như tên và địa chỉ email từ Amazon Cognito.
3. Authorize: 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 tin và có quyền chia sẻ tập tin không.
4. Audit: Ghi lại việc chia sẻ để kiểm tra.
5. Process: Cập nhật lưu trữ quyền trong DynamoDB.
6. Send notifications: Gửi email thông báo cho người nhận để thông báo rằng một tập tin mới đã được chia sẻ với họ.
Quy trình tải tệp tin
Quy trình làm việc tải xuống tập tin bao gồm các bước sau:
1. Validate: Kiểm tra xem yêu cầu tải xuống có chứa các trường bắt buộc (ví dụ: ID người dùng và ID tập tin) không.
2. Get user info: Lấy thông tin của người dùng từ Amazon Cognito như tên và địa chỉ email của họ.
3. Authorize: Kiểm tra các quyền được lưu trữ trong DynamoDB để kiểm tra xem người dùng có sở hữu tập tin hoặc là người nhận hợp lệ có quyền tải xuống tập tin không.
4. Audit: Ghi lại việc tải xuống.
5. Process: Tạo một URL S3 pre-signed tải xuống có thời hạn ngắn và trả về cho người dùng.
Ánh xạ dữ liệu Step Functions API
Ví dụ sử dụng ánh xạ dữ liệu request (yêu cầu) và ánh xạ dữ liệu response (phản hồi) của API Gateway để cho phép REST API giao tiếp trực tiếp với Step Functions. Phần này chỉ ra cách tùy chỉnh ánh xạ phù hợp với trường hợp của bạn.
Ánh xạ dữ liệu request
API Gateway REST API sử dụng các mẫu Apache VTL để biến đổi và xây dựng các yêu cầu đến dịch vụ cơ sở. Giải pháp này trừu tượng hóa việc xây dựng các mẫu này bằng cách sử dụng một cấu trúc CDK.
| #JavaScript api.root .addResource(‘share’) .addResource(‘{fileId}’) .addMethod( ‘POST’, StepFunctionApiIntegration(shareStepFunction, [ { name: ‘fileId’, sourceType: ‘params’ }, { name: ‘recipients’, sourceType: ‘body’ }, /* your custom input fields */ ]), authorizerSettings, ); |
Cấu trúc StepFunctionApiIntegration xử lý ánh xạ request cho phép bạn trích xuất các trường từ đầu vào request API và chuyển chúng như đầu vào cho một quy trình làm việc 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.escapeJavaScript($input.params(‘fileId’))\”,\”recipients\”:$util.escapeJavaScript($input.json(‘$.recipients’))}”, “stateMachineArn”: “…stateMachineArn” } |
Trong tình huống này, các trường được trích xuất từ tham số, phần thân của request API và tiêu đề xác thực, sau đó chuyển đến quy trình làm việc. Bạn có thể tùy chỉnh cấu hình để đáp ứng các yêu cầu của mình.
Ánh xạ dữ liệu response
Ví dụ có các mẫu ánh xạ response sử dụng Apache VTL. Kết quả của bước cuối cùng trong một quy trình làm việc được ánh xạ dưới dạng file JSON response và được trả về cho người dùng thông qua API Gateway. Response cũng bao gồm 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 response này để đáp ứng các yêu cầu của mình. Ví dụ, bạn có thể cung cấp hành động tùy chỉnh cho các mã response khác nhau.
Kết luận
Trong bài blog này, bạn đã tìm hiểu cách bạn có thể chia sẻ tập tin một cách an toàn với bên ngoài mà được ủy quyền và theo dõi việc truy cập của họ bằng cách sử dụng các dịch vụ AWS serverless. Ứng dụng mẫu được trình bày sử dụng Step Functions để cho phép bạn mở rộng và tùy chỉnh các quy trình làm việc để đáp ứng các yêu cầu riêng của bạn.
Để biết thêm về các khái niệm được thảo luận, hãy truy cập:
- The example application’s GitHub repo
- Sharing objects with presigned URLs
- Using AWS Step Functions with other services
- Cloudscape design system for the cloud
- Mapping template utility reference
Để tìm hiểu thêm về các tài nguyên học tập serverless, hãy truy cập Serverless Land. Học về xử lý dữ liệu trong Step Functions bằng cách đọc hướng dẫn: Introduction to Distributed Map for Serverless Data Processing.
——————————————————————————————————
Link bài viết gốc: Enhancing file sharing using Amazon S3 and AWS Step Functions