

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Video streamen mit CloudFront
<a name="tutorial-stream-video-with-cloudfront"></a>

Medien-Workflows speichern in der Regel fertige Inhalte — Video-on-Demand-Dateien (VOD), HTTP-Live-Streaming-Pakete (HLS), Bilder und Grafiken — auf einem FSx for ONTAP-Volume, auf das Redakteure, Produzenten und Automatisierungssysteme mit NFS oder SMB schreiben.

Mit einem Amazon S3 S3-Zugriffspunkt, der an das FSx for ONTAP-Volume angeschlossen ist, CloudFront können Inhalte direkt vom Volume aus bereitgestellt werden. Redakteure und Produktionssysteme veröffentlichen auf dem Volume wie gewohnt über NFS oder SMB, CloudFront holen Inhalte über den Access Point ab und Zuschauer erhalten die Inhalte vom nächstgelegenen Edge-Standort. CloudFront 

In diesem Tutorial kodieren Sie ein Beispielvideo als HLS-Paket mit adaptiver Bitrate, laden die Ausgabe auf einen Access Point hoch, der an ein FSx for ONTAP-Volume angeschlossen ist, konfigurieren eine CloudFront Distribution mit Origin-Zugriffskontrolle, sodass Zuschauer das Volume nicht direkt erreichen können, und überprüfen, ob der Stream durchgehend abgespielt wird. CloudFront 

**Anmerkung**  
**Die Bearbeitung dieses Tutorials dauert etwa 40 bis 60 Minuten.** Für die AWS-Services verwendeten Ressourcen fallen Gebühren für die von Ihnen erstellten Ressourcen an. Wenn Sie alle Schritte, einschließlich des Abschnitts **Aufräumen**, umgehend abschließen, belaufen sich die voraussichtlichen Kosten im Osten der USA (Nord-Virginia) AWS-Region auf weniger als **1$**. In dieser Schätzung sind die laufenden Gebühren für das FSx for ONTAP-Volumen selbst nicht enthalten.

## Wie funktioniert das Muster
<a name="tutorial-cf-how-it-works"></a>

Der Anforderungsablauf ist:
+ Der Player eines Zuschauers (Browser, mobile App, Smart-TV) fordert die HLS-Master-Playlist von der CloudFront Domain an.
+ CloudFront überprüft seinen Edge-Cache. Wenn ein Fehler auftritt, CloudFront signiert er eine Anfrage mithilfe von Signature Version 4 (Sigv4) mit seiner Origin Access Control (OAC) und leitet sie an den Amazon S3 S3-Endpunkt für den Access Point weiter.
+ Der Access Point autorisiert die Anfrage anhand seiner Zugriffsrichtlinie, sodass der CloudFront Service Principal auf Ihre Distribution beschränkt ist, und gibt das angeforderte Objekt vom FSx for ONTAP-Volume zurück.
+ CloudFront speichert die Antwort am Edge im Cache und gibt sie an den Viewer zurück.

HLS-Pakete kombinieren zwei Arten von Dateien, die von unterschiedlichen Cache-Richtlinien profitieren:
+ **Playlisten** (`.m3u8`) beschreiben, aus welchen Segmenten der Stream besteht. Verwenden Sie eine kurze `Cache-Control` TTL, damit Sie aktualisierte Playlisten schnell veröffentlichen können.
+ **Segmente** (`.ts`) enthalten das kodierte Video und Audio. Einmal geschrieben, ändert sich der Inhalt eines Segments nie. Verwenden Sie daher eine lange, unveränderliche TTL`Cache-Control`.

## Voraussetzungen
<a name="tutorial-cf-prerequisites"></a>
+ Ein FSx for ONTAP-Volume mit angeschlossenem Amazon S3 S3-Zugriffspunkt. Der Access Point muss über einen Ursprung **im Internet-Netzwerk** verfügen, damit er erreicht CloudFront werden kann. Detaillierte Anweisungen finden Sie unter [Erstellen eines Zugriffspunkts](fsxn-creating-access-points.md).
+ AWS CLI Version 2 wurde installiert und mit Anmeldeinformationen konfiguriert, mit denen CloudFront Distributionen, Zugriffskontrollen für die Herkunft und Zugriffspunktrichtlinien erstellt werden können.
+ [FFmpeg](https://ffmpeg.org/) wurde lokal installiert, um das Beispielvideo in HLS zu kodieren.
+ Eine Quellvideodatei. Dieses Tutorial verwendet den [Sintel-Trailer](https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4) der Blender Foundation, einen 52-Sekunden-1080p-Clip, der unter Creative Commons veröffentlicht wurde.

## Schritt 1: Kodieren Sie das Quellvideo als HLS-Paket
<a name="tutorial-cf-encode"></a>

Verwenden Sie FFmpeg, um ein HLS-Paket mit drei Varianten bei 360p, 720p und 1080p mit realistischen Over-the-Top- (OTT) -Bitraten zu erstellen. Das resultierende Paket enthält eine Master-Playlist, die auf Playlisten pro Variante verweist, von denen jede vier Sekunden lange Transport-Stream-Segmente auflistet.

1. Laden Sie das Quellvideo herunter.

   ```
   $ mkdir -p ~/media && cd ~/media
   curl -sSL -o sintel-1080p.mp4 \
       https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
   ```

1. Kodieren Sie das Video mit drei Varianten mit adaptiver Bitrate in HLS.

   ```
   $ 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"
   ```

   Der Befehl erzeugt einen Verzeichnisbaum mit einer Master-Playlist, drei Varianten-Playlisten und den Transport-Stream-Segmenten für jede 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
       └── ...
   ```

## Schritt 2: Laden Sie das HLS-Paket auf den Access Point hoch
<a name="tutorial-cf-upload"></a>

Laden Sie das Paket zweimal hoch — einmal für Playlisten mit einer kurzen TTL und einmal für Segmente mit einer langen, unveränderlichen TTL. Die richtige Einstellung `Content-Type` ist wichtig: Die meisten Spieler benötigen `application/vnd.apple.mpegurl` für und für`.m3u8`. `video/mp2t` `.ts`

Ersetzen Sie es {{access-point-alias}} durch den Alias Ihres Access Points.

```
$ # 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"
```

Stellen Sie sicher, dass beide Dateien mit den erwarteten Inhaltstypen und Cache-Headern hochgeladen wurden.

```
$ aws s3api head-object --bucket {{access-point-alias}} \
    --key content/sintel/master.m3u8 \
    --query '{ContentType:ContentType,CacheControl:CacheControl}'
```

## Schritt 3: Erstellen Sie eine Origin-Zugriffskontrolle
<a name="tutorial-cf-oac"></a>

Mit einer Origin-Zugriffskontrolle (OAC) können Anfragen CloudFront an Ihren Access Point signiert werden, sodass nur Objekte abgerufen CloudFront werden können. Ohne OAC könnten Zuschauer das umgehen, CloudFront indem sie Objekte direkt vom Access Point-Endpunkt aus anfordern.

```
$ aws cloudfront create-origin-access-control \
    --origin-access-control-config \
    'Name=fsxn-media-oac,SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3'
```

Beachten Sie die `Id` in der Antwort. Sie werden ihn im nächsten Schritt verwenden.

## Schritt 4: Erstellen Sie die Verteilung CloudFront
<a name="tutorial-cf-distribution"></a>

Erstellen Sie eine CloudFront Distribution mit dem Access Point-Alias als Ursprungsdomäne. Verwenden Sie die `CachingOptimized` verwaltete Cache-Richtlinie, die die in Schritt 2 festgelegten `Cache-Control` Header berücksichtigt.

1. Speichern Sie die folgende Konfiguration in einer Datei mit dem Namen und ersetzen Sie `dist.json` dabei die Platzhalter.

   ```
   {
       "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}
   }
   ```
**Anmerkung**  
`PriceClass_100`verwendet CloudFront Edge-Standorte nur in Nordamerika und Europa, wodurch die Kosten für dieses Tutorial gesenkt werden. Ändern Sie den Wert für eine globale Kantenabdeckung in`PriceClass_All`. Weitere Informationen finden Sie unter [Auswahl der Preisklasse für eine CloudFront Verteilung](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PriceClass.html).

1. Erstellen Sie die Verteilung.

   ```
   $ aws cloudfront create-distribution --distribution-config file://dist.json \
       --query 'Distribution.{Id:Id,DomainName:DomainName,ARN:ARN}'
   ```

   Notieren Sie sich die Vertriebs-ID, den ARN und den Domainnamen in der Antwort. Die Bereitstellung der Verteilung dauert ungefähr fünf Minuten. Während der Bereitstellung können Sie mit Schritt 5 fortfahren.

## Schritt 5: Fügen Sie eine Zugriffspunktrichtlinie hinzu, die Folgendes ermöglicht CloudFront
<a name="tutorial-cf-ap-policy"></a>

Die Zugriffspunktrichtlinie gewährt dem CloudFront Dienstprinzipal die Berechtigung, Objekte zu lesen, die auf Ihre spezifische Verteilung unter Verwendung der `AWS:SourceArn` Bedingung beschränkt sind.

1. Speichern Sie die folgende Richtlinie in einer Datei mit dem Namen und ersetzen Sie `ap-policy.json` dabei die Platzhalter.

   ```
   {
       "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}}"
               }
           }
       }]
   }
   ```

1. Hängen Sie die Richtlinie an den Access Point an.

   ```
   $ aws s3control put-access-point-policy \
       --account-id {{account-id}} \
       --name {{access-point-name}} \
       --policy file://ap-policy.json
   ```

## Schritt 6: Überprüfen Sie die Wiedergabe
<a name="tutorial-cf-verify"></a>

Warten Sie, bis die Verteilung den `Deployed` Status erreicht hat.

```
$ aws cloudfront get-distribution --id {{distribution-id}} \
    --query 'Distribution.Status'
```

Rufen Sie die Master-Playlist über CloudFront ab.

```
$ curl -sS "https://{{distribution-domain}}/content/sintel/master.m3u8"
```

In der Antwort sollten die drei Varianten aufgeführt sein.

```
#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
```

Überprüfen Sie die Antwortheader auf den korrekten Inhaltstyp, die Cachesteuerung und den Cachestatus.

```
$ curl -sSI "https://{{distribution-domain}}/content/sintel/stream_1080p/seg_000.ts"
```

Eine erfolgreiche Antwort zeigt `content-type: video/mp2t``cache-control: max-age=31536000,immutable`, und eine `x-cache` Kopfzeile, die angibt, ob die Antwort vom Edge oder vom Ursprung kam.

Spielen Sie abschließend den Stream mit FFmpeg Ende an Ende ab, um zu überprüfen, ob alle Segmente korrekt abgerufen und dekodiert wurden.

```
$ ffprobe -v error \
    -show_entries stream=codec_name,width,height \
    -show_entries format=duration \
    "https://{{distribution-domain}}/content/sintel/master.m3u8"
```

[Sie können die URL der Master-Playlist auch in Safari oder VLC öffnen oder sie mit einem Player wie hls.js in eine Webseite einbetten. JavaScript ](https://github.com/video-dev/hls.js)

## Erweiterung des Musters
<a name="tutorial-cf-extending"></a>
+ **Verwenden Sie eine benutzerdefinierte Domain mit HTTPS.** Fordern Sie ein ACM-Zertifikat für Ihre Domain an, fügen Sie es der Distribution bei und fügen Sie einen CNAME-Eintrag hinzu, der auf die CloudFront Domain verweist. Anweisungen finden Sie unter [Benutzerdefinierte URLs verwenden mit](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-procedures.html). CloudFront
+ **Schützen Sie Premium-Inhalte mit signierten URLs oder signierten Cookies.** Verwenden CloudFront Sie signierte URLs oder signierte Cookies für Inhalte, für die eine Autorisierung erforderlich ist (Abonnementdienste, Early-Access-Vorschauen, geografisch abgegrenzte Inhalte). Weitere Informationen findest du unter [Bereitstellung privater Inhalte mit](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html) signierten URLs und signierten Cookies.
+ **Machen Sie den Cache ungültig, wenn Sie neue Inhalte veröffentlichen.** Wenn Sie eine Playlist ersetzen oder ein neues HLS-Paket hochladen, verwenden Sie diese Option, `aws cloudfront create-invalidation` um die alten Versionen von CloudFront Edges zu entfernen. Bei unveränderlichen Segmenten mit langen TTLs ist eine Invalidierung normalerweise nicht erforderlich, da die Namen der Segmentdateien pro Paket eindeutig sind.
+ **Aktivieren Sie CORS für browserbasierte Player.** Wenn ein browserbasierter HLS-Player auf einer anderen Domain Ihren Stream lädt, fügen Sie mithilfe einer `Access-Control-Allow-Origin` Antwort-Header-Richtlinie Header zu Antworten hinzu. CloudFront
+ **Viewer-Anfragen protokollieren.** Aktivieren Sie die CloudFront Standardprotokollierung oder Echtzeitprotokolle, um Zuschaueranfragen zur Analyse, Abrechnung oder Missbrauchserkennung zu erfassen.

## Fehlerbehebung
<a name="tutorial-cf-troubleshooting"></a>

403 Verboten von CloudFront  
Die Zugriffspunktrichtlinie fehlt, enthält den CloudFront Dienstprinzipal nicht, oder die `AWS:SourceArn` Bedingung verweist auf den falschen Verteilungs-ARN. Überprüfen Sie die Richtlinie mit `aws s3control get-access-point-policy` und stellen Sie sicher, dass der Verteilungs-ARN mit dem in Ihrer `aws cloudfront create-distribution` Antwort übereinstimmt.

Der Player lädt die Master-Playlist, kann sie aber nicht abspielen  
Vergewissern Sie sich, dass die Segmentdateien `Content-Type: video/mp2t` und die Playlisten dies getan haben`Content-Type: application/vnd.apple.mpegurl`. Manche Player lehnen Segmente mit generischen Inhaltstypen ab. Re-upload mit der richtigen `--content-type` Flagge.

Neue Playlisten brauchen Zeit, um Zuschauer zu erreichen  
CloudFront speichert Playlisten für die TTL, die in deinem `Cache-Control` Header festgelegt wurden. Wenn du eine kürzere TTL benötigst, lade die Playlist mit einem kleineren `max-age` Wert erneut hoch oder erstelle eine Invalidierung. Bei Segmenten tritt dieses Problem nicht auf, da sich ihr Inhalt nicht ändert.

`x-cache: Miss from cloudfront`auf jede Anfrage  
Das ist normal, wenn ein Zuschauer in einer Region zum ersten Mal eine Datei anfordert. CloudFront ruft bei einem Fehlschlag vom Ursprung ab und speichert die Antwort für die TTL im Cache. Nachfolgende Anfragen nach derselben Datei von diesem Edge-Standort kehren zurück. `Hit from cloudfront`

Der direkte Zugriff auf den Access Point wurde verweigert  
Das ist normal. Das OAC verlangt SigV4-signed Anfragen von CloudFront, und die Zugriffspunktrichtlinie schränkt den Zugriff auf den CloudFront Dienstprinzipal ein. Zuschauer können den Inhalt nur über die Distributionsdomäne erreichen.

## Bereinigen
<a name="tutorial-cf-clean-up"></a>

Deaktivieren und löschen Sie die Distribution und löschen Sie anschließend die verbleibenden Ressourcen. Die Distribution muss deaktiviert werden, bevor sie gelöscht werden kann. Dies dauert einige Minuten.

Für die Deaktivierung sind zwei Werte erforderlich`get-distribution-config`: `ETag` for `--if-match` und das innere `DistributionConfig` Objekt for `--distribution-config` (die vollständige Antwort enthält auch das ETag, `update-distribution` das nicht akzeptiert wird).

```
$ # Capture the current ETag and the DistributionConfig body
GET_ETAG=$(aws cloudfront get-distribution-config --id {{distribution-id}} \
    --query 'ETag' --output text)
aws cloudfront get-distribution-config --id {{distribution-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 --id {{distribution-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 --id {{distribution-id}} \
    --query 'Distribution.Status'

# Delete the distribution using the ETag from the update call.
aws cloudfront delete-distribution --id {{distribution-id}} \
    --if-match "$UPDATE_ETAG"

# Fetch the OAC ETag, then delete the OAC.
OAC_ETAG=$(aws cloudfront get-origin-access-control --id {{oac-id}} \
    --query 'ETag' --output text)
aws cloudfront delete-origin-access-control --id {{oac-id}} \
    --if-match "$OAC_ETAG"
aws s3control delete-access-point-policy \
    --account-id {{account-id}} --name {{access-point-name}}
aws s3 rm "s3://{{access-point-alias}}/content/sintel/" --recursive
```