Amazon S3 و CloudFront: خطوة بخطوة
اربط حاوية S3 خاصة مع DRM-X 6.0 باستخدام أذونات IAM محدودة. أعد CORS للمتصفح والتوزيع عبر HTTPS باستخدام CloudFront، ثم اتبع خطوات التحقق من الرفع.
1. فهم الاتصال#
يرفع 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 الخاص بك#

- افتح 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 → 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 لتحميلات المتصفح#
- افتح حاوية S3 → Permissions.
- انتقل إلى Cross-origin resource sharing (CORS) → Edit.
- الصق JSON أدناه. استخدم * لقراءة الوسائط المشفّرة المتاحة للعامة، وأبقِ الرفع مقتصرًا على 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": [
"*"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedHeaders": [
"Range"
],
"ExposeHeaders": [
"ETag",
"Content-Length",
"Content-Range",
"Accept-Ranges"
],
"MaxAgeSeconds": 3600
}
]اضبط الرفع الموقّع في S3 وCORS للتشغيل في كل من S3 وCloudFront. في الخطوة 5، استخدم مصادر التشغيل نفسها في سياسة رؤوس الاستجابة في CloudFront.
5. إنشاء URL للتوزيع عبر HTTPS باستخدام 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 | * (موصى به للوسائط المشفّرة المتاحة للعامة). إذا اخترت مصادر محددة في أداة الإنشاء، فاستخدم القائمة نفسها هنا. |
| 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#
افتح Cloud Storage → Connect 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 الخاص بك.
تسمح السياسة * بقراءات المتصفح من أي موقع؛ ويظل تفويض ترخيص DRM هو المتحكم في فك التشفير. استخدم حاوية مخصصة للوسائط المشفّرة والموارد المقصود إتاحتها للعامة. يجب ألا تتضمن طلبات الوسائط ملفات تعريف ارتباط عبر المصادر؛ ويتطلب التوزيع المعتمد على مصادقة ملفات تعريف الارتباط إعداد CORS منفصلًا.
قم بإنشاء حقول CORS ومطابقة URL
تعمل هذه الأداة في متصفحك. أدخل الأصول العامة فقط؛ لا يطلب مفاتيح الوصول.
- Protected-content base path
- Public URL prefix
- مثال لمفتاح الكائن
- مثال على URL كامل
7. قم بتحميل ملف وتأكد من أنه يعمل#
- افتح Cloud Storage وحدد هذه الوجهة ثم اختر Verify location. النجاح يثبت فقط أن خادم DRM-X يستطيع سرد محتويات الحاوية؛ ولا يثبت صلاحية الكتابة أو CORS في المتصفح أو التوزيع العام.
- اختر Upload encrypted files واختر شريحة واحدة صغيرة مشفرة من باقة DRM-X الموجودة. إذا لم يكن لديك حزمة، استخدم التشخيص المشفر الذي يمكن التخلص منه أدناه. لا تقم بتحميل مقطع فيديو أصلي أو مستند شخصي.
- انتظر رسالة النجاح. تأكد من ظهور اسم الملف وحجمه في Cloud Storage. ابحث عن نفس الكائن ضمن
protected/في وحدة تحكم المزود الخاص بك. - افتح Preview URL في نافذة تصفح خاصة. تحقّق من أن العنصر المرفوع يعيد HTTP 200 دون تسجيل الدخول.
- تحقق من استجابات manifest والوسائط في لوحة Network بالمتصفح. في السياسة الافتراضية، يجب أن تكون قيمة
Access-Control-Allow-Originهي *؛ وفي السياسة المقيدة، يجب أن تطابق مصدر المشغّل تمامًا. فتح URL مباشرة لا يختبر CORS. - قم بإزالة الكائن التشخيصي القابل للتصرف فقط عند الانتهاء. ثم اتبع دليل حزم سطح المكتب، وحدد وجهة التخزين هذه في Package content، وقم بتحميل الحزمة المشفرة الكاملة. لا يؤدي تحميل الملف يدويًا إلى تسجيل Published Content ID.
- اختبر الملف Published الناتج في Universal Playback Lab وموقع المشغّل الخاص بك. التحقق من الفيديو والصوت والتنقل داخل المقطع والأجهزة المطلوبة. التنزيل الثنائي الناجح ليس دليلاً على تشغيل 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 وAccess-Control-Allow-Origin: *. يجب أن يعيد طلب GET الذي يتضمن Range: bytes=0-15 الحالة HTTP 206 والرأس Content-Range. حافظ على أنواع MIME: application/dash+xml لـ DASH، وapplication/vnd.apple.mpegurl لـ HLS، والنوع المناسب لملفات الوسائط.
8. استكشاف أخطاء النتيجة وإصلاحها#
| النتيجة | العمل |
|---|---|
| ينجح Verify location لكن الرفع من المتصفح يفشل | افحص لوحتي Console وNetwork في المتصفح. اسمح بطلبات PUT عبر CORS من Origin الخاص بـ Console بدقة، واسمح بترويسة Content-Type. تحقق من الاتصال وأعد المحاولة للحصول على presigned URL جديد. |
| الرفع يرجع 403 | تحقق من إذن كتابة الكائن ونطاق الحاوية/المجلد ونقطة النهاية والمنطقة وانتهاء الطلب والساعة. لا تشارك عناوين URL للتحميل الموقعة. |
| نجح التحميل؛ عام URL يعود 403 | تحقق من تمكين التسليم العام وانتهاء نشر المجال/التوزيع. |
| عام URL يعود 404 | قارن URL الكامل بمفتاح الكائن الدقيق. تحقق من المجلدات الناقصة أو المكررة ومن حالة الأحرف في اسم الملف. |
| URL يفتح مباشرة؛ فشل جلب المشغّل | تحقق من CORS لطلبات GET/HEAD على مضيف التوزيع. استخدم * للوسائط المشفّرة المتاحة للعامة، أو اسمح بمصدر المشغّل المطابق تمامًا. امسح استجابات CDN القديمة من ذاكرة التخزين المؤقت ثم أعد المحاولة. عند استخدام S3، تحقق أيضًا من سياسة رؤوس الاستجابة في CloudFront. |
| يعمل في DRM-X Playback Lab؛ لكن Moodle أو WordPress يعرض Failed to fetch | تحقق من CORS لطلبات GET/HEAD على مضيف التوزيع. استخدم * للوسائط المشفّرة المتاحة للعامة، أو اسمح بمصدر المشغّل المطابق تمامًا. امسح استجابات CDN القديمة من ذاكرة التخزين المؤقت ثم أعد المحاولة. عند استخدام S3، تحقق أيضًا من سياسة رؤوس الاستجابة في CloudFront. |
| تم التحميل بنجاح؛ فشل التشغيل | التحقق من نشر الحزمة ومسارات البيان وأنواع MIME وتفويض الترخيص DRM. راجع استكشاف أخطاء التشغيل وإصلاحها. |
CloudFront 403: تحقق من توقيع OAC للطلبات، ومن استخدام سياسة الحاوية لـ ARN والبادئة الصحيحين للتوزيع، ومن أن Origin هو endpoint S3 REST. أبقِ S3 Block Public Access مفعّلًا. راجع أذونات KMS إذا اخترت SSE-KMS.
المراجع الرسمية#
- إنشاء S3 حاوية
- إدارة IAM مفاتيح الوصول
- S3 CORS التكوين
- CloudFront OAC و S3 سياسات الحاوية
- CloudFront رؤوس الرد
- سياسات طلب الأصل المُدار
- المجالات والشهادات المخصصة
للمزوّدين الآخرين، اتبع دليل إعداد التخزين السحابي.
DRM-X 6.0