# Amazon S3 y CloudFront: paso a paso Conecte un bucket S3 privado a DRM-X 6.0 con permisos IAM limitados, CORS para el navegador, distribución HTTPS mediante CloudFront y una lista de comprobación de cargas. El vídeo cifrado y las licencias DRM se entregan por rutas distintas La CDN entrega el vídeo cifrado. Su backend comprueba el acceso y el servicio de licencias DRM autoriza el descifrado en un dispositivo compatible. - 01**Almacenamiento / CDN** Entrega el contenido cifrado al reproductor. - 02**Su backend** Comprueba si el espectador tiene permiso y solicita la autorización de reproducción a DRM-X. - 03**DRM-X** Valida la autorización de reproducción y procesa la solicitud de licencia DRM. - 04**Reproductor + dispositivo** Utiliza el sistema DRM del dispositivo para obtener una licencia y reproducir el contenido cifrado. Su backend decide el acceso; DRM-X aplica la política firmada. Los medios cifrados y las licencias DRM siguen caminos de entrega separados. **De un depósito privado a la entrega pública de medios cifrados** Cree un depósito S3, proporcione DRM-X credenciales de carga con alcance, configure el navegador CORS, conéctese CloudFront y cargue y recupere un objeto de prueba. Mantenga los videos originales y los archivos privados fuera de este depósito de entrega. ## 1. Entender la conexión[#](#architecture) DRM-X carga directamente en S3 mediante solicitudes firmadas. Los espectadores descargan medios cifrados desde CloudFront mediante HTTPS. Mantenga **Block all public access** activado en S3. CloudFront obtiene permisos de lectura limitados mediante **Origin Access Control (OAC)**. CloudFront proporciona un nombre de host `https://….cloudfront.net` utilizable en producción. Su propio dominio es opcional. La distribución pública permite acceder a los bytes del objeto; DRM sigue controlando el descifrado de medios correctamente empaquetados. CORS no es autorización. Esta guía usa una distribución CDN pública normal. Las URL o cookies firmadas para los espectadores requieren una integración independiente. ## 2. Crea tu depósito S3[#](#create-bucket) ![AWS S3 formulario de creación: General purpose, Global namespace y un nombre de depósito de ejemplo.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** elige General purpose. **2:** ingresa tu propio nombre único. Este es un formulario de consola real con un ejemplo no enviado; Se excluyen los encabezados de cuentas. - Abrir **Amazon S3 → General purpose buckets → Create bucket**. - Seleccione una región y registre su código, como `us-east-1`. Elija **General purpose**. Si se le solicita un espacio de nombres, utilice **Global namespace** para este tutorial. - Ingrese su propio nombre de depósito único a nivel mundial. Mantenga **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Mantenga **Block all public access** marcado. Le dará acceso a CloudFront a través de una política de alcance. - Mantenga **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)** para esta guía. Este cifrado del almacenamiento complementa el empaquetado DRM y no lo sustituye. SSE-KMS requiere permisos KMS adicionales tanto para quien carga los archivos como para CloudFront. - Revisar y crear el depósito. No habilite el alojamiento de sitios web estáticos S3. ## 3. Crear un usuario IAM con permisos limitados y una clave de acceso[#](#iam-credentials) - Abrir **IAM → Policies → Create policy → JSON**. Pegue la política a continuación y reemplace el nombre del depósito de ejemplo en todas partes. - El ejemplo permite solo `protected/`. Si utiliza otra ruta base, actualice tanto la condición del prefijo como el objeto ARN. Para uso de raíz de depósito, elimine la condición de prefijo ListBucket y use `arn:aws:s3:::YOUR_BUCKET/*` para objetos. - Guardar la política. Abra **IAM → Users → Create user**, cree un usuario de integración dedicado sin acceso AWS Console y adjunte solo esta política. - Abra el **Security credentials → Access keys → Create access key** del usuario. Elija el caso de uso para una aplicación que se ejecuta fuera de AWS y siga las instrucciones. Conserve de forma segura el Access key ID y el Secret access key para el 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/*" } ] } ``` No utilice claves raíz o AdministratorAccess. Copiar usa GetObject y PutObject; no existe una acción `s3:CopyObject` IAM separada. Cambiar el nombre también necesita DeleteObject. Esta guía sigue el formulario de clave de acceso actual de DRM-X; un rol ARN por sí solo no reemplaza el par de claves. ## 4. Configurar S3 CORS para cargas en el navegador[#](#bucket-cors) - Abre tu bucket S3 → **Permissions**. - Desplácese hasta **Cross-origin resource sharing (CORS) → Edit**. - Pegue esto JSON, reemplazando `https://www.example.com` con el sitio web que incorpora su reproductor. Mantenga el origen DRM-X Console. Conserve otras reglas requeridas en depósitos existentes. - Seleccione **Save changes**. Mantener Block Public Access habilitado: CORS no hace público el depósito. ``` [ { "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 } ] ``` Las cargas van directamente a S3, por lo que PUT CORS pertenece a S3. La reproducción hasta CloudFront también necesita la configuración CDN en el paso 5. ## 5. Crear una URL de distribución HTTPS con CloudFront[#](#cloudfront) - Abrir **CloudFront → Distributions → Create distribution**. Utilice una distribución estándar. Si AWS muestra una selección de plan de precios o de incorporación, revise y elija el plan apropiado para su cuenta antes de crear recursos. - Seleccione el **S3 REST origin** normal del depósito, no el punto final del sitio web. Deje **Origin path vacío** para la asignación de carpetas utilizada en esta guía. - Elija **Origin access control settings (recommended)**. Crea o selecciona un OAC con **Sign requests (recommended)**. - Establezca la política de protocolo del espectador en **Redirect HTTP to HTTPS** o **HTTPS only**. Permitir **GET, HEAD, OPTIONS**. Las cargas utilizan el punto final S3, por lo que CloudFront no necesita PUT. - Cree la distribución. Aplique la política de bucket generada por CloudFront en **S3 → Bucket → Permissions → Bucket policy → Edit** y combínela con las declaraciones existentes que necesite conservar. Restrinja el acceso al ARN de esta distribución. El ejemplo siguiente limita la lectura a `protected/`. - Abrir **CloudFront → Policies → Response headers → Create response headers policy**. Configure los campos CORS en la siguiente tabla. Adjunte esta política al comportamiento multimedia/predeterminado de la distribución. - Espere a que se complete la implementación. Copia **Distribution domain name**. Su origen de entrega es `https://YOUR_DISTRIBUTION.cloudfront.net`. | Response headers campo de política | Valor | | --- | --- | | Access-Control-Allow-Origin | Tus orígenes exactos del reproductor, más `https://6.drm-x.com` y `https://multi-drm.drm-x.com` para las pruebas 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 | Deshabilitado para este flujo de trabajo público de medios cifrados. | | Access-Control-Max-Age | 3600 | | Origin override | Habilitado para que CloudFront controle la visualización de cara al espectador CORS de manera consistente. | Para la verificación previa OPTIONS, adjunte la política de solicitud de origen **CORS-S3Origin** administrada. Reenvía Origin, Access-Control-Request-Method y Access-Control-Request-Headers a S3. Inicialmente, almacene en caché solo GET/HEAD, dejando el almacenamiento en caché OPTIONS deshabilitado. Si luego almacena en caché OPTIONS, incluya estos encabezados en su clave de caché y pruebe diferentes orígenes de reproductor; reenviar un encabezado por sí solo no lo agrega a la clave de caché. ``` { "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" } } } ] } ``` Reemplace la cuenta de ejemplo ID, la distribución ID y el nombre del depósito. El SourceArn debe identificar la distribución que acabas de crear. Después de los cambios en el encabezado, invalide las rutas de prueba/medios afectadas si las respuestas anteriores permanecen almacenadas en caché. ### Opcional: usar media.example.com - Solicite un certificado público ACM que cubra su nombre de host en **US East (N. Virginia), us-east-1** y complete la validación DNS. - Agregue el nombre de host bajo **Alternate domain names** de la distribución y adjunte su certificado. - En su proveedor DNS, cree el CNAME o el alias admitido que apunte al nombre de host CloudFront. Espere DNS, implementación de certificado y distribución. - Utilice `https://media.example.com` como origen de entrega. Un DNS CNAME por sí solo es insuficiente sin la configuración del dominio y el certificado CloudFront. ## 6. Conecte Amazon S3 a DRM-X 6.0[#](#connect-drmx) Abrir [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Elija **Amazon S3**. | Campo | Qué ingresar | | --- | --- | | Display name | Una etiqueta amigable, como Producción S3. | | Bucket name | El nombre exacto, sin `s3://`. | | Region | El código de región AWS exacto del depósito. | | Protected-content base path | `protected`, que coincide con las políticas IAM y de depósito. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` o `https://media.example.com/protected`. | | Access key ID / Secret access key | El par de claves del usuario IAM dedicado. | Los ejemplos utilizan una carpeta llamada `protected`. El nombre del depósito no es automáticamente una carpeta. Con la asignación directa de dominio a depósito que se utiliza aquí, incluya la misma carpeta de almacenamiento exactamente una vez en el prefijo público 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 ``` Para usar la raíz del depósito, deje la ruta base en blanco e ingrese solo el origen de entrega como prefijo público. No agregues un nombre de depósito a menos que lo uses deliberadamente como carpeta. Deje CloudFront Origin path vacío para este mapeo. Seleccione el destino de carga predeterminado si lo desea, luego **Save and verify**. El nombre de host S3 API no es su CloudFront entrega URL. ### Genera tus campos CORS y URL coincidentes Esta herramienta se ejecuta en su navegador. Introduzca únicamente orígenes públicos; No solicita claves de acceso. Orígenes de los sitios web del reproductorReemplace el ejemplo. Separe varios orígenes HTTPS con espacios o comas. Utilice el sitio web que incorpora su reproductor, sin una ruta de página. DRM-X Console y Playback Lab se incluyen automáticamente.Origen de entrega públicaIngrese su dominio personalizado conectado, habilitado r2.dev URL o CloudFront origen. Omita la carpeta aquí.Carpeta de almacenamiento (opcional)Generar configuración Copiar CORS JSON ``` ``` Protected-content base path``Public URL prefix``Ejemplo de clave de objeto``Ejemplo de URL completa`` ## 7. Subir un archivo y verificar que funcione[#](#test-upload) - Abra [Cloud Storage](https://6.drm-x.com/console/cloud-storage), seleccione este destino y elija **Verify location**. El éxito significa que el servidor DRM-X puede enumerar el depósito. No establece permiso de escritura, navegador CORS ni entrega pública. - Seleccione **Upload encrypted files** y elija un pequeño segmento cifrado de un paquete DRM-X existente. Si no tiene un paquete, utilice el diagnóstico cifrado desechable a continuación. No subas un vídeo original o un documento personal. - Espere el mensaje de éxito. Comprueba que el nombre del archivo y el tamaño aparecen en Cloud Storage. Busque el mismo objeto en `protected/` en la consola de su proveedor. - Haga clic en **Preview URL** y pruebe ese mismo objeto en una ventana privada del navegador. Debería descargar o devolver HTTP 200 sin iniciar sesión AWS o Cloudflare. Pruebe un objeto real: la raíz de un dominio puede devolver 403/404 incluso cuando la entrega del objeto funciona. - Verifique la entrega entre orígenes desde el sitio web de su reproductor. El panel de red de su navegador debería mostrar `Access-Control-Allow-Origin` que coincida con el origen de la página del reproductor. Una descarga directa desde la barra de direcciones no prueba CORS. El siguiente ejemplo de terminal también verifica los encabezados. - Retire solo su objeto de diagnóstico desechable cuando haya terminado. Luego siga la [Guía de Desktop Packager](https://docs.drm-x.com/es/packaging/desktop), seleccione este destino de almacenamiento en Package content y cargue el paquete cifrado completo. Cargar un archivo manualmente no registra un Published Content ID. - Pruebe el archivo Published resultante en [Universal Playback Lab](https://multi-drm.drm-x.com/es/player) y en el sitio web de su propio reproductor. Verifique video, audio, desplazamiento en la línea de tiempo y sus dispositivos requeridos. Una descarga binaria exitosa no es prueba de reproducción de DRM. ¿No hay muestra cifrada? Cree un archivo de prueba desechable en Windows Ejecute esto en Windows PowerShell en una carpeta temporal que controle. Cifra un mensaje breve no personal con una clave AES de un solo uso que se guarda únicamente en la memoria. El resultado es un diagnóstico de almacenamiento, no un medio reproducible; no contiene ninguna DRM clave de contenido ni datos del cliente. ``` $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 ``` Cargue `drmx-storage-check.encrypted.bin`, verifique su tamaño y Preview URL, luego retírelo del depósito. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Reemplace ambas URL. Espere HTTP 200 y un origen permitido que coincida con el sitio web de su reproductor. Para la entrega de rango, una solicitud GET con `Range: bytes=0-15` debe devolver HTTP 206 y un encabezado Content-Range válido. Conserve los tipos de medios MIME: los manifiestos DASH usan application/dash+xml, las listas de reproducción HLS usan application/vnd.apple.mpegurl y los archivos multimedia deben usar su tipo de medio apropiado. ## 8. Resolver problemas[#](#troubleshooting) | Resultado | Acción | | --- | --- | | Verify location pasa, pero falla la carga desde el navegador | Inspeccionar el navegador Console y los paneles de Red. Permita PUT CORS desde el origen exacto Console y Content-Type. También verifique la conectividad y vuelva a intentarlo para obtener un URL prefirmado nuevo. | | La carga devuelve 403 | Verifique el permiso de escritura del objeto, el alcance del depósito/carpeta, el punto final, la región, la caducidad de la solicitud y el reloj. No comparta URL de carga firmadas. | | La carga se realizó correctamente; público URL devuelve 403 | Verifique si la entrega pública está habilitada y si el dominio/distribución ha terminado de implementarse. | | Público URL devuelve 404 | Compare la URL completa con la clave exacta del objeto. Compruebe si faltan o se duplican carpetas y respete las mayúsculas y minúsculas del nombre de archivo. | | URL abre directamente; la recuperación del reproductor falla | Agregue el origen de la página del reproductor a GET/HEAD CORS. Verifique los encabezados de respuesta CDN e invalide las respuestas almacenadas en caché obsoletas afectadas. | | La descarga se realizó correctamente; la reproducción falla | Verifique la publicación del paquete, las rutas del manifiesto, los MIME tipos y la DRM autorización de licencia. Consulte [solución de problemas de reproducción](https://docs.drm-x.com/es/troubleshooting/playback). | **CloudFront 403:** confirma que OAC firma solicitudes, la política del depósito utiliza la distribución ARN y el prefijo correctos, y el origen es el punto final S3 REST. Mantenga S3 Block Public Access activado. Marque los permisos KMS si elige SSE-KMS. ## Referencias oficiales[#](#references) - [Crear un S3 depósito](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Administrar IAM claves de acceso](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS configuración](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC y S3 políticas de depósito](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront encabezados de respuesta](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Políticas de solicitud de origen administradas](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Dominios y certificados personalizados](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) ¿Usando Cloudflare? Siga [Cloudflare R2 configuración](https://docs.drm-x.com/es/storage/cloudflare-r2).