# Amazon S3 و CloudFront: خطوة بخطوة اربط حاوية S3 خاصة مع DRM-X 6.0 باستخدام أذونات IAM محدودة. أعد CORS للمتصفح والتوزيع عبر HTTPS باستخدام CloudFront، ثم اتبع خطوات التحقق من الرفع. يُرسَل الفيديو المشفّر وتراخيص DRM عبر مسارين منفصلين توزّع CDN الفيديو المشفّر. يتحقق خادم التطبيق من صلاحية الوصول، وتسمح خدمة تراخيص DRM بفك التشفير على جهاز متوافق. - 01**التخزين / CDN** يوزّع الوسائط المشفّرة إلى المشغّل. - 02**خادم التطبيق لديك** يتحقق من حق المشاهد في الوصول ويطلب تصريح التشغيل من DRM-X. - 03**DRM-X** تتحقق من تصريح التشغيل وتعالج طلب ترخيص DRM. - 04**المشغّل + الجهاز** يستخدم نظام DRM في الجهاز للحصول على ترخيص وتشغيل الوسائط المشفّرة. يتحقق backend لديك من حق الوصول، ويطبّق DRM-X السياسة الموقّعة. تُنقل الوسائط المشفرة وتراخيص DRM عبر مسارين منفصلين. **من حاوية خاصة إلى توزيع الوسائط المشفرة للعامة** أنشئ حاوية S3 وامنح DRM-X بيانات اعتماد للرفع بصلاحيات محدودة. أعد CORS للمتصفح واربط CloudFront، ثم ارفع كائنًا تجريبيًا واسترجعه. احتفظ بمقاطع الفيديو الأصلية والملفات الخاصة خارج حاوية التوزيع هذه. ## 1. فهم الاتصال[#](#architecture) يرفع DRM-X الملفات مباشرة إلى S3 بطلبات موقعة. ينزّل المشاهدون الوسائط المشفرة عبر CloudFront باستخدام HTTPS. أبقِ **Block all public access** مفعّلًا في S3، وامنح CloudFront صلاحية قراءة محدودة عبر **Origin Access Control (OAC)**. يوفر CloudFront اسم مضيف `https://….cloudfront.net` صالحًا للاستخدام الفعلي. النطاق الخاص اختياري. التوزيع العام يتيح جلب بايتات الملفات، بينما يظل DRM مسؤولًا عن فك تشفير الوسائط التي جرى تجهيزها بطريقة صحيحة. CORS ليس آلية تفويض. يستخدم هذا الدليل توزيع CDN عامًا عاديًا؛ أما URLs أو cookies الموقعة للمشاهدين فتحتاج إلى تكامل منفصل. ## 2. قم بإنشاء حاوية S3 الخاص بك[#](#create-bucket) ![AWS S3 استمارة الإنشاء: General purpose، Global namespace ومثال لاسم حاوية.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** اختر General purpose. **2:** أدخل اسمك الفريد. هذا نموذج وحدة تحكم حقيقي مع مثال لم يتم إرساله؛ يتم استبعاد رؤوس الحساب. - افتح **Amazon S3 → General purpose buckets → Create bucket**. - اختر المنطقة وسجل الكود الخاص بها مثل `us-east-1`. اختر **General purpose**. إذا طُلب منك مساحة اسم، فاستخدم **Global namespace** لهذه الإرشادات. - أدخل اسم الحاوية الفريد عالميًا الخاص بك. احتفظ بـ **Object Ownership → ACLs disabled (Bucket owner enforced)**. - أبقِ خيار **Block all public access** محددًا. ستمنح CloudFront صلاحية الوصول من خلال سياسة ذات نطاق محدود. - أبقِ **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)** في هذا الدليل. هذا تشفير إضافي للتخزين ولا يحل محل تجهيز الوسائط باستخدام DRM. يتطلب SSE-KMS أذونات KMS إضافية لكل من جهة رفع الملفات وCloudFront. - مراجعة وإنشاء الحاوية. لا تقم بتمكين استضافة مواقع الويب الثابتة S3. ## 3. إنشاء مستخدم IAM بصلاحيات محدودة ومفتاح وصول[#](#iam-credentials) - افتح **IAM → Policies → Create policy → JSON**. الصق السياسة أدناه، مع استبدال اسم الحاوية النموذجي في كل مكان. - المثال يسمح فقط `protected/`. إذا كنت تستخدم مسارًا أساسيًا آخر، فقم بتحديث كل من شرط البادئة والكائن ARN. لاستخدام جذر الحاوية، قم بإزالة شرط البادئة ListBucket واستخدم `arn:aws:s3:::YOUR_BUCKET/*` للكائنات. - حفظ السياسة. افتح **IAM → Users → Create user**، أنشئ مستخدم تكامل مخصص دون الوصول إلى AWS Console، وأرفق هذه السياسة فقط. - افتح المستخدم **Security credentials → Access keys → Create access key**. اختر حالة الاستخدام لتطبيق يعمل بالخارج AWS واتبع المطالبات. احتفظ بشكل آمن بـ Access key ID وSecret access key مقابل DRM-X. ``` { "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/*" } ] } ``` لا تستخدم مفاتيح الجذر أو AdministratorAccess. يستخدم النسخ GetObject وPutObject؛ لا يوجد إجراء منفصل `s3:CopyObject` IAM. تحتاج إعادة التسمية أيضًا إلى DeleteObject. يتبع هذا الدليل نموذج مفتاح الوصول الحالي الخاص بـ DRM-X؛ الدور ARN وحده لا يحل محل زوج المفاتيح. ## 4. قم بتكوين S3 CORS لتحميلات المتصفح[#](#bucket-cors) - افتح حاوية S3 → **Permissions**. - انتقل إلى **Cross-origin resource sharing (CORS) → Edit**. - الصق هذا JSON، مع استبدال `https://www.example.com` بموقع الويب الذي يتضمن المشغل الخاص بك. احتفظ بالأصل DRM-X Console. احتفظ بالقواعد الأخرى المطلوبة في الحاويات الموجودة. - اختر **Save changes**. احتفظ بـ Block Public Access ممكّنًا: CORS لا يجعل الحاوية عامًا. ``` [ { "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 } ] ``` التحميلات تذهب مباشرة إلى S3، لذلك PUT CORS تنتمي إلى S3. التشغيل من خلال CloudFront يحتاج أيضًا إلى التكوين CDN في الخطوة 5. ## 5. إنشاء URL للتوزيع عبر HTTPS باستخدام CloudFront[#](#cloudfront) - افتح **CloudFront → Distributions → Create distribution**. استخدم التوزيع القياسي. إذا أظهر AWS تحديدًا لخطة الإعداد أو التسعير، فقم بمراجعة واختيار الخطة المناسبة لحسابك قبل إنشاء الموارد. - حدد العادي للحاوية **S3 REST origin**، وليس نقطة نهاية موقع الويب الخاص به. اترك **Origin path فارغًا** لتعيين المجلد المستخدم في هذا الدليل. - اختر **Origin access control settings (recommended)**. قم بإنشاء أو تحديد OAC مع **Sign requests (recommended)**. - اضبط سياسة بروتوكول المشاهد على **Redirect HTTP to HTTPS** أو **HTTPS only**. السماح **GET، HEAD، OPTIONS**. تستخدم عمليات التحميل نقطة النهاية S3، لذا فإن CloudFront لا تحتاج إلى PUT. - أنشئ توزيع CloudFront. طبّق سياسة الحاوية التي يولدها ضمن **S3 → Bucket → Permissions → Bucket policy → Edit**، وادمجها مع العبارات الحالية المطلوبة. اقصر الوصول على ARN لهذا التوزيع. المثال أدناه يقصر القراءة على `protected/`. - افتح **CloudFront → Policies → Response headers → Create response headers policy**. قم بتكوين الحقول CORS في الجدول أدناه. قم بإرفاق هذه السياسة بالوسائط/السلوك الافتراضي للتوزيع. - انتظر حتى يكتمل النشر. انسخ **Distribution domain name**. أصل التسليم الخاص بك هو `https://YOUR_DISTRIBUTION.cloudfront.net`. | Response headers مجال السياسة | القيمة | | --- | --- | | Access-Control-Allow-Origin | أصول مشغّلك بالضبط، بالإضافة إلى `https://6.drm-x.com` و`https://multi-drm.drm-x.com` لاختبارات 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 | معطل لسير عمل الوسائط المشفرة العامة هذا. | | Access-Control-Max-Age | 3600 | | Origin override | ممكّن بحيث يتحكم CloudFront في مواجهة المشاهد CORS باستمرار. | بالنسبة إلى OPTIONS الاختبار المبدئي، قم بإرفاق سياسة طلب الأصل **CORS-S3Origin** المُدارة. يقوم بإعادة توجيه Origin وAccess-Control-Request-Method وAccess-Control-Request-Headers إلى S3. في البداية ذاكرة التخزين المؤقت GET/HEAD فقط، مع ترك OPTIONS التخزين المؤقت معطل. إذا قمت لاحقًا بتخزين OPTIONS مؤقتًا، فقم بتضمين هذه الرؤوس في مفتاح التخزين المؤقت الخاص بها واختبر أصول المشغّلين المختلفة؛ إعادة توجيه الرأس وحده لا يضيفه إلى مفتاح ذاكرة التخزين المؤقت. ``` { "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" } } } ] } ``` استبدال الحساب المثالى ID والتوزيع ID واسم الحاوية. يجب أن يحدد SourceArn التوزيع الذي أنشأته للتو. بعد تغيير الرأس، قم بإبطال مسارات الاختبار/الوسائط المتأثرة إذا ظلت الاستجابات السابقة مخزنة مؤقتًا. ### اختياري: استخدم media.example.com - اطلب شهادة عامة ACM تغطي اسم المضيف الخاص بك في **US East (N. Virginia)، us-east-1**، وإكمال التحقق من صحة DNS. - أضف اسم المضيف تحت التوزيعة **Alternate domain names** وأرفق شهادته. - في مزود DNS الخاص بك، قم بإنشاء CNAME أو الاسم المستعار المدعوم الذي يشير إلى اسم المضيف CloudFront. انتظر DNS ونشر الشهادة والتوزيع. - استخدم `https://media.example.com` كأصل التسليم الخاص بك. DNS CNAME وحده غير كافي بدون إعداد المجال والشهادة CloudFront. ## 6. ربط Amazon S3 مع DRM-X 6.0[#](#connect-drmx) افتح [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). اختر **Amazon S3**. | الميدان | ما يدخل | | --- | --- | | Display name | اسم يسهل تمييزه، مثل Production S3. | | Bucket name | الاسم الدقيق بدون `s3://`. | | Region | رمز المنطقة AWS الدقيق للحاوية. | | Protected-content base path | `protected`، مطابقة سياسات IAM والحاوية. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` أو `https://media.example.com/protected`. | | Access key ID / Secret access key | زوج المفاتيح المخصص للمستخدم IAM. | تستخدم الأمثلة مجلدًا يسمى `protected`. اسم الحاوية ليس مجلدًا تلقائيًا. باستخدام التعيين المباشر للمجال إلى الحاوية المستخدم هنا، قم بتضمين مجلد التخزين نفسه مرة واحدة بالضبط في البادئة 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 ``` لاستخدام جذر الحاوية، اترك المسار الأساسي فارغًا وأدخل فقط أصل التسليم كبادئة عامة. لا تقم بإلحاق اسم الحاوية إلا إذا كنت تستخدمه عمدًا كمجلد. اترك CloudFront Origin path فارغًا لهذا التعيين. حدد وجهة التحميل الافتراضية إذا رغبت في ذلك، ثم **Save and verify**. اسم المضيف S3 API ليس توصيل CloudFront URL الخاص بك. ### قم بإنشاء حقول CORS ومطابقة URL تعمل هذه الأداة في متصفحك. أدخل الأصول العامة فقط؛ لا يطلب مفاتيح الوصول. أصول موقع المشغّلاستبدل المثال. افصل بين الأصول HTTPS المتعددة بمسافات أو فواصل. استخدم موقع الويب الذي يتضمن المشغل الخاص بك، بدون مسار الصفحة. يتم تضمين DRM-X Console وPlayback Lab تلقائيًا.أصل التسليم العموميأدخل المجال المخصص المتصل الخاص بك، ممكّن r2.dev URL، أو CloudFront الأصل. حذف المجلد هنا.مجلد التخزين (اختياري)إنشاء التكوين نسخ CORS JSON ``` ``` Protected-content base path``Public URL prefix``مثال لمفتاح الكائن``مثال على URL كامل`` ## 7. قم بتحميل ملف وتأكد من أنه يعمل[#](#test-upload) - افتح [Cloud Storage](https://6.drm-x.com/console/cloud-storage) وحدد هذه الوجهة ثم اختر **Verify location**. النجاح يثبت فقط أن خادم DRM-X يستطيع سرد محتويات الحاوية؛ ولا يثبت صلاحية الكتابة أو CORS في المتصفح أو التوزيع العام. - اختر **Upload encrypted files** واختر شريحة واحدة صغيرة مشفرة من باقة DRM-X الموجودة. إذا لم يكن لديك حزمة، استخدم التشخيص المشفر الذي يمكن التخلص منه أدناه. لا تقم بتحميل مقطع فيديو أصلي أو مستند شخصي. - انتظر رسالة النجاح. تأكد من ظهور اسم الملف وحجمه في Cloud Storage. ابحث عن نفس الكائن ضمن `protected/` في وحدة تحكم المزود الخاص بك. - انقر على **Preview URL**، واختبر نفس الكائن في نافذة متصفح خاصة. يجب تنزيل أو إرجاع HTTP 200 بدون تسجيل الدخول AWS أو Cloudflare. اختبار كائن فعلي: يمكن لجذر المجال إرجاع 403/404 حتى عندما يعمل تسليم الكائن. - تحقق من التسليم عبر الأصل من موقع المشغل الخاص بك. يجب أن تظهر لوحة شبكة المتصفح الخاصة بها `Access-Control-Allow-Origin` مطابقة لأصل صفحة المشغل. لا يختبر التنزيل المباشر لشريط العناوين CORS. المثال الطرفي أدناه يتحقق أيضًا من الرؤوس. - قم بإزالة الكائن التشخيصي القابل للتصرف فقط عند الانتهاء. ثم اتبع [دليل حزم سطح المكتب](https://docs.drm-x.com/ar/packaging/desktop)، وحدد وجهة التخزين هذه في Package content، وقم بتحميل الحزمة المشفرة الكاملة. لا يؤدي تحميل الملف يدويًا إلى تسجيل Published Content ID. - اختبر الملف Published الناتج في [Universal Playback Lab](https://multi-drm.drm-x.com/ar/player) وموقع المشغّل الخاص بك. التحقق من الفيديو والصوت والتنقل داخل المقطع والأجهزة المطلوبة. التنزيل الثنائي الناجح ليس دليلاً على تشغيل DRM. لا توجد عينة مشفرة؟ قم بإنشاء ملف اختبار يمكن التخلص منه على Windows قم بتشغيل هذا في Windows PowerShell في مجلد مؤقت تتحكم فيه. يقوم بتشفير رسالة قصيرة غير شخصية باستخدام مفتاح AES يستخدم مرة واحدة فقط في الذاكرة. الإخراج عبارة عن وسائط تشخيصية للتخزين، وليست قابلة للتشغيل؛ لا يحتوي على مفتاح محتوى DRM أو بيانات العميل. ``` $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 ``` ارفع `drmx-storage-check.encrypted.bin` وتأكد من حجمه وPreview URL ثم أخرجه من الحاوية. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` استبدل كلا عنواني URL. توقع HTTP 200 وأصل مسموح به يطابق موقع المشغّل الخاص بك. لتسليم النطاق، يجب أن يعود طلب GET مع `Range: bytes=0-15` HTTP 206 ورأس Content-Range صالح. الحفاظ على أنواع MIME الوسائط: DASH تستخدم البيانات application/dash+xml، HLS تستخدم قوائم التشغيل application/vnd.apple.mpegurl، ويجب أن تستخدم ملفات الوسائط نوع الوسائط المناسب لها. ## 8. استكشاف أخطاء النتيجة وإصلاحها[#](#troubleshooting) | النتيجة | العمل | | --- | --- | | ينجح Verify location لكن الرفع من المتصفح يفشل | افحص لوحتي Console وNetwork في المتصفح. اسمح بطلبات PUT عبر CORS من Origin الخاص بـ Console بدقة، واسمح بترويسة Content-Type. تحقق من الاتصال وأعد المحاولة للحصول على presigned URL جديد. | | الرفع يرجع 403 | تحقق من إذن كتابة الكائن ونطاق الحاوية/المجلد ونقطة النهاية والمنطقة وانتهاء الطلب والساعة. لا تشارك عناوين URL للتحميل الموقعة. | | نجح التحميل؛ عام URL يعود 403 | تحقق من تمكين التسليم العام وانتهاء نشر المجال/التوزيع. | | عام URL يعود 404 | قارن URL الكامل بمفتاح الكائن الدقيق. تحقق من المجلدات الناقصة أو المكررة ومن حالة الأحرف في اسم الملف. | | URL يفتح مباشرة؛ فشل جلب المشغّل | أضف أصل صفحة المشغّل إلى GET/HEAD CORS. تحقق من رؤوس الاستجابة CDN وأبطل الاستجابات المتأثرة المخزنة مؤقتًا. | | تم التحميل بنجاح؛ فشل التشغيل | التحقق من نشر الحزمة ومسارات البيان وأنواع MIME وتفويض الترخيص DRM. راجع [استكشاف أخطاء التشغيل وإصلاحها](https://docs.drm-x.com/ar/troubleshooting/playback). | **CloudFront 403:** تحقق من توقيع OAC للطلبات، ومن استخدام سياسة الحاوية لـ ARN والبادئة الصحيحين للتوزيع، ومن أن Origin هو endpoint S3 REST. أبقِ S3 Block Public Access مفعّلًا. راجع أذونات KMS إذا اخترت SSE-KMS. ## المراجع الرسمية[#](#references) - [إنشاء S3 حاوية](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [إدارة IAM مفاتيح الوصول](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS التكوين](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC و S3 سياسات الحاوية](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront رؤوس الرد](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [سياسات طلب الأصل المُدار](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [المجالات والشهادات المخصصة](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) استخدام Cloudflare؟ اتبع [Cloudflare R2 الإعداد](https://docs.drm-x.com/ar/storage/cloudflare-r2).