

# IVS Composite Recording \$1 リアルタイムストリーミング
<a name="rt-composite-recording"></a>

このドキュメントでは、[サーバーサイドコンポジション](server-side-composition.md)で Composite Recording 機能を使用する方法について説明します。Composite Recording では、IVS サーバーを使用してすべてのステージパブリッシャーを 1 つのビューに効果的に結合して IVS ステージの HLS 録画を生成し、結果のビデオを S3 バケットに保存できます。

標準の S3 ストレージとリクエストのコストが適用されます。サムネイルでは追加の IVS 料金は発生しません。詳細については、「[Amazon IVS の料金](https://aws.amazon.com/ivs/pricing/)」を参照してください。

## 前提条件
<a name="comp-rec-prerequisites"></a>

Composite Recording を使用するには、アクティブなパブリッシャーを含むステージと、録画先として使用する S3 バケットが必要です。以下では、EventBridge イベントを使用してコンポジションを S3 バケットに録画するワークフローの 1 つについて説明します。また、独自のアプリケーションロジックに基づいてコンポジションを開始および停止することもできます。

1. パブリッシャーごとに [IVS ステージ](getting-started-create-stage.md)と参加者トークンを作成します。

1. [EncoderConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateEncoderConfiguration.html) (録画したビデオのレンダリング方法を表すオブジェクト) を作成します。

1. [S3 バケット](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)と [StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html) (録画内容を保存する場所) を作成します。

   **重要**: 既存の S3 バケットを使用する場合、**オブジェクト所有権**設定は [**バケット所有者に強制する**] か、[**、バケット所有者を優先する**] である必要があります。詳細については、[オブジェクトの所有権の制御](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)に関する S3 ドキュメントを参照してください。

1. [ステージに参加して公開します](getting-started-pub-sub.md)。

1. 参加者が公開した [EventBridge イベント](eventbridge.md)を受信したら、S3 DestinationConfiguration オブジェクトを送信先として [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) を呼び出します。

1. 数秒後、HLS セグメントが S3 バケットに保持されていることがわかります。

![\[サーバーサイドコンポジションを使用して S3 バケットにステージを録画します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**注:** コンポジションは、パブリッシャーである参加者がステージ上で何も操作しない状態が 60 秒間続くと自動的にシャットダウンします。その時点でコンポジションは終了し、`STOPPED` 状態に移行します。`STOPPED` 状態に移行して数分後、コンポジションは自動的に削除されます。詳細については、「*サーバーサイドコンポジション*」の「[コンポジションのライフサイクル](ssc-overview.md#ssc-composition-endpoint)」を参照してください。

## Composite Recording の例: S3 バケットの送信先での StartComposition
<a name="comp-rec-example"></a>

以下の例では、S3 をコンポジションの唯一の送信先として指定する [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) オペレーションへの一般的な呼び出しを示しています。コンポジションが `ACTIVE` 状態に移行すると、`storageConfiguration` オブジェクトで指定された S3 バケットへのビデオセグメントとメタデータの書き込みが開始されます。異なるレイアウトのコンポジションを作成するには、「[サーバーサイドコンポジション](ssc-overview.md#ssc-api-layouts)」の「レイアウト」と「[IVS Real-Time Streaming API リファレンス](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_LayoutConfiguration.html)」を参照してください。

### リクエスト
<a name="comp-rec-example-request"></a>

```
POST /StartComposition HTTP/1.1
Content-type: application/json

{
   "destinations": [
      {
         "s3": {
            "encoderConfigurationArns": [
              "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
            ],
            "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	    "thumbnailConfigurations": [
	       {
		  "storage": ["LATEST", "SEQUENTIAL"],
		  "targetIntervalSeconds": 30
               }
	    ]
	 }
      }
   ],
   "idempotencyToken": "db1i782f1g9",
   "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr"
}
```

### レスポンス
<a name="comp-rec-example-response"></a>

```
{
    "composition": {
        "arn": "arn:aws:ivs:ap-northeast-1:927810967299:composition/s2AdaGUbvQgp",
        "destinations": [
            {
                "configuration": {
                    "name": "",
                    "s3": {
                        "encoderConfigurationArns": [
                            "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
                        ],
                        "recordingConfiguration": {
                            "format": "HLS"
                        },
                        "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	                "thumbnailConfigurations": [
	                   {
		              "storage": ["LATEST", "SEQUENTIAL"],
		              "targetIntervalSeconds": 30
                           }
	                ]
                    }
                },
                "detail": {
                    "s3": {
                        "recordingPrefix": "MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite"
                    }
                },
                "id": "2pBRKrNgX1ff",
                "state": "STARTING"
            }
        ],
        "layout": null,
        "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr",
        "startTime": "2023-11-01T06:25:37Z",
        "state": "STARTING",
        "tags": {}
    }
}
```

StartComposition レスポンスにある `recordingPrefix` フィールドを使用して、録画の内容を保存する場所を決定できます。

## 録画の内容
<a name="comp-rec-contents"></a>

コンポジションが `ACTIVE` 状態に遷移すると、StartComposition の呼び出し中に指定された S3 バケットへの HLS ビデオセグメント、メタデータファイル、サムネイル (設定されている場合) の書き込みが開始されます。このコンテンツは、後処理またはオンデマンド動画再生として利用できます。

コンポジションがライブになると、「IVS Composition State Change」イベントが発生すると、マニフェストファイル、ビデオセグメント、サムネイルが書き込まれるまでに少し時間がかかることに注意してください。「IVS Composition State Change (Session End)」イベントの受信後に、録画したストリームを再生または処理することをお勧めします。詳細については、「[IVS Real-Time Streaming で Amazon EventBridge を使用する](eventbridge.md)」を参照してください。

以下は、ライブの IVS セッションの録画のディレクトリ構造およびコンテンツの例です。

```
MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
      latest_thumbnail
```

`events`フォルダには、録画イベントに対応するメタデータファイルが含まれています。JSON メタデータファイルは、録画が開始された時、正常に終了した時、失敗して終了した時に生成されます。
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

該当する `events` フォルダには、`recording-started.json`、および `recording-ended.json` または `recording-failed.json` のどちらかが含まれます。

これらには、録画されたセッションとその出力形式に関連するメタデータが含まれます。JSON の詳細を以下に示します。

`media` フォルダには、サポートされているメディアコンテンツが含まれています。`hls` サブフォルダには、コンポジションセッション中に生成されたすべてのメディアファイルとマニフェストファイルが含まれており、IVS プレーヤーで再生できます。HLS マニフェストは `multivariant.m3u8` フォルダにあります。設定されている場合、 `thumbnails` と `latest_thumbnail` のサブフォルダには、コンポジションセッション中に生成された JPEG サムネイルメディアファイルが含まれます。

## StorageConfiguration のバケットポリシー
<a name="comp-rec-bucket-policy"></a>

StorageConfiguration オブジェクトが作成されると、IVS は指定した S3 バケットにコンテンツを書き込むためのアクセス権を取得します。このアクセス権は S3 バケットのポリシーを変更することで付与されます。バケットのポリシーが IVS のアクセス権を削除するように変更されると、進行中や新規の録画はできなくなります。

以下の例は、IVS で S3 バケットに書き込めるようにする S3 バケットポリシーを示しています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CompositeWrite-y1d212y",
            "Effect": "Allow",
            "Principal": {
                "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "Bool": {
                    "aws:SecureTransport": "true"
                }
            }
        }
    ]
}
```

------

## JSON メタデータファイル
<a name="comp-rec-json"></a>

このメタデータは JSON 形式です。これには、以下の情報が含まれています。


| フィールド | Type | 必須 | 説明 | 
| --- | --- | --- | --- | 
| `stage_arn` | 文字列 | はい | コンポジションのソースとして使用されているステージの ARN。 | 
| `media` | オブジェクト | はい | この録画に使用できるメディアコンテンツの列挙型オブジェクトを含むオブジェクト。有効な値: `"hls"`。  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | オブジェクト | はい | Apple HLS 形式の出力を記述する列挙型フィールド。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 整数 | 条件付き | 録画された HLS コンテンツの継続時間 (ミリ秒単位)。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。録画完了前に障害が発生した場合は、0 になります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい |  HLS マスタープレイリストファイルの名前。  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトのレンディション (HLS バリアント) の配列。レンディションは必ず 1 つ以上。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | このレンディションの HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | このレンディションのメディアプレイリストファイルの名前。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 条件付き | エンコードされた動画のピクセル解像度の高さ。これは、レンディションに動画トラックが含まれている場合にのみ使用できます。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 整数 | 条件付き | エンコードされた動画のピクセル解像度の幅。これは、レンディションに動画トラックが含まれている場合にのみ使用できます。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `SEQUENTIAL` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | シーケンシャルサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトの解像度 (サムネイルバリアント) の配列。常に少なくとも 1 つの解像度があります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | この解像度のサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | サムネイルのピクセル解像度の高さ。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | サムネイルのピクセル解像度の幅。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `LATEST` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | `latest_thumbnail` が格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトの解像度 (サムネイルバリアント) の配列。常に少なくとも 1 つの解像度があります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | この解像度の最新のサムネイルが保存されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | 最新のサムネイルのピクセル解像度の高さ。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | 最新のサムネイルのピクセル解像度の幅。 | 
| `recording_ended_at` | string | 条件付き | 録画終了時の RFC 3339 UTC タイムスタンプ。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 `recording_started_at`と`recording_ended_at`は、これらのイベントが生成されたときのタイムスタンプであり、HLS ビデオセグメントのタイムスタンプと完全に一致しない場合があります。録画時間を正確に決定するには、`duration_ms`フィールドを使用してください。  | 
| `recording_started_at` | string | 条件付き | 録画開始時の RFC 3339 UTC タイムスタンプ。`recording_status` が `RECORDING_START_FAILED` の場合、これは使用できません。 `recording_ended_at`については、上記の注意事項を参照してください。  | 
| `recording_status` | 文字列 | はい | 録画ステータス。有効な値は、`"RECORDING_STARTED"`、`"RECORDING_ENDED"`、`"RECORDING_START_FAILED"`、`"RECORDING_ENDED_WITH_FAILURE"` です。 | 
| `recording_status_message` | string | 条件付き | ステータスの詳細情報。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 | 
| `version` | 文字列 | はい | メタデータスキーマのバージョン。 | 

### 例: recording-started.json
<a name="comp-rec-json-ex-rec-start"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-11-01T06:01:36Z",
  "recording_status": "RECORDING_STARTED",
  "media": {
    "hls": {
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### 例: recording-ended.json
<a name="comp-rec-json-ex-rec-end"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### 例: recording-failed.json
<a name="comp-rec-json-ex-rec-fail"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED_WITH_FAILURE",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

## プライベートバケットからの録画コンテンツの再生
<a name="comp-rec-playback"></a>

デフォルトでは録画コンテンツはプライベートです。したがって、これらのオブジェクトは S3 のダイレクト URL を使用してアクセスして再生することはできません。IVS プレーヤーまたは別のプレーヤーを使用して再生するために HLS 多変量プレイリスト (m3u8 ファイル) を開こうとすると、エラー (「リクエストしたリソースへのアクセス許可がありません」という内容など) が表示されます。代わりに、Amazon CloudFront CDN (コンテンツ配信ネットワーク) を使用してこれらのファイルを再生することができます。

CloudFront ディストリビューションは、プライベートバケットからコンテンツを配信するように設定できます。通常、これは、読み取りが CloudFront が提供するコントロールをバイパスするオープンにアクセス可能なバケットを持つよりも望ましいです。オリジンアクセスコントロール (OAC) を作成すると、プライベートバケットから配信されるようにディストリビューションを設定できます。OAC は特別な CloudFront ユーザーで、プライベートオリジンバケットに対する読み取りアクセス許可を持ちます。ディストリビューションの作成後、CloudFront コンソールまたは API を使用して OAC を作成することができます。「*Amazon CloudFront デベロッパーガイド*」の「[新しいオリジンアクセスコントロールの作成](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3)」を参照してください。

### CORS を有効にした CloudFront を使用して再生をセットアップする
<a name="comp-rec-playback-setup"></a>

この例では、デベロッパーが CORS を有効にした CloudFront ディストリビューションを設定し、どのドメインからでも録画を再生できるようにする方法を説明します。これは開発段階では特に役立ちますが、以下の例を本番環境のニーズに合わせて変更できます。

#### ステップ 1: S3 バケットを作成する
<a name="comp-rec-playback-setup-step1"></a>

録画の保存に使用する S3 バケットを作成します。バケットは IVS ワークフローに使用するのと同じリージョンにある必要があることに注意してください。

次のように、十分なアクセス許可の CORS ポリシーをバケットに追加します。

1. AWS コンソールで、**[S3 バケットアクセス許可]** タブに移動します。

1. 以下の CORS ポリシーをコピーし、**[クロスオリジンリソース共有 (CORS)]** に貼り付けます。これにより S3 バケットの CORS アクセスが有効になります。

   ```
   [
       {
           "AllowedHeaders": [
               "*"
           ],
           "AllowedMethods": [
               "PUT",
               "POST",
               "DELETE",
               "GET"
           ],
           "AllowedOrigins": [
               "*"
           ],
           "ExposeHeaders": [
               "x-amz-server-side-encryption",
               "x-amz-request-id",
               "x-amz-id-2"
           ]
       }
   ]
   ```

#### ステップ 2: CloudFront ディストリビューションを作成する
<a name="comp-rec-playback-setup-step2"></a>

「*CloudFront デベロッパーガイド*」の「[CloudFront ディストリビューションの作成](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html)」を参照してください。

AWS コンソールを使用して、以下の情報を入力します。


| このフィールドには | これを選択します | 
| --- | --- | 
| オリジンドメイン | 前のステップで作成した S3 バケット | 
| オリジンアクセス | オリジンアクセスコントロール設定 (推奨)、デフォルトパラメータを使用 | 
| デフォルトのキャッシュ動作: ビューワープロトコルポリシー | Redirect HTTP to HTTPS | 
| デフォルトのキャッシュ動作: 許可される HTTP メソッド | GET、HEAD、OPTIONS | 
| デフォルトのキャッシュ動作: キャッシュキーとオリジンリクエスト | CachingDisabled ポリシー | 
| デフォルトのキャッシュ動作: オリジンリクエストポリシー | CORS-S3Origin | 
| デフォルトのキャッシュ動作: レスポンスヘッダーポリシー | SimpleCORS | 
| ウェブアプリケーションファイアウォール | セキュリティ保護を有効にする | 

次に、CloudFront ディストリビューションを保存します。

#### ステップ 3: S3 バケットポリシーを設定する
<a name="comp-rec-playback-setup-step3"></a>

1. S3 バケットに設定した StorageConfiguration をすべて削除します。これにより、そのバケットのポリシーを作成したときに自動的に追加されたバケットポリシーがすべて削除されます。

1. CloudFront ディストリビューションに移動し、すべてのディストリビューションフィールドが前のステップで定義した状態になっていることを確認し、**バケットポリシーをコピー**します (**[ポリシーをコピー]** ボタンを使用)。

1. S3 バケットに移動します。**[アクセス許可]** タブで **[バケットポリシーを編集]** を選択し、前のステップでコピーしたバケットポリシーを貼り付けます。このステップの後、バケットポリシーには CloudFront ポリシーのみが含まれているはずです。

1. S3 バケットを指定し、StorageConfiguration を作成します。

StorageConfiguration が作成されると、S3 バケットポリシーに 2 つの項目が表示されます。1 つは CloudFront がコンテンツを読み取ることを許可し、もう 1 つは IVS がコンテンツを書き込むことを許可します。CloudFront と IVS アクセスを含む最終的なバケットポリシーの例を「[例: CloudFront と IVS アクセスを含む S3 バケットポリシー](#comp-rec-playback-example)」に示します。

#### ステップ 4: 録画を再生する
<a name="comp-rec-playback-setup-step4"></a>

CloudFront ディストリビューションを正常にセットアップし、バケットポリシーを更新したら、IVS プレーヤーを使用して録画を再生できるはずです。

1. コンポジションを正常に開始し、S3 バケットに録画が保存されていることを確認します。

1. この例のステップ 1 からステップ 3 を実行すると、CloudFront URL を介してビデオファイルを使用できるようになります。CloudFront の URL は、Amazon CloudFront コンソールの **[詳細]** タブにある **[ディストリビューションドメイン名]** です。次のように表示されます。

   `a1b23cdef4ghij.cloudfront.net`

1. CloudFront ディストリビューションを介して録画した動画を再生するには、S3 バケットで `multivariant.m3u8` ファイルのオブジェクトキーを見つけます。次のように表示されます。

   `FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. CloudFront URL の末尾にオブジェクトキーを追加します。最終的にページ URL は次のようになります。

   `https://a1b23cdef4ghij.cloudfront.net/FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. これで、最終的な URL を IVS プレーヤーのソース属性に追加して、録画全体を視聴できます。録画した動画を視聴するには、「*IVS Player SDK: Web のガイド*」の「[使用開始](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/web-getting-started.html)」のデモを使用できます。

### 例: CloudFront と IVS アクセスを含む S3 バケットポリシー
<a name="comp-rec-playback-example"></a>

以下のスニペットは、CloudFront がプライベートバケットにコンテンツを読み取り、IVS がバケットにコンテンツを書き込むことを許可する S3 バケットポリシーを示しています。**注: 以下のスニペットをコピーして自分のバケットに貼り付けないでください。ポリシーには、CloudFront ディストリビューションと StorageConfiguration に関連する ID が含まれている必要があります。**

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CompositeWrite-7eiKaIGkC9DO",
      "Effect": "Allow",
      "Principal": {
        "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        },
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    },
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::844311324168:distribution/E1NG4YMW5MN25A"
        }
      }
    }
  ]
}
```

------

## トラブルシューティング
<a name="comp-rec-troubleshooting"></a>
+ **構成が S3 バケットに書き込まれません –** S3 バケットと StorageConfiguration オブジェクトが同じリージョンに作成されていることを確認してください。また、バケットポリシーをチェックして IVS がバケットにアクセスできることを確認してください。「[StorageConfiguration のバケットポリシー](#comp-rec-bucket-policy)」を参照してください。
+ ***ListCompositions* を実行してもコンポジションが見つかりません –** コンポジションは一時的なリソースです。最終状態に移行すると、数分後に自動的に削除されます。
+ **コンポジションが自動的に停止します –** ステージにパブリッシャーがいない時間が 60 秒を超えると、コンポジションは自動的に停止します。

## 既知の問題
<a name="comp-rec-issues"></a>

Composite Recording によって書き込まれたメディアプレイリストには、コンポジションの進行中はタグ `#EXT-X-PLAYLIST-TYPE:EVENT` が付けられます。コンポジションが完了すると、タグは `#EXT-X-PLAYLIST-TYPE:VOD` に更新されます。再生をスムーズにするため、このプレイリストはコンポジションが正常に終了した後にのみ使用することをお勧めします。