# Amazon S3 et CloudFront : pas à pas Connectez un bucket S3 privé à DRM-X 6.0 avec des autorisations IAM restreintes, CORS pour le navigateur, une diffusion HTTPS via CloudFront et une procédure de vérification des envois. La vidéo chiffrée et les licences DRM suivent des chemins distincts Le CDN distribue la vidéo chiffrée. Votre backend vérifie l’accès, et le service de licences DRM autorise le déchiffrement sur un appareil compatible. - 01**Stockage / CDN** Distribue les médias chiffrés au lecteur. - 02**Votre backend** Vérifie le droit de visionnage et demande l’autorisation de lecture à DRM-X. - 03**DRM-X** Valide l’autorisation de lecture et traite la demande de licence DRM. - 04**Lecteur + appareil** Utilise le système DRM de l’appareil pour obtenir une licence et lire les médias chiffrés. Votre moteur décide de l'accès; DRM-X applique la politique signée. Les licences de médias chiffrés et DRM suivent des chemins de livraison séparés. **Du bucket privé à la diffusion publique de médias chiffrés** Créez un bucket S3, donnez à DRM-X des identifiants d’envoi à portée limitée, configurez CORS, connectez CloudFront, puis envoyez et récupérez un objet de test. Conservez les originaux et fichiers privés ailleurs. ## 1. Comprendre la connexion[#](#architecture) DRM-X envoie directement les fichiers vers S3 avec des requêtes signées. Les spectateurs téléchargent les médias chiffrés via CloudFront en HTTPS. Gardez **Block all public access** activé sur S3 ; CloudFront reçoit un accès en lecture limité par **Origin Access Control (OAC)**. CloudFront fournit un domaine `https://….cloudfront.net` utilisable en production. Votre propre domaine est facultatif. La diffusion publique rend les octets accessibles ; DRM contrôle toujours le déchiffrement du média correctement préparé. CORS ne constitue pas une autorisation. Ce guide utilise une diffusion CDN publique ordinaire. Les URL ou cookies signés pour les spectateurs nécessitent une intégration distincte. ## 2. Créez votre bucket S3[#](#create-bucket) ![AWS S3 formulaire de création : General purpose, Global namespace et un exemple de nom de bucket.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1 :** choisissez General purpose. **2 :** entrez votre propre nom unique. Il s'agit d'un véritable formulaire console avec un exemple non soumis ; les en-têtes de compte sont exclus. - Ouvrez **Amazon S3 → General purpose buckets → Create bucket**. - Sélectionnez une région et enregistrez son code, tel que `us-east-1`. Choisissez **General purpose**. Si un espace de noms vous est demandé, utilisez **Global namespace** pour cette procédure pas à pas. - Entrez votre propre nom de bucket unique au monde. Gardez **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Gardez **Block all public access** coché. Vous accorderez un accès CloudFront via une politique limitée. - Pour ce guide, conservez **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)**. Ce chiffrement du stockage complète le packaging DRM sans le remplacer. SSE-KMS exige des autorisations KMS supplémentaires pour l’émetteur des fichiers et pour CloudFront. - Vérifiez et créez le bucket. N'activez pas l'hébergement de site Web statique S3. ## 3. Créez un utilisateur IAM à droits limités et une clé d’accès[#](#iam-credentials) - Ouvrez **IAM → Policies → Create policy → JSON**. Collez la stratégie ci-dessous, en remplaçant l'exemple de nom de bucket partout. - L'exemple autorise uniquement `protected/`. Si vous utilisez un autre chemin de base, mettez à jour la condition de préfixe et l'objet ARN. Pour une utilisation à la racine du bucket, supprimez la condition de préfixe ListBucket et utilisez `arn:aws:s3:::YOUR_BUCKET/*` pour les objets. - Enregistrez la stratégie. Ouvrez **IAM → Users → Create user**, créez un utilisateur d'intégration dédié sans accès AWS Console et attachez uniquement cette stratégie. - Ouvrez le **Security credentials → Access keys → Create access key** de l'utilisateur. Choisissez le cas d'utilisation d'une application exécutée en dehors de AWS et suivez les invites. Conservez soigneusement les Access key ID et Secret access key pour 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/*" } ] } ``` N’utilisez ni les clés du compte root ni AdministratorAccess. La copie utilise GetObject et PutObject : il n’existe pas d’action IAM `s3:CopyObject` distincte. Le renommage nécessite aussi DeleteObject. Le formulaire DRM-X actuel attend une paire de clés d’accès ; un ARN de rôle seul ne la remplace pas. ## 4. Configurez CORS sur S3 pour les envois depuis le navigateur[#](#bucket-cors) - Ouvrez votre bucket S3 → **Permissions**. - Accédez à **Cross-origin resource sharing (CORS) → Edit**. - Collez ce JSON, en remplaçant `https://www.example.com` par le site Web intégrant votre lecteur. Conservez l'origine DRM-X Console. Conservez les autres règles requises dans les buckets existants. - Sélectionnez **Save changes**. Gardez Block Public Access activé : CORS ne rend pas le bucket public. ``` [ { "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 } ] ``` Les envois vont directement vers S3, donc PUT CORS appartient au S3. La lecture via CloudFront nécessite également la configuration CDN à l'étape 5. ## 5. Créez votre URL de diffusion HTTPS avec CloudFront[#](#cloudfront) - Ouvrez **CloudFront → Distributions → Create distribution**. Utilisez une distribution standard. Si AWS affiche une sélection de plan d'intégration ou de tarification, examinez et choisissez le plan approprié à votre compte avant de créer des ressources. - Sélectionnez le **S3 REST origin** normal du bucket, et non son point de terminaison de site Web. Laissez **Origin path vide** pour le mappage de dossiers utilisé dans ce guide. - Choisissez **Origin access control settings (recommended)**. Créez ou sélectionnez un OAC avec **Sign requests (recommended)**. - Définissez la politique de protocole de la visionneuse sur **Redirect HTTP to HTTPS** ou **HTTPS only**. Autoriser **GET, HEAD, OPTIONS**. Les envois utilisent le point de terminaison S3, donc CloudFront n'a pas besoin de PUT. - Créez la distribution. Appliquez la stratégie de bucket générée par CloudFront sous **S3 → bucket → Permissions → Bucket policy → Modifier**. Fusionner avec les instructions existantes requises. Restreindre l'accès au ARN de cette distribution. L'exemple ci-dessous limite la lecture à `protected/`. - Ouvrez **CloudFront → Policies → Response headers → Create response headers policy**. Configurez les champs CORS dans le tableau ci-dessous. Attachez cette stratégie au comportement média/par défaut de la distribution. - Attendez la fin du déploiement. Copiez **Distribution domain name**. Votre origine de diffusion est le `https://YOUR_DISTRIBUTION.cloudfront.net`. | Champ de la politique Response headers | Valeur | | --- | --- | | Access-Control-Allow-Origin | Les origines exactes du site du lecteur, ainsi que `https://6.drm-x.com` et `https://multi-drm.drm-x.com` pour les tests 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 | Désactivé pour ce workflow multimédia chiffré public. | | Access-Control-Max-Age | 3600 | | Origin override | Activé pour que CloudFront contrôle de manière cohérente CORS orienté vers le spectateur. | Pour le contrôle en amont OPTIONS, joignez la stratégie de demande d'origine gérée **CORS-S3Origin**. Il transmet Origin, Access-Control-Request-Method et Access-Control-Request-Headers vers S3. Initialement, mettez en cache GET/HEAD uniquement, en laissant la mise en cache OPTIONS désactivée. Si vous mettez ultérieurement en cache OPTIONS, incluez ces en-têtes dans sa clé de cache et testez différentes origines de lecteurs ; le transfert d'un en-tête seul ne l'ajoute pas à la clé de 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" } } } ] } ``` Remplacez l'exemple de compte ID, la distribution ID et le nom du bucket. Le SourceArn doit identifier la distribution que vous venez de créer. Après les modifications d’en-tête, invalidez les chemins de test/média concernés si les réponses antérieures restent en cache. ### Facultatif : utilisez media.example.com - Demandez un certificat public ACM couvrant votre nom d'hôte en **US East (N. Virginia), us-east-1** et complétez la validation DNS. - Ajoutez le nom d'hôte sous le **Alternate domain names** de la distribution et joignez son certificat. - Chez votre fournisseur DNS, créez le CNAME ou l'alias pris en charge pointant vers le nom d'hôte CloudFront. Attendez le DNS, le déploiement du certificat et de la distribution. - Utilisez `https://media.example.com` comme origine de diffusion. Un DNS CNAME seul est insuffisant sans la configuration du domaine et du certificat CloudFront. ## 6. Connectez Amazon S3 à DRM-X 6.0[#](#connect-drmx) Ouvrez [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Choisissez **Amazon S3**. | Champ | Que saisir | | --- | --- | | Display name | Un libellé explicite, par exemple Production S3. | | Bucket name | Le nom exact, sans `s3://`. | | Region | Le code régional exact AWS du bucket. | | Protected-content base path | `protected`, correspondant aux IAM et aux stratégies de bucket. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` ou `https://media.example.com/protected`. | | Access key ID / Secret access key | La bi-clé dédiée de l'utilisateur IAM. | Les exemples utilisent un dossier appelé `protected`. Le nom du bucket n'est pas automatiquement un dossier. Avec le mappage direct domaine-bucket utilisé ici, incluez le même dossier de stockage exactement une fois dans le préfixe public 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 ``` Pour utiliser la racine du bucket, laissez le chemin de base vide et entrez uniquement l'origine de la diffusion comme préfixe public. N'ajoutez pas de nom de bucket, sauf si vous l'utilisez délibérément comme dossier. Laissez CloudFront Origin path vide pour ce mappage. Sélectionnez la destination de envoi par défaut si vous le souhaitez, puis **Save and verify**. Le nom d'hôte S3 API n'est pas votre diffusion CloudFront URL. ### Générez vos champs CORS et URL correspondants Cet outil s'exécute dans votre navigateur. Entrez uniquement les origines publiques ; il ne demande pas de clés d'accès. Origines des sites hébergeant le lecteurRemplacez l'exemple. Séparez plusieurs origines HTTPS par des espaces ou des virgules. Utilisez le site Web intégrant votre lecteur, sans chemin de page. DRM-X Console et Playback Lab sont inclus automatiquement.Origine de diffusion publiqueSaisissez votre domaine personnalisé connecté, votre URL r2.dev activée ou l’origine CloudFront, sans dossier.Dossier de stockage (facultatif)Générer la configuration Copier CORS JSON ``` ``` Protected-content base path``Public URL prefix``Exemple de clé d'objet``Exemple d’URL complète`` ## 7. Envoyez un fichier et vérifiez le résultat[#](#test-upload) - Ouvrez [Cloud Storage](https://6.drm-x.com/console/cloud-storage), sélectionnez cette destination, puis **Verify location**. Un résultat positif prouve seulement que le serveur DRM-X peut lister le bucket. Il ne valide pas les droits d’écriture, CORS dans le navigateur ni la diffusion publique. - Sélectionnez **Upload encrypted files**, puis un petit segment chiffré d’un package DRM-X existant. Si vous n’en avez pas, utilisez le fichier de diagnostic chiffré ci-dessous. N’envoyez ni vidéo originale ni document personnel. - Attendez le message de réussite. Vérifiez que le nom du fichier et sa taille apparaissent dans Cloud Storage. Recherchez le même objet sous `protected/` dans la console de votre fournisseur. - Cliquez sur **Preview URL** et testez ce même objet dans une fenêtre de navigateur privé. Il devrait télécharger ou renvoyer HTTP 200 sans connexion AWS ou Cloudflare. Testez un objet réel : la racine d'un domaine peut renvoyer 403/404 même lorsque la diffusion d'objet fonctionne. - Vérifiez les requêtes cross-origin depuis le site de votre lecteur. Le panneau Network du navigateur doit afficher `Access-Control-Allow-Origin` avec l’origine de la page du lecteur. Un téléchargement depuis la barre d’adresse ne teste pas CORS. La commande ci-dessous vérifie aussi les en-têtes. - À la fin, supprimez uniquement votre objet de diagnostic temporaire. Suivez ensuite le [guide Desktop Packager](https://docs.drm-x.com/fr/packaging/desktop), choisissez cette destination dans Package content et envoyez le package chiffré complet. Un envoi manuel de fichier ne crée pas de Published Content ID. - Testez le fichier Published résultant dans [Universal Playback Lab](https://multi-drm.drm-x.com/fr/player) et votre propre site Web de lecteur. Vérifiez la vidéo, l'audio, la navigation dans la vidéo et vos appareils requis. Un téléchargement binaire réussi ne constitue pas une preuve de lecture DRM. Aucun exemple chiffré ? Créez un fichier de test jetable sur Windows Exécutez ceci dans Windows PowerShell dans un dossier temporaire que vous contrôlez. Il crypte un court message non personnel avec une clé à usage unique AES conservée uniquement en mémoire. Le résultat est un diagnostic de stockage, et non un support lisible ; il ne contient aucune clé de contenu DRM ni aucune donnée client. ``` $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 ``` Envoyez `drmx-storage-check.encrypted.bin`, vérifiez sa taille et Preview URL, puis supprimez-le du bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Remplacez les deux URL. Attendez-vous à HTTP 200 et à une origine autorisée correspondant au site Web de votre lecteur. Pour la diffusion par plage, une requête GET avec `Range: bytes=0-15` devrait renvoyer HTTP 206 et un en-tête Content-Range valide. Préserver les types de MIME médias : DASH les manifestes utilisent application/dash+xml, HLS les listes de lecture utilisent application/vnd.apple.mpegurl et les fichiers multimédias doivent utiliser leur type de média approprié. ## 8. Dépannez votre résultat[#](#troubleshooting) | Résultat | Action | | --- | --- | | La vérification réussit, mais l’envoi depuis le navigateur échoue | Examinez les panneaux Console et Network du navigateur. Autorisez PUT via CORS depuis l’origine exacte de Console, ainsi que Content-Type. Vérifiez aussi la connexion, puis réessayez avec une nouvelle URL présignée. | | Le envoi renvoie 403 | Vérifiez l'autorisation d'écriture de l'objet, la portée du bucket/dossier, le point de terminaison, la région, l'expiration de la demande et l'horloge. Ne partagez pas les URL de envoi signées. | | Le envoi réussit ; public URL renvoie 403 | Vérifiez si la diffusion publique est activée et si le domaine/la distribution a terminé son déploiement. | | L’URL publique renvoie 404 | Comparez le URL complet avec la clé d'objet exacte. Vérifiez les dossiers manquants ou en double et la casse du nom de fichier. | | URL s'ouvre directement ; la récupération du lecteur échoue | Ajoutez l'origine de la page du lecteur à GET/HEAD CORS. Vérifiez les en-têtes de réponse CDN et invalidez les réponses périmées mises en cache affectées. | | Le téléchargement réussit ; la lecture échoue | Vérifiez la publication du package, les chemins du manifeste, les types MIME et l'autorisation de licence DRM. Voir [dépannage de lecture](https://docs.drm-x.com/fr/troubleshooting/playback). | **CloudFront 403 :** confirme que OAC signe les demandes, que la stratégie de bucket utilise la distribution ARN et le préfixe corrects, et que l'origine est le point de terminaison S3 REST. Gardez S3 Block Public Access allumé. Vérifiez les autorisations KMS si vous avez choisi SSE-KMS. ## Références officielles[#](#references) - [Créer un bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Gérer IAM clés d'accès](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS configuration](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC et S3 stratégies de bucket](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront en-têtes de réponse](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Politiques de demande d'origine gérées](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Domaines et certificats personnalisés](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Vous utilisez Cloudflare ? Suivez la configuration [Cloudflare R2](https://docs.drm-x.com/fr/storage/cloudflare-r2).