# Amazon S3 এবং CloudFront: ধাপে ধাপে স্কোপড IAM অনুমতি, ব্রাউজার CORS, CloudFront HTTPS বিতরণ এবং একটি আপলোড যাচাইকরণ চেকলিস্ট সহ একটি ব্যক্তিগত S3 bucket DRM-X 6.0 এর সাথে সংযুক্ত করুন৷ এনক্রিপ্ট করা ভিডিও ও DRM লাইসেন্স আলাদা পথে সরবরাহ করা হয় CDN এনক্রিপ্ট করা ভিডিও সরবরাহ করে। আপনার ব্যাকএন্ড দেখার অধিকার যাচাই করে, আর DRM লাইসেন্স পরিষেবা সামঞ্জস্যপূর্ণ ডিভাইসে ডিক্রিপশনের অনুমতি দেয়। - 01**স্টোরেজ / CDN** প্লেয়ারে এনক্রিপ্ট করা মিডিয়া সরবরাহ করে। - 02**আপনার ব্যাকএন্ড** দর্শকের দেখার অনুমতি যাচাই করে এবং DRM-X থেকে প্লেব্যাকের অনুমোদন চায়। - 03**DRM-X** প্লেব্যাকের অনুমোদন যাচাই করে এবং DRM লাইসেন্সের অনুরোধ প্রক্রিয়া করে। - 04**প্লেয়ার + ডিভাইস** ডিভাইসের DRM সিস্টেম ব্যবহার করে লাইসেন্স গ্রহণ করে এবং এনক্রিপ্ট করা মিডিয়া চালায়। আপনার ব্যাক-এন্ড চালু করতে; ব্যবহার করতে ব্যবহৃত হচ্ছে DRM-X স্বাক্ষর করার নীতি প্রয়োগ করে এনক্রিপ্ট করা হবে। DRM লাইসেন্স ভিন্ন ভিন্ন পথ অনুসরণ করে। **Private bucket থেকে সর্বজনীন encrypted-media delivery** S3 bucket তৈরি করুন, DRM-X-কে সীমিত upload credential দিন, browser CORS সেট করুন, CloudFront connect করুন এবং test object আপলোড ও retrieve করুন। Original video ও private file এই delivery bucket-এর বাইরে রাখুন। ## 1. সংযোগ বুঝতে[#](#architecture) DRM-X signed request দিয়ে সরাসরি S3-এ আপলোড করে। দর্শক HTTPS-এ CloudFront থেকে encrypted media download করে। S3-এর **Block all public access** চালু রাখুন; **Origin Access Control (OAC)** দিয়ে CloudFront-কে সীমিত read access দিন। CloudFront একটি কার্যকর `https://….cloudfront.net` hostname দেয়, যা production-এ ব্যবহার করা যায়। নিজের domain থাকা ঐচ্ছিক। Public delivery-তে object-এর bytes পাওয়া যায়; সঠিকভাবে packaged media decrypt করার অনুমতি DRM নিয়ন্ত্রণ করে। CORS কোনো authorization ব্যবস্থা নয়। এই নির্দেশিকায় সাধারণ public CDN delivery দেখানো হয়েছে; দর্শকদের জন্য signed URL বা cookie ব্যবহার করতে আলাদা integration দরকার। ## 2. আপনার S3 bucket তৈরি করুন[#](#create-bucket) ![AWS S3 সৃষ্টি ফর্ম: General purpose, Global namespace এবং একটি উদাহরণ bucketর নাম।](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** ব্যবহার করুন। - আপনার নিজস্ব বিশ্বব্যাপী অনন্য bucket নাম লিখুন। **Object Ownership → ACLs disabled (Bucket owner enforced)** রাখুন। - **Block all public access** চেক রাখুন। আপনি একটি স্কোপড নীতির মাধ্যমে CloudFront অ্যাক্সেস দেবেন। - এই নির্দেশিকায় **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)** রাখুন। এটি অতিরিক্ত storage encryption; DRM packaging-এর বিকল্প নয়। SSE-KMS ব্যবহার করলে uploader ও CloudFront উভয়ের জন্য অতিরিক্ত KMS permission দরকার। - পর্যালোচনা এবং bucket তৈরি. S3 স্ট্যাটিক ওয়েবসাইট হোস্টিং সক্ষম করবেন না। ## 3. সীমিত অনুমতির IAM user এবং access key তৈরি করুন[#](#iam-credentials) - খুলুন **IAM → Policies → Create policy → JSON**। নিচের নীতিটি পেস্ট করুন, উদাহরণ bucketর নাম সব জায়গায় প্রতিস্থাপন করুন। - উদাহরণটি শুধুমাত্র `protected/` অনুমতি দেয়। আপনি যদি অন্য বেস পাথ ব্যবহার করেন, তাহলে উপসর্গ শর্ত এবং বস্তু ARN উভয়ই আপডেট করুন। বাকেট-রুট ব্যবহারের জন্য, ListBucket উপসর্গ শর্তটি সরিয়ে ফেলুন এবং বস্তুর জন্য `arn:aws:s3:::YOUR_BUCKET/*` ব্যবহার করুন। - নীতি সংরক্ষণ করুন. **IAM → Users → Create user** খুলুন, AWS Console অ্যাক্সেস ছাড়াই একটি ডেডিকেটেড ইন্টিগ্রেশন ব্যবহারকারী তৈরি করুন এবং শুধুমাত্র এই নীতি সংযুক্ত করুন৷ - ব্যবহারকারীর **Security credentials → Access keys → Create access key** খুলুন। AWS এর বাইরে চলমান একটি অ্যাপ্লিকেশনের জন্য ব্যবহার কেস চয়ন করুন এবং প্রম্পটগুলি অনুসরণ করুন৷ DRM-X এর জন্য Access key ID এবং Secret access key নিরাপদে ধরে রাখুন। ``` { "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 bucket → **Permissions** খুলুন। - স্ক্রোল করুন **Cross-origin resource sharing (CORS) → Edit** এ। - এই JSON পেস্ট করুন, `https://www.example.com` আপনার প্লেয়ার এম্বেড করা ওয়েবসাইট দিয়ে প্রতিস্থাপন করুন। DRM-X Console মূল রাখুন। বিদ্যমান bucketতে অন্যান্য প্রয়োজনীয় নিয়ম সংরক্ষণ করুন। - **Save changes** নির্বাচন করুন। Block Public Access সক্রিয় রাখুন: CORS 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 } ] ``` আপলোড সরাসরি S3 এ যায়, তাই PUT CORS S3 এর অন্তর্গত। CloudFront এর মাধ্যমে প্লেব্যাকের জন্য ধাপ 5-এ CDN কনফিগারেশন প্রয়োজন। ## 5. CloudFront দিয়ে HTTPS delivery URL তৈরি করুন[#](#cloudfront) - খুলুন **CloudFront → Distributions → Create distribution**. একটি আদর্শ বিতরণ ব্যবহার করুন। যদি AWS একটি অনবোর্ডিং বা মূল্য-পরিকল্পনা নির্বাচন দেখায়, রিসোর্স তৈরি করার আগে আপনার অ্যাকাউন্টের জন্য উপযুক্ত পরিকল্পনাটি পর্যালোচনা করুন এবং বেছে নিন। - bucketর স্বাভাবিক **S3 REST origin** নির্বাচন করুন, এর ওয়েবসাইট এন্ডপয়েন্ট নয়। এই গাইডে ব্যবহৃত ফোল্ডার ম্যাপিংয়ের জন্য **Origin path খালি** ছেড়ে দিন। - **Origin access control settings (recommended)** চয়ন করুন। **Sign requests (recommended)** দিয়ে একটি OAC তৈরি করুন বা নির্বাচন করুন। - ভিউয়ার প্রোটোকল নীতি **Redirect HTTP to HTTPS** বা **HTTPS only** এ সেট করুন। **GET, HEAD, OPTIONS** অনুমতি দিন। আপলোড S3 এন্ডপয়েন্ট ব্যবহার করে, তাই CloudFront এর PUT প্রয়োজন হয় না। - Distribution তৈরি করুন। **S3 → Bucket → Permissions → Bucket policy → Edit**-এ CloudFront-এর তৈরি bucket policy প্রয়োগ করুন। আগে থেকে প্রয়োজনীয় statement থাকলে সেগুলোর সঙ্গে merge করুন। শুধু এই distribution-এর ARN-কে access দিন। নিচের উদাহরণে read access `protected/`-এর মধ্যে সীমাবদ্ধ। - খুলুন **CloudFront → Policies → Response headers → Create response headers policy**। নীচের টেবিলে CORS ক্ষেত্রগুলি কনফিগার করুন। ডিস্ট্রিবিউশনের মিডিয়া/ডিফল্ট আচরণের সাথে এই নীতিটি সংযুক্ত করুন। - স্থাপনা সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন। কপি করুন **Distribution domain name**. আপনার ডেলিভারির মূল হল `https://YOUR_DISTRIBUTION.cloudfront.net`। | Response headers নীতি ক্ষেত্র | মান | | --- | --- | | Access-Control-Allow-Origin | আপনার player-এর সঠিক Origin এবং DRM-X পরীক্ষার জন্য `https://6.drm-x.com` ও `https://multi-drm.drm-x.com`। | | 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 preflight-এর জন্য managed **CORS-S3Origin** origin request policy যুক্ত করুন। এটি Origin, Access-Control-Request-Method এবং Access-Control-Request-Headers S3-এ পাঠায়। প্রথমে শুধু GET/HEAD cache করুন; OPTIONS caching বন্ধ রাখুন। পরে OPTIONS cache করলে এই header-গুলো cache key-তে যোগ করুন এবং বিভিন্ন player Origin দিয়ে পরীক্ষা করুন। Header forward করলেই তা cache key-তে যুক্ত হয় না। ``` { "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 এবং bucketর নাম প্রতিস্থাপন করুন। SourceArn আপনার তৈরি করা ডিস্ট্রিবিউশনটি অবশ্যই চিহ্নিত করতে হবে। শিরোনাম পরিবর্তনের পরে, যদি পূর্বের প্রতিক্রিয়াগুলি ক্যাশে থাকে তবে প্রভাবিত পরীক্ষা/মিডিয়া পাথগুলি বাতিল করুন। ### ঐচ্ছিক: media.example.com ব্যবহার করুন - **US East (N. Virginia), us-east-1** এ আপনার হোস্টনাম কভার করে একটি ACM সর্বজনীন শংসাপত্রের অনুরোধ করুন এবং 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 | bucketটির সঠিক AWS অঞ্চল কোড। | | Protected-content base path | `protected`, IAM এবং bucket নীতির সাথে মিলে যায়। | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` বা `https://media.example.com/protected`। | | Access key ID / Secret access key | ডেডিকেটেড IAM ব্যবহারকারীর কী জোড়া। | উদাহরণগুলি `protected` নামে একটি ফোল্ডার ব্যবহার করে। bucketর নাম স্বয়ংক্রিয়ভাবে একটি ফোল্ডার নয়। এখানে ব্যবহৃত ডাইরেক্ট ডোমেন-টু-বাকেট ম্যাপিংয়ের সাথে, একই স্টোরেজ ফোল্ডারটি পাবলিক 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 ``` বাকেট রুট ব্যবহার করতে, বেস পাথটি ফাঁকা রাখুন এবং সর্বজনীন উপসর্গ হিসাবে শুধুমাত্র ডেলিভারির উত্স লিখুন। আপনি ইচ্ছাকৃতভাবে একটি ফোল্ডার হিসাবে এটি ব্যবহার না করা পর্যন্ত একটি bucket নাম যোগ করবেন না। এই ম্যাপিংয়ের জন্য CloudFront Origin path খালি রাখুন। যদি ইচ্ছা হয় ডিফল্ট আপলোড গন্তব্য নির্বাচন করুন, তারপর **Save and verify**. S3 API হোস্টনামটি আপনার CloudFront বিতরণ URL নয়। ### আপনার CORS এবং ম্যাচিং URL ক্ষেত্র তৈরি করুন এই টুলটি আপনার ব্রাউজারে চলে। শুধুমাত্র সর্বজনীন উত্স লিখুন; এটি অ্যাক্সেস কীগুলির জন্য জিজ্ঞাসা করে না। প্লেয়ার ওয়েবসাইট উত্সউদাহরণ প্রতিস্থাপন. স্পেস বা কমা দিয়ে একাধিক HTTPS উৎপত্তি আলাদা করুন। আপনার প্লেয়ার এম্বেডিং ওয়েবসাইট ব্যবহার করুন, একটি পৃষ্ঠা পথ ছাড়া. DRM-X Console এবং Playback Lab স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত।Public delivery Originআপনার সংযুক্ত কাস্টম ডোমেন লিখুন, সক্রিয় 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) খুলে এই destination নির্বাচন করুন, তারপর **Verify location** বেছে নিন। সফল হলে শুধু বোঝায় DRM-X server bucket-এর object list পেতে পারে। এটি write permission, browser CORS বা public delivery যাচাই করে না। - **Upload encrypted files** নির্বাচন করুন এবং বিদ্যমান DRM-X প্যাকেজ থেকে একটি ছোট এনক্রিপ্ট করা অংশ বেছে নিন। আপনার যদি কোনো প্যাকেজ না থাকে, তাহলে নিচের ডিসপোজেবল এনক্রিপ্ট করা ডায়াগনস্টিক ব্যবহার করুন। একটি আসল ভিডিও বা ব্যক্তিগত নথি আপলোড করবেন না। - সাফল্য বার্তা জন্য অপেক্ষা করুন. ফাইলের নাম এবং আকার Cloud Storage-এ প্রদর্শিত হয় কিনা তা পরীক্ষা করুন। আপনার প্রদানকারী কনসোলে `protected/` এর অধীনে একই বস্তু খুঁজুন। - **Preview URL** ক্লিক করুন, এবং একটি ব্যক্তিগত ব্রাউজার উইন্ডোতে একই বস্তু পরীক্ষা করুন। এটি একটি AWS বা Cloudflare লগইন ছাড়াই HTTP 200 ডাউনলোড বা ফেরত দিতে হবে৷ একটি প্রকৃত বস্তু পরীক্ষা করুন: একটি ডোমেনের রুট 403/404 রিটার্ন করতে পারে এমনকি যখন অবজেক্ট ডেলিভারি কাজ করে। - আপনার প্লেয়ার ওয়েবসাইট থেকে ক্রস-অরিজিন ডেলিভারি চেক করুন। এর ব্রাউজার নেটওয়ার্ক প্যানেলে প্লেয়ার পৃষ্ঠার মূলের সাথে `Access-Control-Allow-Origin` মিলে যাওয়া দেখানো উচিত। একটি সরাসরি ঠিকানা-বার ডাউনলোড CORS পরীক্ষা করে না। নীচের টার্মিনাল উদাহরণটি শিরোনামগুলিও পরীক্ষা করে। - কাজ শেষে শুধু পরীক্ষার জন্য তৈরি অস্থায়ী diagnostic object মুছুন। তারপর [Desktop Packager নির্দেশিকা](https://docs.drm-x.com/bn/packaging/desktop) অনুসরণ করে Package content-এ এই storage destination বেছে নিন এবং সম্পূর্ণ encrypted package আপলোড করুন। হাতে একটি file আপলোড করলে Published Content ID register হয় না। - তৈরি হওয়া Published file [Universal Playback Lab](https://multi-drm.drm-x.com/bn/player) এবং নিজের player website-এ পরীক্ষা করুন। Video, audio, seek এবং প্রয়োজনীয় device যাচাই করুন। Binary file download সফল হলেই DRM playback সফল হয়েছে বলা যায় না। কোন এনক্রিপ্ট করা নমুনা? 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 যাচাই করুন, তারপর bucket থেকে সরিয়ে দিন। ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` উভয় URL বদলান। HTTP 200 এবং আপনার player website-এর সঙ্গে মেলা allowed Origin পাওয়া উচিত। Range delivery-তে `Range: bytes=0-15` সহ GET request-এর response HTTP 206 ও সঠিক Content-Range header হওয়া উচিত। Media MIME type ঠিক রাখুন: DASH manifest-এর জন্য application/dash+xml, HLS playlist-এর জন্য application/vnd.apple.mpegurl এবং media file-এর উপযুক্ত media type। ## 8. আপনার ফলাফলের সমস্যা সমাধান করুন[#](#troubleshooting) | ফলাফল | কর্ম | | --- | --- | | Verify location সফল হলেও browser upload ব্যর্থ হয় | ব্রাউজারের Console ও Network panel দেখুন। সঠিক Console Origin থেকে PUT এবং Content-Type header CORS-এ অনুমোদন করুন। Network connection যাচাই করে নতুন presigned URL দিয়ে আবার চেষ্টা করুন। | | আপলোড রিটার্ন 403 | বস্তু লেখার অনুমতি, bucket/ফোল্ডার স্কোপ, এন্ডপয়েন্ট, অঞ্চল, অনুরোধের মেয়াদ এবং ঘড়ি পরীক্ষা করুন। স্বাক্ষরিত আপলোড ইউআরএল শেয়ার করবেন না। | | আপলোড সফল হয়; পাবলিক URL রিটার্ন 403 | পাবলিক ডেলিভারি সক্ষম করা হয়েছে কিনা এবং ডোমেন/ডিস্ট্রিবিউশন স্থাপন করা শেষ হয়েছে কিনা তা পরীক্ষা করুন। | | পাবলিক URL রিটার্ন 404 | সম্পূর্ণ URL-এর সঙ্গে হুবহু object key মিলিয়ে দেখুন। কোনো folder বাদ পড়েছে বা দুবার এসেছে কি না এবং filename-এর বড় ও ছোট হাতের অক্ষর ঠিক আছে কি না দেখুন। | | URL সরাসরি খোলে; প্লেয়ার আনয়ন ব্যর্থ হয় | প্লেয়ার পৃষ্ঠার মূল GET/HEAD CORS এ যোগ করুন। CDN প্রতিক্রিয়া শিরোনাম চেক করুন এবং প্রভাবিত বাসি ক্যাশে করা প্রতিক্রিয়াগুলি বাতিল করুন৷ | | ডাউনলোড সফল; প্লেব্যাক ব্যর্থ হয় | প্যাকেজ প্রকাশনা, ম্যানিফেস্ট পাথ, MIME প্রকার এবং DRM লাইসেন্স অনুমোদন পরীক্ষা করুন। [প্লেব্যাক সমস্যা সমাধান](https://docs.drm-x.com/bn/troubleshooting/playback) দেখুন। | **CloudFront 403:** OAC request sign করছে, bucket policy-তে সঠিক distribution ARN ও prefix আছে এবং Origin হিসেবে S3 REST endpoint ব্যবহার হচ্ছে কি না দেখুন। S3 Block Public Access চালু রাখুন। SSE-KMS বেছে নিলে KMS permission যাচাই করুন। ## অফিসিয়াল রেফারেন্স[#](#references) - [একটি S3 bucket](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 bucket নীতি](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/bn/storage/cloudflare-r2) অনুসরণ করুন।