# Amazon S3 và CloudFront: từng bước Kết nối bucket S3 riêng tư với DRM-X 6.0 với các quyền trong phạm vi IAM, trình duyệt CORS, CloudFront HTTPS phân phối và danh sách kiểm tra xác minh tải lên. Video đã mã hóa và giấy phép DRM được truyền qua các đường riêng CDN phân phối video đã mã hóa. Backend kiểm tra quyền truy cập, còn dịch vụ giấy phép DRM cho phép giải mã trên thiết bị tương thích. - 01**Lưu trữ / CDN** Phân phối nội dung đã mã hóa đến trình phát. - 02**Backend của bạn** Kiểm tra quyền xem và yêu cầu thông tin cấp quyền phát từ DRM-X. - 03**DRM-X** Xác thực thông tin cấp quyền phát và xử lý yêu cầu giấy phép DRM. - 04**Trình phát + thiết bị** Dùng hệ thống DRM của thiết bị để nhận giấy phép và phát nội dung đã mã hóa. Backend của bạn quyết định quyền truy cập; DRM-X thực thi chính sách đã ký. Nội dung đã mã hóa và giấy phép DRM được phân phối qua các đường riêng. **Từ bucket riêng tư đến phân phối phương tiện được mã hóa công khai** Tạo bucket S3, cung cấp thông tin xác thực tải lên trong phạm vi DRM-X, định cấu hình trình duyệt CORS, kết nối CloudFront, đồng thời tải lên và truy xuất đối tượng thử nghiệm. Giữ video gốc và tệp riêng tư bên ngoài bucket phân phối này. ## 1. Hiểu được sự kết nối[#](#architecture) DRM-X tải trực tiếp lên S3 bằng các yêu cầu đã ký. Người xem tải xuống phương tiện được mã hóa thông qua CloudFront trên HTTPS. Luôn bật S3 **Block all public access**; CloudFront có quyền truy cập đọc trong phạm vi thông qua **Origin Access Control (OAC)**. CloudFront cung cấp hostname `https://….cloudfront.net` có thể dùng trong môi trường thực tế. Miền riêng là tùy chọn. Phân phối công khai cho phép truy cập byte của đối tượng; DRM vẫn kiểm soát giải mã nội dung được đóng gói đúng cách. CORS không phải cơ chế cấp quyền. Hướng dẫn này dùng phân phối CDN công khai thông thường. URL hoặc cookie có chữ ký dành cho người xem cần được tích hợp riêng. ## 2. Tạo bucket S3 của bạn[#](#create-bucket) ![AWS S3 hình thức tạo: General purpose, Global namespace và một tên bucket ví dụ.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** chọn General purpose. **2:** nhập tên duy nhất của riêng bạn. Đây là biểu mẫu bảng điều khiển thực có ví dụ chưa được gửi; tiêu đề tài khoản được loại trừ. - Mở **Amazon S3 → General purpose buckets → Create bucket**. - Chọn một vùng và ghi lại mã của nó, chẳng hạn như `us-east-1`. Chọn **General purpose**. Nếu được yêu cầu không gian tên, hãy sử dụng **Global namespace** cho hướng dẫn này. - Nhập tên bucket duy nhất trên toàn cầu của riêng bạn. Giữ **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Luôn chọn **Block all public access**. Bạn sẽ cấp quyền truy cập CloudFront thông qua chính sách có phạm vi. - Trong hướng dẫn này, giữ **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)**. Đây là lớp mã hóa lưu trữ bổ sung, không thay thế đóng gói DRM. SSE-KMS yêu cầu thêm quyền KMS cho bên tải tệp lên và CloudFront. - Xem lại và tạo bucket. Không bật S3 lưu trữ trang web tĩnh. ## 3. Tạo người dùng IAM với quyền giới hạn và khóa truy cập[#](#iam-credentials) - Mở **IAM → Policies → Create policy → JSON**. Dán chính sách bên dưới, thay thế tên bucket ví dụ ở mọi nơi. - Ví dụ chỉ cho phép `protected/`. Nếu bạn sử dụng đường dẫn cơ sở khác, hãy cập nhật cả điều kiện tiền tố và đối tượng ARN. Để sử dụng Buck-root, hãy loại bỏ điều kiện tiền tố ListBucket và sử dụng `arn:aws:s3:::YOUR_BUCKET/*` cho các đối tượng. - Lưu chính sách. Mở **IAM → Users → Create user**, tạo người dùng tích hợp chuyên dụng không có quyền truy cập AWS Console và chỉ đính kèm chính sách này. - Mở **Security credentials → Access keys → Create access key** của người dùng. Chọn trường hợp sử dụng cho ứng dụng chạy bên ngoài AWS và làm theo lời nhắc. Giữ lại Access key ID và Secret access key cho DRM-X một cách an toàn. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "ListProtectedFolder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::customer-drm-media-example", "Condition": { "StringLike": { "s3:prefix": [ "protected", "protected/", "protected/*" ] } } }, { "Sid": "BucketRegion", "Effect": "Allow", "Action": "s3:GetBucketLocation", "Resource": "arn:aws:s3:::customer-drm-media-example" }, { "Sid": "ManageProtectedObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*" } ] } ``` Không sử dụng khóa gốc hoặc AdministratorAccess. Việc sao chép sử dụng GetObject và PutObject; không có hành động `s3:CopyObject` IAM riêng biệt. Đổi tên cũng cần DeleteObject. Hướng dẫn này tuân theo mẫu khóa truy cập hiện tại của DRM-X; riêng vai trò ARN không thay thế được cặp khóa. ## 4. Định cấu hình S3 CORS để tải lên trình duyệt[#](#bucket-cors) - Mở bucket S3 của bạn → **Permissions**. - Cuộn tới **Cross-origin resource sharing (CORS) → Edit**. - Dán JSON này, thay thế `https://www.example.com` bằng trang web nhúng trình phát của bạn. Giữ nguyên gốc DRM-X Console. Giữ nguyên các quy tắc bắt buộc khác trong các bucket hiện có. - Chọn **Save changes**. Luôn bật Block Public Access: CORS không công khai bucket. ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` Nội dung tải lên đi thẳng tới S3, vì vậy PUT CORS thuộc về S3. Phát lại qua CloudFront cũng cần cấu hình CDN ở bước 5. ## 5. Tạo URL phân phối HTTPS bằng CloudFront[#](#cloudfront) - Mở **CloudFront → Distributions → Create distribution**. Sử dụng phân phối chuẩn. Nếu AWS hiển thị lựa chọn gói giới thiệu hoặc gói giá, hãy xem xét và chọn gói phù hợp với tài khoản của bạn trước khi tạo tài nguyên. - Chọn **S3 REST origin** bình thường của bucket, chứ không phải điểm cuối trang web của bucket. Để trống **Origin path trống** để ánh xạ thư mục được sử dụng trong hướng dẫn này. - Chọn **Origin access control settings (recommended)**. Tạo hoặc chọn OAC với **Sign requests (recommended)**. - Đặt chính sách giao thức của người xem thành **Redirect HTTP to HTTPS** hoặc **HTTPS only**. Cho phép **GET, HEAD, OPTIONS**. Nội dung tải lên sử dụng điểm cuối S3 nên CloudFront không cần PUT. - Tạo bản phân phối. Áp dụng chính sách bucket do CloudFront tạo trong **S3 → Bucket → Permissions → Bucket policy → Edit**. Hợp nhất với các câu lệnh hiện có được yêu cầu. Hạn chế quyền truy cập vào ARN của bản phân phối này. Ví dụ bên dưới giới hạn đọc là `protected/`. - Mở **CloudFront → Policies → Response headers → Create response headers policy**. Định cấu hình các trường CORS trong bảng bên dưới. Đính kèm chính sách này với hành vi mặc định/phương tiện của bản phân phối. - Đợi quá trình triển khai hoàn tất. Sao chép **Distribution domain name**. Nguồn gốc phân phối của bạn là `https://YOUR_DISTRIBUTION.cloudfront.net`. | Response headers trường chính sách | Giá trị | | --- | --- | | Access-Control-Allow-Origin | Nguồn gốc trình phát chính xác của bạn, cộng với `https://6.drm-x.com` và `https://multi-drm.drm-x.com` cho các bài kiểm tra DRM-X. | | Access-Control-Allow-Methods | GET, HEAD, OPTIONS | | Access-Control-Allow-Headers | Range | | Access-Control-Expose-Headers | ETag, Content-Length, Content-Range, Accept-Ranges | | Access-Control-Allow-Credentials | Đã bị tắt đối với quy trình làm việc của phương tiện được mã hóa công khai này. | | Access-Control-Max-Age | 3600 | | Origin override | Được bật để CloudFront kiểm soát hướng nhìn của người xem CORS một cách nhất quán. | Đối với OPTIONS preflight, hãy đính kèm chính sách yêu cầu nguồn gốc **CORS-S3Origin** được quản lý. Nó chuyển tiếp Origin, Access-Control-Request-Method và Access-Control-Request-Headers tới S3. Ban đầu chỉ lưu vào bộ nhớ đệm GET/HEAD, tắt bộ nhớ đệm OPTIONS. Nếu sau này bạn lưu vào bộ đệm OPTIONS, hãy đưa các tiêu đề này vào khóa bộ đệm của nó và kiểm tra nguồn gốc trình phát khác nhau; chỉ chuyển tiếp tiêu đề không thêm nó vào khóa bộ đệm. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowThisCloudFrontDistribution", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EEXAMPLE123" } } } ] } ``` Thay thế tài khoản mẫu ID, phân phối ID và tên bucket. SourceArn phải xác định bản phân phối bạn vừa tạo. Sau khi thay đổi tiêu đề, hãy vô hiệu hóa các đường dẫn kiểm tra/phương tiện bị ảnh hưởng nếu các phản hồi trước đó vẫn được lưu vào bộ đệm. ### Tùy chọn: sử dụng media.example.com - Yêu cầu chứng chỉ công khai ACM bao gồm tên máy chủ của bạn trong **US East (N. Virginia), us-east-1** và hoàn tất xác thực DNS. - Thêm tên máy chủ theo **Alternate domain names** của bản phân phối và đính kèm chứng chỉ của nó. - Tại nhà cung cấp DNS của bạn, hãy tạo bí danh CNAME hoặc được hỗ trợ trỏ đến tên máy chủ CloudFront. Đợi DNS, chứng chỉ và triển khai phân phối. - Sử dụng `https://media.example.com` làm nơi phân phối của bạn. Chỉ DNS CNAME là không đủ nếu không thiết lập chứng chỉ và miền CloudFront. ## 6. Kết nối Amazon S3 với DRM-X 6.0[#](#connect-drmx) Mở [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Chọn **Amazon S3**. | Tìm kiếm | Nhập gì | | --- | --- | | Display name | Tên dễ nhận biết, chẳng hạn Production S3. | | Bucket name | Tên chính xác, không có `s3://`. | | Region | Mã vùng AWS chính xác của bucket. | | Protected-content base path | `protected`, phù hợp với chính sách IAM và bucket. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` hoặc `https://media.example.com/protected`. | | Access key ID / Secret access key | Cặp khóa chuyên dụng của người dùng IAM. | Các ví dụ sử dụng thư mục có tên `protected`. Tên bucket không tự động là một thư mục. Với ánh xạ miền trực tiếp đến bucket được sử dụng ở đây, hãy bao gồm cùng một thư mục lưu trữ chính xác một lần trong tiền tố URL công khai. ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` Để sử dụng bucket gốc, hãy để trống đường dẫn cơ sở và chỉ nhập nguồn gốc phân phối làm tiền tố công khai. Không thêm tên bucket trừ khi bạn cố tình sử dụng nó làm thư mục. Để trống CloudFront Origin path cho ánh xạ này. Chọn đích tải lên mặc định nếu muốn, sau đó **Save and verify**. Tên máy chủ S3 API không phải là CloudFront phân phối URL của bạn. ### Tạo các trường CORS của bạn và các trường URL phù hợp Công cụ này chạy trong trình duyệt của bạn. Chỉ nhập nguồn gốc công khai; nó không yêu cầu khóa truy cập. Nguồn gốc trang web của trình phátThay thế ví dụ. Phân tách nhiều nguồn gốc HTTPS bằng dấu cách hoặc dấu phẩy. Sử dụng trang web nhúng trình phát của bạn mà không cần đường dẫn trang. DRM-X Console và Playback Lab được tự động đưa vào.Origin phân phối công khaiNhập miền tùy chỉnh được kết nối của bạn, đã bật r2.dev URL hoặc CloudFront nguồn gốc. Bỏ qua thư mục ở đây.Thư mục lưu trữ (tùy chọn)Tạo cấu hình Sao chép CORS JSON ``` ``` Protected-content base path``Public URL prefix``Ví dụ về khóa đối tượng``Ví dụ URL đầy đủ`` ## 7. Tải lên một tệp và xác minh rằng nó hoạt động[#](#test-upload) - Mở [Cloud Storage](https://6.drm-x.com/console/cloud-storage), chọn điểm đến này và chọn **Verify location**. Thành công có nghĩa là máy chủ DRM-X có thể liệt kê bucket. Nó không thiết lập quyền ghi, trình duyệt CORS hoặc phân phối công khai. - Chọn **Upload encrypted files** và chọn một phân đoạn nhỏ được mã hóa từ gói DRM-X hiện có. Nếu bạn không có gói, hãy sử dụng chẩn đoán được mã hóa dùng một lần bên dưới. Không tải lên video gốc hoặc tài liệu cá nhân. - Chờ thông báo thành công. Kiểm tra xem tên tệp và kích thước có xuất hiện trong Cloud Storage hay không. Tìm đối tượng tương tự trong `protected/` trong bảng điều khiển nhà cung cấp của bạn. - Nhấp vào **Preview URL** và kiểm tra cùng đối tượng đó trong cửa sổ trình duyệt riêng tư. Nó sẽ tải xuống hoặc trả về HTTP 200 mà không cần đăng nhập AWS hoặc Cloudflare. Kiểm tra đối tượng thực tế: gốc của miền có thể trả về 403/404 ngay cả khi quá trình phân phối đối tượng hoạt động. - Kiểm tra truy cập cross-origin từ trang web đặt trình phát. Bảng Network trong trình duyệt phải hiển thị `Access-Control-Allow-Origin` khớp với Origin của trang trình phát. Tải trực tiếp từ thanh địa chỉ không kiểm tra CORS. Ví dụ terminal bên dưới cũng kiểm tra header. - Chỉ xóa đối tượng chẩn đoán dùng một lần của bạn khi hoàn tất. Sau đó làm theo hướng dẫn [Desktop Packager](https://docs.drm-x.com/vi/packaging/desktop), chọn đích lưu trữ này trong Package content và tải gói mã hóa hoàn chỉnh lên. Tải tệp lên theo cách thủ công không đăng ký Published Content ID. - Kiểm tra tệp Published thu được trong [Universal Playback Lab](https://multi-drm.drm-x.com/vi/player) và trang web trình phát của riêng bạn. Xác minh video, âm thanh, tua trên thanh thời gian và các thiết bị cần thiết của bạn. Tải xuống nhị phân thành công không phải là bằng chứng cho việc phát lại DRM. Không có mẫu mã hóa? Tạo tệp thử nghiệm dùng một lần trên Windows Chạy cái này trong Windows PowerShell trong thư mục tạm thời mà bạn kiểm soát. Nó mã hóa một tin nhắn ngắn không mang tính cá nhân bằng khóa AES dùng một lần chỉ được giữ trong bộ nhớ. Đầu ra là chẩn đoán lưu trữ, không phải phương tiện có thể phát được; nó không chứa DRM khóa nội dung hoặc dữ liệu khách hàng. ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` Tải lên `drmx-storage-check.encrypted.bin`, xác minh kích thước của nó và Preview URL, sau đó xóa nó khỏi bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Thay cả hai URL. Phản hồi phải là HTTP 200 với Origin được phép khớp trang web đặt trình phát. Với truy cập theo byte range, yêu cầu GET chứa `Range: bytes=0-15` phải trả về HTTP 206 và header Content-Range hợp lệ. Giữ đúng MIME type: manifest DASH dùng application/dash+xml, playlist HLS dùng application/vnd.apple.mpegurl, còn tệp media dùng loại tương ứng. ## 8. Khắc phục sự cố[#](#troubleshooting) | Kết quả | Hành động | | --- | --- | | Verify location thành công nhưng tải lên từ trình duyệt thất bại | Kiểm tra bảng Console và Network của trình duyệt. Cho phép PUT qua CORS từ đúng Origin của Console và cho phép header Content-Type. Kiểm tra kết nối, rồi thử lại để nhận presigned URL mới. | | Tải lên trả về 403 | Kiểm tra quyền ghi đối tượng, phạm vi bucket/thư mục, điểm cuối, vùng, hết hạn yêu cầu và đồng hồ. Không chia sẻ URL tải lên đã ký. | | Tải lên thành công; công khai URL trả về 403 | Kiểm tra xem phân phối công khai có được bật hay không và miền/phân phối đã triển khai xong hay chưa. | | Công khai URL trả về 404 | So sánh URL đầy đủ với object key chính xác. Kiểm tra thư mục bị thiếu hoặc lặp, đồng thời kiểm tra chữ hoa/chữ thường trong tên tệp. | | URL trực tiếp mở ra; tìm nạp trình phát không thành công | Thêm nguồn gốc trang trình phát vào GET/HEAD CORS. Kiểm tra tiêu đề phản hồi CDN và vô hiệu hóa các phản hồi đã lưu trong bộ nhớ đệm cũ bị ảnh hưởng. | | Tải xuống thành công; phát lại không thành công | Kiểm tra việc xuất bản gói, đường dẫn kê khai, loại MIME và ủy quyền giấy phép DRM. Xem phần [khắc phục sự cố phát lại](https://docs.drm-x.com/vi/troubleshooting/playback). | **CloudFront 403:** xác nhận rằng OAC ký yêu cầu, chính sách bucket sử dụng phân phối chính xác ARN và tiền tố, đồng thời nguồn gốc là điểm cuối S3 REST. Tiếp tục bật S3 Block Public Access. Kiểm tra quyền KMS nếu bạn chọn SSE-KMS. ## Tài liệu tham khảo chính thức[#](#references) - [Tạo một bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Quản lý IAM khóa truy cập](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS cấu hình](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC và S3 chính sách bucket](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront tiêu đề phản hồi](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Chính sách yêu cầu xuất xứ được quản lý](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Miền và chứng chỉ tùy chỉnh](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Sử dụng Cloudflare? Theo dõi [Cloudflare R2 thiết lập](https://docs.drm-x.com/vi/storage/cloudflare-r2).