# Amazon S3 dan CloudFront: langkah demi langkah Hubungkan bucket S3 pribadi ke DRM-X 6.0 dengan izin cakupan IAM, browser CORS, pengiriman CloudFront HTTPS dan daftar periksa verifikasi unggahan. Video terenkripsi dan lisensi DRM dikirim melalui jalur yang berbeda CDN mengirimkan video terenkripsi. Backend Anda memeriksa akses, dan layanan lisensi DRM mengizinkan dekripsi pada perangkat yang kompatibel. - 01**Penyimpanan / CDN** Mengirimkan media terenkripsi ke pemutar. - 02**Backend Anda** Memeriksa hak menonton pengguna dan meminta otorisasi pemutaran dari DRM-X. - 03**DRM-X** Memvalidasi otorisasi pemutaran dan memproses permintaan lisensi DRM. - 04**Pemutar + perangkat** Menggunakan sistem DRM perangkat untuk memperoleh lisensi dan memutar media terenkripsi. Backend Anda memutuskan akses; DRM-X memaksa kebijakan yang ditandatangani. Media tersandi dan DRM lisensi mengikuti jalur pengiriman terpisah. **Dari bucket pribadi ke pengiriman media terenkripsi publik** Buat bucket S3, berikan kredensial unggahan tercakup DRM-X, konfigurasikan browser CORS, sambungkan CloudFront, dan unggah serta ambil objek uji. Simpan video asli dan file pribadi di luar wadah pengiriman ini. ## 1. Pahami hubungannya[#](#architecture) DRM-X mengunggah langsung ke S3 menggunakan permintaan yang ditandatangani. Pemirsa mengunduh media terenkripsi melalui CloudFront melalui HTTPS. Tetap aktifkan S3 **Block all public access**; CloudFront mendapat akses baca terbatas melalui **Origin Access Control (OAC)**. CloudFront menyediakan hostname `https://….cloudfront.net` yang dapat digunakan untuk produksi. Domain sendiri bersifat opsional. Distribusi publik membuat byte objek dapat diakses; DRM tetap mengontrol dekripsi media yang dikemas dengan benar. CORS bukan mekanisme otorisasi. Panduan ini menggunakan distribusi CDN publik biasa. URL atau cookie bertanda tangan untuk pemirsa memerlukan integrasi terpisah. ## 2. Buat bucket S3 Anda[#](#create-bucket) ![AWS S3 formulir pembuatan: General purpose, Global namespace dan contoh nama bucket.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** pilih General purpose. **2:** masukkan nama unik Anda sendiri. Ini adalah bentuk konsol nyata dengan contoh yang belum dikirimkan; header akun dikecualikan. - Buka **Amazon S3 → General purpose buckets → Create bucket**. - Pilih wilayah dan catat kodenya, misalnya `us-east-1`. Pilih **General purpose**. Jika dimintai namespace, gunakan **Global namespace** untuk panduan ini. - Masukkan nama bucket Anda yang unik secara global. Pertahankan **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Tetap centang **Block all public access**. Anda akan memberikan CloudFront akses melalui kebijakan terbatas. - Untuk panduan ini, gunakan **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)**. Ini adalah enkripsi penyimpanan tambahan, bukan pengganti pengemasan DRM. SSE-KMS memerlukan izin KMS tambahan untuk pengunggah dan CloudFront. - Tinjau dan buat bucket. Jangan aktifkan S3 hosting situs web statis. ## 3. Buat pengguna IAM dengan izin terbatas dan access key[#](#iam-credentials) - Buka **IAM → Policies → Create policy → JSON**. Tempelkan kebijakan di bawah ini, ganti contoh nama bucket di mana pun. - Contoh ini hanya mengizinkan `protected/`. Jika Anda menggunakan jalur dasar lain, perbarui kondisi awalan dan objek ARN. Untuk penggunaan bucket-root, hapus kondisi awalan ListBucket dan gunakan `arn:aws:s3:::YOUR_BUCKET/*` untuk objek. - Simpan kebijakannya. Buka **IAM → Users → Create user**, buat pengguna integrasi khusus tanpa akses AWS Console, dan hanya lampirkan kebijakan ini. - Buka **Security credentials → Access keys → Create access key** pengguna. Pilih kasus penggunaan untuk aplikasi yang berjalan di luar AWS dan ikuti petunjuknya. Simpan Access key ID dan Secret access key untuk DRM-X dengan aman. ``` { "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/*" } ] } ``` Jangan gunakan kunci root atau AdministratorAccess. Menyalin menggunakan GetObject dan PutObject; tidak ada tindakan `s3:CopyObject` IAM terpisah. Mengganti nama juga membutuhkan DeleteObject. Panduan ini mengikuti formulir kunci akses DRM-X saat ini; peran ARN saja tidak menggantikan pasangan kunci. ## 4. Konfigurasikan S3 CORS untuk unggahan browser[#](#bucket-cors) - Buka bucket S3 Anda → **Permissions**. - Gulir ke **Cross-origin resource sharing (CORS) → Edit**. - Rekatkan JSON ini, ganti `https://www.example.com` dengan situs web yang menyematkan pemutar Anda. Pertahankan asal DRM-X Console. Pertahankan aturan lain yang diperlukan di bucket yang ada. - Pilih **Save changes**. Tetap aktifkan Block Public Access: CORS tidak membuat bucket menjadi publik. ``` [ { "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 } ] ``` Upload langsung ke S3, jadi PUT CORS termasuk dalam S3. Pemutaran melalui CloudFront juga memerlukan konfigurasi CDN pada langkah 5. ## 5. Buat URL distribusi HTTPS melalui CloudFront[#](#cloudfront) - Buka **CloudFront → Distributions → Create distribution**. Gunakan distribusi standar. Jika AWS menunjukkan pilihan paket orientasi atau harga, tinjau dan pilih paket yang sesuai dengan akun Anda sebelum membuat sumber daya. - Pilih **S3 REST origin** normal bucket, bukan titik akhir situs webnya. Biarkan **Origin path kosong** untuk pemetaan folder yang digunakan dalam panduan ini. - Pilih **Origin access control settings (recommended)**. Buat atau pilih OAC dengan **Sign requests (recommended)**. - Tetapkan kebijakan protokol penampil ke **Redirect HTTP to HTTPS** atau **HTTPS only**. Izinkan **GET, HEAD, OPTIONS**. Pengunggahan menggunakan titik akhir S3, jadi CloudFront tidak memerlukan PUT. - Buat distribusi. Terapkan kebijakan bucket yang dihasilkan CloudFront pada **S3 → bucket → Permissions → Bucket policy → Edit**. Gabungkan dengan pernyataan wajib yang ada. Batasi akses ke ARN distribusi ini. Contoh di bawah membatasi pembacaan hingga `protected/`. - Buka **CloudFront → Policies → Response headers → Create response headers policy**. Konfigurasikan kolom CORS pada tabel di bawah. Lampirkan kebijakan ini ke media distribusi/perilaku default. - Tunggu hingga penerapan selesai. Salin **Distribution domain name**. Asal pengiriman Anda adalah `https://YOUR_DISTRIBUTION.cloudfront.net`. | Response headers bidang kebijakan | Nilai | | --- | --- | | Access-Control-Allow-Origin | Asal pemutar persis Anda, ditambah `https://6.drm-x.com` dan `https://multi-drm.drm-x.com` untuk tes 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 | Dinonaktifkan untuk alur kerja media terenkripsi publik ini. | | Access-Control-Max-Age | 3600 | | Origin override | Diaktifkan sehingga CloudFront mengontrol CORS yang menghadap penonton secara konsisten. | Untuk preflight OPTIONS, lampirkan kebijakan permintaan asal **CORS-S3Origin** yang dikelola. Ini meneruskan Origin, Access-Control-Request-Method dan Access-Control-Request-Headers ke S3. Awalnya cache GET/HEAD saja, biarkan OPTIONS caching dinonaktifkan. Jika nanti Anda melakukan cache OPTIONS, sertakan header ini dalam kunci cache dan uji asal pemutar yang berbeda; meneruskan header saja tidak menambahkannya ke kunci cache. ``` { "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" } } } ] } ``` Ganti akun contoh ID, distribusi ID dan nama bucket. SourceArn harus mengidentifikasi distribusi yang baru saja Anda buat. Setelah header diubah, batalkan validasi jalur pengujian/media yang terpengaruh jika respons sebelumnya tetap disimpan dalam cache. ### Opsional: gunakan media.example.com - Minta sertifikat publik ACM yang mencakup nama host Anda di **US East (N. Virginia), us-east-1**, dan selesaikan validasi DNS. - Tambahkan nama host di bawah **Alternate domain names** distribusi dan lampirkan sertifikatnya. - Di penyedia DNS Anda, buat CNAME atau alias yang didukung yang menunjuk ke nama host CloudFront. Tunggu DNS, sertifikat dan penerapan distribusi. - Gunakan `https://media.example.com` sebagai asal pengiriman Anda. DNS CNAME saja tidak cukup tanpa domain CloudFront dan penyiapan sertifikat. ## 6. Hubungkan Amazon S3 ke DRM-X 6.0[#](#connect-drmx) Buka [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Pilih **Amazon S3**. | Ruas | Apa yang harus dimasukkan | | --- | --- | | Display name | Label yang ramah, seperti Produksi S3. | | Bucket name | Nama persisnya, tanpa `s3://`. | | Region | Kode wilayah AWS yang tepat pada bucket. | | Protected-content base path | `protected`, cocok dengan IAM dan kebijakan bucket. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` atau `https://media.example.com/protected`. | | Access key ID / Secret access key | Pasangan kunci pengguna IAM khusus. | Contohnya menggunakan folder bernama `protected`. Nama bucket tidak otomatis menjadi folder. Dengan pemetaan domain-ke-bucket langsung yang digunakan di sini, sertakan folder penyimpanan yang sama tepat satu kali di awalan publik URL. ``` 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 ``` Untuk menggunakan akar bucket, biarkan jalur dasar kosong dan masukkan hanya asal pengiriman sebagai awalan publik. Jangan menambahkan nama bucket kecuali Anda sengaja menggunakannya sebagai folder. Biarkan CloudFront Origin path kosong untuk pemetaan ini. Pilih tujuan pengunggahan default jika diinginkan, lalu **Save and verify**. Nama host S3 API bukan pengiriman CloudFront URL Anda. ### Hasilkan bidang CORS dan bidang URL yang cocok Alat ini berjalan di browser Anda. Masukkan asal publik saja; itu tidak meminta kunci akses. Origin situs web pemutarGantikan contohnya. Pisahkan beberapa asal HTTPS dengan spasi atau koma. Gunakan situs web yang menyematkan pemutar Anda, tanpa jalur halaman. DRM-X Console dan Playback Lab disertakan secara otomatis.Asal pengiriman publikMasukkan domain khusus Anda yang terhubung, aktifkan r2.dev URL, atau CloudFront asal. Hilangkan folder di sini.Folder penyimpanan (opsional)Hasilkan konfigurasi Salin CORS JSON ``` ``` Protected-content base path``Public URL prefix``Contoh kunci objek``Contoh URL lengkap`` ## 7. Unggah file dan verifikasi bahwa file tersebut berfungsi[#](#test-upload) - Buka [Cloud Storage](https://6.drm-x.com/console/cloud-storage), pilih tujuan ini, lalu pilih **Verify location**. Keberhasilan hanya membuktikan bahwa server DRM-X dapat menampilkan isi bucket. Izin menulis, CORS browser, dan distribusi publik harus diuji secara terpisah. - Pilih **Upload encrypted files** dan pilih satu segmen kecil terenkripsi dari paket DRM-X yang ada. Jika Anda tidak memiliki paketnya, gunakan diagnostik terenkripsi sekali pakai di bawah ini. Jangan mengunggah video asli atau dokumen pribadi. - Tunggu pesan sukses. Periksa apakah nama file dan ukurannya muncul di Cloud Storage. Temukan objek yang sama di bawah `protected/` di konsol penyedia Anda. - Klik **Preview URL**, dan uji objek yang sama di jendela browser pribadi. Seharusnya mengunduh atau mengembalikan HTTP 200 tanpa login AWS atau Cloudflare. Uji objek sebenarnya: root domain dapat mengembalikan 403/404 bahkan ketika pengiriman objek berfungsi. - Periksa pengiriman lintas asal dari situs web pemutar Anda. Panel Jaringan browsernya akan menampilkan `Access-Control-Allow-Origin` yang cocok dengan asal laman pemutar. Pengunduhan bilah alamat langsung tidak menguji CORS. Contoh terminal di bawah ini juga memeriksa header. - Hapus hanya objek diagnostik sekali pakai Anda setelah selesai. Kemudian ikuti [Panduan Pengemas Desktop](https://docs.drm-x.com/id/packaging/desktop), pilih tujuan penyimpanan ini di Package content, dan unggah paket terenkripsi lengkap. Mengunggah file secara manual tidak mendaftarkan Published Content ID. - Uji file Published yang dihasilkan di [Universal Playback Lab](https://multi-drm.drm-x.com/id/player) dan situs web pemutar Anda sendiri. Verifikasi video, audio, seek, dan perangkat yang Anda perlukan. Pengunduhan biner yang berhasil bukanlah bukti pemutaran DRM. Tidak ada sampel terenkripsi? Buat file pengujian sekali pakai di Windows Jalankan ini di Windows PowerShell di folder sementara yang Anda kendalikan. Ini mengenkripsi pesan singkat non-pribadi dengan kunci AES sekali pakai yang hanya disimpan di memori. Outputnya adalah diagnostik penyimpanan, bukan media yang dapat diputar; tidak berisi DRM kunci konten atau data pelanggan. ``` $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 ``` Unggah `drmx-storage-check.encrypted.bin`, verifikasi ukurannya dan Preview URL, lalu keluarkan dari bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Ganti kedua URL. Harapkan HTTP 200 dan asal yang diizinkan cocok dengan situs web pemutar Anda. Untuk pengiriman jangkauan, permintaan GET dengan `Range: bytes=0-15` akan menghasilkan HTTP 206 dan header Content-Range yang valid. Pertahankan jenis media MIME: DASH manifes menggunakan application/dash+xml, HLS playlist menggunakan application/vnd.apple.mpegurl, dan file media harus menggunakan jenis media yang sesuai. ## 8. Pecahkan masalah hasil Anda[#](#troubleshooting) | Hasil | Aksi | | --- | --- | | Verify location berhasil, tetapi unggahan browser gagal | Periksa panel Console dan Network di browser. Izinkan PUT melalui CORS dari Origin Console yang tepat serta header Content-Type. Periksa koneksi dan coba lagi untuk mendapatkan presigned URL baru. | | Unggahan mengembalikan 403 | Periksa izin penulisan objek, cakupan bucket/folder, titik akhir, wilayah, masa berlaku permintaan, dan jam. Jangan bagikan URL unggahan yang ditandatangani. | | Pengunggahan berhasil; publik URL mengembalikan 403 | Periksa apakah pengiriman publik diaktifkan dan domain/distribusi telah selesai diterapkan. | | Publik URL mengembalikan 404 | Bandingkan URL lengkap dengan object key yang tepat. Periksa folder yang hilang atau berulang serta huruf besar/kecil pada nama file. | | URL terbuka secara langsung; pengambilan pemutar gagal | Tambahkan halaman asal pemutar ke GET/HEAD CORS. Periksa CDN header respons dan batalkan respons cache basi yang terpengaruh. | | Pengunduhan berhasil; pemutaran gagal | Periksa publikasi paket, jalur manifes, jenis MIME dan otorisasi lisensi DRM. Lihat [pemecahan masalah pemutaran](https://docs.drm-x.com/id/troubleshooting/playback). | **CloudFront 403:** mengonfirmasi bahwa OAC menandatangani permintaan, kebijakan bucket menggunakan distribusi dan awalan ARN yang benar, dan asal adalah titik akhir S3 REST. Tetap aktifkan S3 Block Public Access. Periksa izin KMS jika Anda memilih SSE-KMS. ## Referensi resmi[#](#references) - [Buat bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Kelola IAM kunci akses](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS konfigurasi](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC dan S3 kebijakan bucket](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront header respons](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Kebijakan permintaan asal terkelola](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Domain dan sertifikat khusus](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Menggunakan Cloudflare? Ikuti pengaturan [Cloudflare R2](https://docs.drm-x.com/id/storage/cloudflare-r2).