Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Diffusez des vidéos en utilisant CloudFront
Les flux de travail multimédia stockent généralement le contenu fini (fichiers vidéo à la demande (VOD), packages HTTP Live Streaming (HLS), images et graphiques, sur un volume FSx for ONTAP sur lequel les éditeurs, les producteurs et les systèmes d'automatisation écrivent via NFS ou SMB.
Avec un point d'accès Amazon S3 connecté au volume FSx for ONTAP, CloudFront vous pouvez diffuser du contenu directement depuis le volume. Les éditeurs et les systèmes de production publient sur le volume via NFS ou SMB comme ils l'ont toujours fait, CloudFront récupèrent le contenu via le point d'accès et les spectateurs reçoivent le contenu depuis l'emplacement périphérique le plus proche CloudFront .
Dans ce didacticiel, vous allez encoder un exemple de vidéo sous la forme d'un package HLS à débit adaptatif, télécharger la sortie sur un point d'accès connecté à un volume FSx for ONTAP, configurer une CloudFront distribution avec un contrôle d'accès à l'origine afin que les spectateurs ne puissent pas le contourner pour accéder directement CloudFront au volume, et vérifier que le flux est diffusé de bout en bout.
Note
Ce didacticiel prend environ 40 à 60 minutes. Les ressources que vous Services AWS utilisez sont facturées pour les ressources que vous créez. Si vous effectuez rapidement toutes les étapes, y compris la section Nettoyage, le coût prévu est inférieur à 1$ dans l'est des États-Unis (Virginie du Nord) Région AWS. Cette estimation n'inclut pas les frais permanents pour le volume FSx for ONTAP lui-même.
Comment fonctionne le patron
Le flux de demandes est le suivant :
Le lecteur d'un téléspectateur (navigateur, application mobile, téléviseur intelligent) demande la playlist principale HLS au CloudFront domaine.
CloudFront vérifie son cache périphérique. En cas d'échec, CloudFront signe une demande à l'aide de Signature Version 4 (Sigv4) avec son contrôle d'accès d'origine (OAC) et la transmet au point de terminaison Amazon S3 pour le point d'accès.
Le point d'accès autorise la demande conformément à sa politique d'accès, qui permet au principal de CloudFront service de s'étendre à votre distribution, et renvoie l'objet demandé depuis le volume FSx for ONTAP.
CloudFront met en cache la réponse sur le bord et la renvoie au visualiseur.
Les packages HLS combinent deux types de fichiers qui bénéficient de politiques de cache différentes :
Les playlists (
.m3u8) décrivent les segments composant le stream. Utilisez unCache-ControlTTL court pour publier rapidement des playlists mises à jour.Les segments (
.ts) contiennent la vidéo et l'audio codés. Une fois écrit, le contenu d'un segment ne change jamais. Utilisez donc unCache-ControlTTL long et immuable.
Conditions préalables
Un volume FSx for ONTAP associé à un point d'accès Amazon S3. Le point d'accès doit avoir une origine de réseau Internet pour CloudFront pouvoir y accéder. Pour obtenir des instructions, veuillez consulter Création d’un point d’accès.
AWS CLI version 2 installée et configurée avec des informations d'identification permettant de créer des CloudFront distributions, des contrôles d'accès à l'origine et des politiques de point d'accès.
FFmpeg
installé localement, pour encoder l'échantillon vidéo en HLS. Un fichier vidéo source. Ce tutoriel utilise la bande annonce de Sintel
de la Blender Foundation, un clip 1080p de 52 secondes publié sous Creative Commons.
Étape 1 : encoder la vidéo source sous forme de package HLS
Utilisez FFmpeg pour produire un package HLS à trois variantes à 360p, 720p et 1080p avec des débits binaires overthe-top (OTT) réalistes. Le package obtenu inclut une liste de lecture principale qui fait référence à des listes de lecture par variante, chacune répertoriant des segments de flux de transport de quatre secondes.
-
Téléchargez la vidéo source.
$mkdir -p ~/media && cd ~/media curl -sSL -o sintel-1080p.mp4 \ https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4 -
Encodez la vidéo au format HLS avec trois variantes de débit adaptatif.
$mkdir hls && cd hls ffmpeg -i ../sintel-1080p.mp4 \ -filter_complex "[0:v]split=3[v1][v2][v3]; \ [v1]scale=w=640:h=360[v1out]; \ [v2]scale=w=1280:h=720[v2out]; \ [v3]scale=w=1920:h=1080[v3out]" \ -map "[v1out]" -c:v:0 libx264 -b:v:0 800k -maxrate:v:0 856k -bufsize:v:0 1200k \ -map "[v2out]" -c:v:1 libx264 -b:v:1 3000k -maxrate:v:1 3200k -bufsize:v:1 4500k \ -map "[v3out]" -c:v:2 libx264 -b:v:2 5500k -maxrate:v:2 5900k -bufsize:v:2 8250k \ -preset veryfast -g 48 -keyint_min 48 -sc_threshold 0 \ -map a:0 -map a:0 -map a:0 -c:a aac -b:a:0 96k -b:a:1 128k -b:a:2 128k \ -f hls -hls_time 4 -hls_playlist_type vod -hls_flags independent_segments \ -hls_segment_filename "stream_%v/seg_%03d.ts" \ -master_pl_name master.m3u8 \ -var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \ "stream_%v/playlist.m3u8"La commande produit une arborescence de répertoires avec une liste de lecture principale, trois listes de lecture variantes et les segments de flux de transport pour chaque variante.
hls/ ├── master.m3u8 ├── stream_360p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... ├── stream_720p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... └── stream_1080p/ ├── playlist.m3u8 ├── seg_000.ts └── ...
Étape 2 : télécharger le package HLS sur le point d'accès
Téléchargez le package deux fois : une fois pour les playlists avec un TTL court, et une fois pour les segments avec un TTL long et immuable. Content-TypeIl est important de définir le bon réglage : la plupart des joueurs ont besoin application/vnd.apple.mpegurl de pour .m3u8 et video/mp2t pour.ts.
access-point-aliasRemplacez-le par l'alias de votre point d'accès.
$# Playlists: short TTL, m3u8 content type aws s3 cp ~/media/hls/ "s3://access-point-alias/content/sintel/" \ --recursive --exclude "*" --include "*.m3u8" \ --content-type "application/vnd.apple.mpegurl" \ --cache-control "max-age=60" # Segments: long immutable TTL, ts content type aws s3 cp ~/media/hls/ "s3://access-point-alias/content/sintel/" \ --recursive --exclude "*" --include "*.ts" \ --content-type "video/mp2t" \ --cache-control "max-age=31536000,immutable"
Vérifiez que les deux fichiers ont été téléchargés avec les types de contenu et les en-têtes de cache attendus.
$aws s3api head-object --bucketaccess-point-alias\ --key content/sintel/master.m3u8 \ --query '{ContentType:ContentType,CacheControl:CacheControl}'
Étape 3 : créer un contrôle d'accès à l'origine
Un contrôle d'accès à l'origine (OAC) permet de CloudFront signer les demandes adressées à votre point d'accès afin de CloudFront ne récupérer que des objets. Sans OAC, les utilisateurs pouvaient contourner le problème CloudFront en demandant des objets directement depuis le point de terminaison du point d'accès.
$aws cloudfront create-origin-access-control \ --origin-access-control-config \ 'Name=fsxn-media-oac,SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3'
Notez le Id dans la réponse. Vous l’utiliserez à l’étape suivante.
Étape 4 : Création de la CloudFront distribution
Créez une CloudFront distribution avec l'alias du point d'accès comme domaine d'origine. Utilisez la politique de cache CachingOptimized géré, qui respecte les Cache-Control en-têtes que vous avez définis à l'étape 2.
-
Enregistrez la configuration suivante dans un fichier nommé
dist.json, en remplaçant les espaces réservés.{ "CallerReference": "fsxn-media-1", "Comment": "FSx for ONTAP media delivery", "Enabled": true, "DefaultRootObject": "", "Origins": { "Quantity": 1, "Items": [{ "Id": "fsxn-ap", "DomainName": "access-point-alias.s3.region.amazonaws.com", "S3OriginConfig": {"OriginAccessIdentity": ""}, "OriginAccessControlId": "oac-id", "ConnectionAttempts": 3, "ConnectionTimeout": 10 }] }, "DefaultCacheBehavior": { "TargetOriginId": "fsxn-ap", "ViewerProtocolPolicy": "redirect-to-https", "AllowedMethods": { "Quantity": 2, "Items": ["GET", "HEAD"], "CachedMethods": {"Quantity": 2, "Items": ["GET", "HEAD"]} }, "Compress": true, "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6" }, "PriceClass": "PriceClass_100", "ViewerCertificate": {"CloudFrontDefaultCertificate": true} }Note
PriceClass_100utilise des emplacements CloudFront périphériques uniquement en Amérique du Nord et en Europe, ce qui permet de réduire les coûts de ce didacticiel. Pour une couverture périphérique globale, remplacez la valeur parPriceClass_All. Pour plus d'informations, consultez la section Choix de la classe de prix pour une CloudFront distribution. -
Créez la distribution.
$aws cloudfront create-distribution --distribution-config file://dist.json \ --query 'Distribution.{Id:Id,DomainName:DomainName,ARN:ARN}'Notez l'ID de distribution, l'ARN et le nom de domaine dans la réponse. Le déploiement de la distribution prend environ cinq minutes. Vous pouvez passer à l'étape 5 pendant le déploiement.
Étape 5 : Joindre une politique de point d'accès qui permet CloudFront
La politique du point d'accès accorde au principal du CloudFront service l'autorisation de lire des objets, dans le cadre de votre distribution spécifique à l'aide de AWS:SourceArn cette condition.
-
Enregistrez la politique suivante dans un fichier nommé
ap-policy.json, en remplaçant les espaces réservés.{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": {"Service": "cloudfront.amazonaws.com"}, "Action": "s3:GetObject", "Resource": "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::account-id:distribution/distribution-id" } } }] } -
Attachez la politique au point d'accès.
$aws s3control put-access-point-policy \ --account-idaccount-id\ --nameaccess-point-name\ --policy file://ap-policy.json
Étape 6 : vérifier la lecture
Attendez que la distribution atteigne Deployed le statut.
$aws cloudfront get-distribution --iddistribution-id\ --query 'Distribution.Status'
Récupérez la playlist principale. CloudFront
$curl -sS "https://distribution-domain/content/sintel/master.m3u8"
La réponse doit énumérer les trois variantes.
#EXTM3U #EXT-X-VERSION:6 #EXT-X-STREAM-INF:BANDWIDTH=1031744,RESOLUTION=640x360,CODECS="avc1.64001e,mp4a.40.2" stream_360p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3497301,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2" stream_720p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=6311285,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2" stream_1080p/playlist.m3u8
Vérifiez les en-têtes de réponse pour vérifier le type de contenu, le contrôle du cache et l'état du cache corrects.
$curl -sSI "https://distribution-domain/content/sintel/stream_1080p/seg_000.ts"
Une réponse réussie s'affiche content-type: video/mp2tcache-control: max-age=31536000,immutable, et un x-cache en-tête indique si la réponse provient du bord ou de l'origine.
Enfin, jouez le stream de bout en bout avec FFmpeg pour vérifier que tous les segments sont correctement récupérés et décodés.
$ffprobe -v error \ -show_entries stream=codec_name,width,height \ -show_entries format=duration \ "https://distribution-domain/content/sintel/master.m3u8"
Élargir le motif
Utilisez un domaine personnalisé avec HTTPS. Demandez un certificat ACM pour votre domaine, associez-le à la distribution et ajoutez un enregistrement CNAME pointant vers le CloudFront domaine. Pour obtenir des instructions, consultez la section Utilisation d'URL personnalisées avec CloudFront.
Protégez le contenu premium avec des URL signées ou des cookies signés. Pour le contenu nécessitant une autorisation (services d'abonnement, aperçus en accès anticipé, contenu géo-délimité), utilisez CloudFront des URL signées ou des cookies signés. Consultez la section Diffusion de contenu privé avec des URL signées et des cookies signés.
Invalidez le cache lorsque vous publiez un nouveau contenu. Lorsque vous remplacez une playlist ou que vous téléchargez un nouveau package HLS, utilisez cette
aws cloudfront create-invalidationoption pour supprimer les anciennes versions de Edge CloudFront . Pour les segments immuables avec de longs TTL, l'invalidation n'est généralement pas nécessaire car les noms de fichiers de segments sont uniques par package.Activez CORS pour les joueurs basés sur un navigateur. Si un lecteur HLS basé sur un navigateur sur un autre domaine charge votre flux, ajoutez des en-têtes aux réponses à l'aide d'une
Access-Control-Allow-OriginCloudFront politique d'en-têtes de réponse.Requêtes du visualiseur du journal. Activez la journalisation CloudFront standard ou les journaux en temps réel pour capturer les demandes des utilisateurs à des fins d'analyse, de facturation ou de détection des abus.
Résolution des problèmes
- 403 Interdit de CloudFront
La politique du point d'accès est absente, n'inclut pas le principal du CloudFront service ou la
AWS:SourceArncondition fait référence au mauvais ARN de distribution. Vérifiez la politiqueaws s3control get-access-point-policyet confirmez que l'ARN de distribution correspond à celui indiqué dans votreaws cloudfront create-distributionréponse.- Le joueur charge la playlist principale mais ne parvient pas à la jouer
Vérifiez que les fichiers de segments sont présents
Content-Type: video/mp2tet que les playlists l'ont faitContent-Type: application/vnd.apple.mpegurl. Certains joueurs rejettent les segments contenant des types de contenu génériques. Re-upload avec le bon--content-typedrapeau.- Les nouvelles playlists mettent du temps à atteindre les spectateurs
CloudFront met en cache les playlists pour le TTL défini par votre
Cache-Controlen-tête. Si vous avez besoin d'un TTL plus court, rechargez la playlist avec unemax-agevaleur inférieure ou créez une invalidation. Les segments ne présentent pas ce problème car leur contenu ne change pas.x-cache: Miss from cloudfrontsur chaque demandeCela est normal la première fois qu'un utilisateur d'une région demande un fichier. CloudFront récupère depuis l'origine en cas d'échec et met en cache la réponse pour le TTL. Les demandes suivantes pour le même fichier provenant de cet emplacement périphérique sont renvoyées
Hit from cloudfront.- L'accès direct au point d'accès est refusé
Ceci est normal. L'OAC exige des SigV4-signed demandes de la part du CloudFront principal de service, et la politique de point d'accès restreint l'accès au principal de CloudFront service. Les spectateurs ne peuvent accéder au contenu que via le domaine de distribution.
Nettoyage
Désactivez et supprimez la distribution, puis supprimez les ressources restantes. La distribution doit être désactivée avant de pouvoir être supprimée, ce qui prend quelques minutes.
La désactivation nécessite deux valeurs get-distribution-config : le ETag for --if-match et l'DistributionConfigobjet interne for --distribution-config (la réponse complète contient également l'ETag, qui n'accepte update-distribution pas).
$# Capture the current ETag and the DistributionConfig body GET_ETAG=$(aws cloudfront get-distribution-config --iddistribution-id\ --query 'ETag' --output text) aws cloudfront get-distribution-config --iddistribution-id\ --query 'DistributionConfig' --output json \ | jq '.Enabled = false' > dist-updated.json # Disable the distribution. The response returns a new ETag. UPDATE_ETAG=$(aws cloudfront update-distribution --iddistribution-id\ --if-match "$GET_ETAG" --distribution-config file://dist-updated.json \ --query 'ETag' --output text) # Wait for Status to reach Deployed before deleting. aws cloudfront get-distribution --iddistribution-id\ --query 'Distribution.Status' # Delete the distribution using the ETag from the update call. aws cloudfront delete-distribution --iddistribution-id\ --if-match "$UPDATE_ETAG" # Fetch the OAC ETag, then delete the OAC. OAC_ETAG=$(aws cloudfront get-origin-access-control --idoac-id\ --query 'ETag' --output text) aws cloudfront delete-origin-access-control --idoac-id\ --if-match "$OAC_ETAG" aws s3control delete-access-point-policy \ --account-idaccount-id--nameaccess-point-nameaws s3 rm "s3://access-point-alias/content/sintel/" --recursive