

# Gravação composta do IVS \$1 Streaming em tempo real
<a name="rt-composite-recording"></a>

Este documento explica como usar o recurso de gravação composta na [composição do servidor](server-side-composition.md). A gravação composta permite gerar gravações HLS de um palco do IVS combinando efetivamente todos os publicadores de palco em uma visualização usando um servidor do IVS e salvando o vídeo resultante em um bucket do S3.

Sujeito a custos de armazenamento padrão e solicitação do S3. As miniaturas não incorrem em cobranças adicionais do IVS. Para obter mais detalhes, consulte [Preços do Amazon IVS](https://aws.amazon.com/ivs/pricing/).

## Pré-requisitos
<a name="comp-rec-prerequisites"></a>

Para usar a gravação composta, você deve ter um palco com publicadores ativos e um bucket do S3 para usá-lo como destino de gravação. Abaixo, descrevemos um possível fluxo de trabalho que usa eventos do EventBridge para registrar uma composição em um bucket do S3. Como alternativa, você pode iniciar e interromper as composições com base na lógica da sua própria aplicação.

1. Crie [um palco do IVS](getting-started-create-stage.md) e tokens de participante para cada publicador.

1. Crie um [EncoderConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateEncoderConfiguration.html) (um objeto que representa como o vídeo gravado deve ser renderizado).

1. Crie um [bucket do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) e uma [StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html) (onde o conteúdo da gravação será armazenado).

   **Importante**: se você usar um bucket do S3 existente, a configuração de **Propriedade do objeto** deve ser **Imposta pelo proprietário do bucket** ou **Preferencial do proprietário do bucket**. Para obter detalhes, consulte a documentação do S3 sobre como [controlar a propriedade de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html).

1. [Entre no palco e publique nele](getting-started-pub-sub.md).

1. Ao receber um [evento do EventBridge](eventbridge.md) publicado pelo participante, chame [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) com um objeto DestinationConfiguration do S3 como destino

1. Após alguns segundos, você verá os segmentos HLS como persistentes em seus buckets do S3.

![\[Como gravar um palco em um bucket do S3 usando a composição do servidor.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**Obs.:** uma composição será desligada automaticamente após 60 segundos de inatividade dos participantes do publicador no palco. Nesse ponto, a composição será encerrada e passará para um estado `STOPPED`. Uma composição será excluída automaticamente após alguns minutos no estado `STOPPED`. Para obter detalhes, consulte [Ciclo de vida da composição](ssc-overview.md#ssc-composition-endpoint) em *Composição do servidor*.

## Exemplo de gravação composta: StartComposition com um destino de bucket do S3
<a name="comp-rec-example"></a>

O exemplo abaixo mostra uma chamada habitual para a operação [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html), especificando o S3 como o único destino para a composição. Depois que a composição for transferida para um estado `ACTIVE`, os segmentos de vídeo e os metadados começarão a ser gravados no bucket do S3 especificado pelo objeto `storageConfiguration`. Para criar composições com layouts diferentes, consulte “Layouts” em [Composição do servidor](ssc-overview.md#ssc-api-layouts) e na [Referência da API de Transmissão em tempo real do IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_LayoutConfiguration.html).

### Solicitação
<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"
}
```

### Resposta
<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": {}
    }
}
```

O campo `recordingPrefix`, presente na resposta StartComposition, pode ser usado para determinar onde o conteúdo da gravação será armazenado. 

## Conteúdo do registro
<a name="comp-rec-contents"></a>

Quando a composição passar para um estado `ACTIVE`, segmentos de vídeo HLS, arquivos de metadados e miniaturas (se configurados) começarão a ser gravados no bucket do S3 especificado durante a chamada StartComposition. Esse conteúdo está disponível para pós-processamento ou reprodução como vídeo sob demanda.

Observe que após a ativação de uma composição, um evento “Mudança no estado da composição do IVS” será emitido e poderá levar algum tempo antes que os segmentos de vídeo, miniaturas e arquivos de manifesto sejam gravados. Recomendamos que você reproduza ou processe transmissões gravadas somente após o recebimento do evento “Mudança no estado da composição do IVS (fim da sessão)”. Para mais detalhes, consulte [Usar o EventBridge com o streaming em tempo real do IVS](eventbridge.md)

Veja a seguir um exemplo de estrutura de diretório e conteúdo de uma gravação de uma sessão do IVS ao vivo:

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

A pasta `events` contém os arquivos de metadados correspondentes ao evento de gravação. Os arquivos de metadados JSON são gerados quando a gravação é iniciada, termina com êxito ou termina com falhas:
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Uma determinada pasta `events` vai conter `recording-started.json` e `recording-ended.json` ou `recording-failed.json`.

Elas contêm metadados relacionados à sessão gravada e seus formatos de saída. Os detalhes de JSON são fornecidos abaixo.

A pasta `media` contém o conteúdo de mídia compatível. A subpasta `hls` contém todos os arquivos de mídia e manifesto gerados durante a sessão de composição e pode ser reproduzida com o reprodutor do IVS. O manifesto HLS está localizado na pasta `multivariant.m3u8`. Se configuradas, as subpastas `thumbnails` e `latest_thumbnail` contêm arquivos de mídia em miniatura JPEG gerados durante a sessão de composição.

## Política de bucket para StorageConfiguration
<a name="comp-rec-bucket-policy"></a>

Quando um objeto StorageConfiguration for criado, o IVS terá acesso para gravar conteúdo no bucket do S3 especificado. Esse acesso é concedido por meio de modificações na política de bucket do S3. *Se a política do bucket for alterada de modo a remover o acesso do IVS, as gravações novas e contínuas falharão.*

O exemplo abaixo mostra uma política de bucket do S3 que permite que o IVS grave no bucket do 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"
                }
            }
        }
    ]
}
```

------

## Arquivos de metadados de JSON
<a name="comp-rec-json"></a>

Os metadados estão em formato JSON. Eles contêm as seguintes informações: 


| Campo | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
| `stage_arn` | string | Sim | ARN do palco que está sendo usado como origem da composição. | 
| `media` | objeto | Sim | Objeto que contém os objetos enumerados de conteúdo de mídia disponível para essa gravação. Valores válidos: `"hls"`.  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | objeto | Sim | Campo enumerado que descreve a saída do formato HLS da Apple. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Duração do conteúdo de HLS gravado em milissegundos. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. Se ocorreu uma falha antes de qualquer gravação ter sido feita, é 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo S3 onde o conteúdo de HLS é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim |  Nome do arquivo da lista de reprodução principal de HLS.  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de representações (variante de HLS) de objetos de metadados. Há sempre pelo menos uma representação. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo S3 em que o conteúdo de HLS é armazenado para essa versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Nome do arquivo da lista de reprodução de mídia para esta versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Altura de resolução de pixels do vídeo codificado. Isso só estará disponível quando a versão contiver uma faixa de vídeo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Largura de resolução de pixels do vídeo codificado. Isso só estará disponível quando a versão contiver uma faixa de vídeo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `SEQUENTIAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde o conteúdo da miniatura sequencial é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de resoluções (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde o conteúdo da miniatura é armazenado para essa resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Altura da resolução em pixels das miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Largura da resolução em pixels das miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde `latest_thumbnail` é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de resoluções (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde a miniatura mais recente é armazenada para esta resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Altura da resolução em pixels da miniatura mais recente. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Largura da resolução em pixels da miniatura mais recente. | 
| `recording_ended_at` | string | Condicional | Timestamp RFC 3339 UTC em que a gravação terminou. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. `recording_started_at` e `recording_ended_at` são timestamps quando esses eventos são gerados e podem não corresponder exatamente aos timestamps do segmento de vídeo HLS. Para determinar com precisão a duração de uma gravação, use o campo `duration_ms`.  | 
| `recording_started_at` | string | Condicional | Timestamp RFC 3339 UTC de quando a gravação foi iniciada. Isso não estará disponível quando `recording_status` for `RECORDING_START_FAILED`. Consulte a observação acima para `recording_ended_at`.  | 
| `recording_status` | string | Sim | O status da gravação. Valores válidos: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_START_FAILED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | string | Condicional | Informações descritivas sobre o status. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `version` | string | Sim | A versão do esquema de metadados. | 

### Exemplo: 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
        }
      ]
    }
  }
}
```

### Exemplo: 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
        }
      ]
    }
  }
}
```

### Exemplo: 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
        }
      ]
    }
  }
}
```

## Reprodução de conteúdo gravado de buckets privados
<a name="comp-rec-playback"></a>

Por padrão, o conteúdo gravado é privado. Portanto, esses objetos são inacessíveis para reprodução usando o URL direto do S3. Ao tentar abrir a lista de reprodução multivariada HLS (arquivo m3u8) para reprodução usando o Reprodutor do IVS ou outro player, você receberá mensagem de um erro (p. ex., “Você não tem permissão para acessar o recurso solicitado”). Em vez disso, você pode reproduzir esses arquivos com a rede de entrega de conteúdo (CDN) do Amazon CloudFront.

As distribuições do CloudFront poderão ser configuradas para fornecer conteúdo de buckets privados. Normalmente, essa opção é preferível a ter buckets abertamente acessíveis nos quais as leituras ignoram os controles oferecidos pelo CloudFront. É possível configurar sua distribuição para fornecimento direto de um bucket privado ao criar um controle de acesso de origem (OAC), que é um usuário especial do CloudFront com permissões de leitura no bucket de origem privado. É possível criar o OAC após criar sua distribuição por meio do console ou da API do CloudFront. Consulte [Criar um novo controle de acesso de origem](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3) no *Guia do desenvolvedor do Amazon CloudFront*.

### Como configurar a reprodução usando o CloudFront com o CORS habilitado
<a name="comp-rec-playback-setup"></a>

Este exemplo mostra como um desenvolvedor pode configurar uma distribuição do CloudFront com o CORS habilitado, permitindo a reprodução de suas gravações diretamente de qualquer domínio. Isso é especialmente útil durante a fase de desenvolvimento, mas você pode modificar o exemplo abaixo para atender às suas necessidades de produção.

#### Etapa 1: Crie um bucket do S3
<a name="comp-rec-playback-setup-step1"></a>

Crie um bucket do S3 que será usado para armazenar as gravações. Observe que o bucket precisa estar na mesma região que você usa para seu fluxo de trabalho do IVS.

Adicione uma política CORS permissiva ao bucket:

1. No console da AWS, acesse a guia **Permissões de bucket do S3**.

1. Copie a política do CORS abaixo e cole-a em **Compartilhamento de recursos de origem cruzada (CORS**). Isso habilitará o acesso ao CORS no bucket do S3.

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

#### Etapa 2: Criar uma distribuição do CloudFront
<a name="comp-rec-playback-setup-step2"></a>

Consulte [Criação de uma distribuição do CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html) no *Guia do desenvolvedor do CloudFront*.

No Console da AWS, insira as seguintes informações:


| Para este campo… | Escolha isto... | 
| --- | --- | 
| Domínio de origem | O bucket do S3 que você criou na etapa anterior | 
| Acesso de origem | Configurações de controle de acesso de origem (recomendado) usando os parâmetros padrão | 
| Comportamento padrão do cache: política de protocolo do visualizador | Redirect HTTP to HTTPS | 
| Comportamento padrão do cache: métodos HTTP permitidos | GET, HEAD e OPTIONS | 
| Comportamento padrão do cache: chaves de cache e solicitações de origem | Política CachingDisabled | 
| Comportamento padrão do cache: política de solicitação de origem | CORS-S3Origin | 
| Comportamento padrão do cache: política de cabeçalhos de resposta | SimpleCORS | 
| Firewall da aplicação Web | Habilitar as proteções de segurança | 

Em seguida, salve a distribuição do CloudFront.

#### Etapa 3: configurar a política de bucket do S3
<a name="comp-rec-playback-setup-step3"></a>

1. Exclua qualquer StorageConfiguration que você tenha configurado para o bucket do S3. Isso removerá todas as políticas de bucket que foram adicionadas automaticamente ao criar a política para esse bucket.

1. Acesse sua distribuição do CloudFront, verifique se todos os campos de distribuição estão nos estados definidos na etapa anterior e **copie a política do bucket** (use o botão **Copiar política**). 

1. Acesse seu bucket do S3. Na guia **Permissões**, selecione **Editar política de bucket** e cole a política de bucket que copiou na etapa anterior. Após essa etapa, a política de bucket deverá ter exclusivamente a política do CloudFront. 

1. Crie uma StorageConfiguration, especificando o bucket do S3.

Após a criação da configuração de armazenamento, você verá dois itens na política de bucket do S3, um permitindo que o CloudFront leia conteúdo e outro permitindo que o IVS grave conteúdo. Um exemplo de uma política de bucket final, com acesso ao CloudFront e IVS, é apresentado em [Exemplo: política de bucket do S3 com acesso do CloudFront e IVS](#comp-rec-playback-example).

#### Etapa 4: reproduzir gravações
<a name="comp-rec-playback-setup-step4"></a>

Após configurar com sucesso a distribuição do CloudFront e atualizar a política do bucket, você deverá conseguir reproduzir gravações usando o Reprodutor do IVS:

1. Inicie uma composição bem-sucedida e verifique se você tem uma gravação armazenada no bucket do S3.

1. Após seguir as etapas 1 a 3 neste exemplo, os arquivos de vídeo devem estar disponíveis para consumo por meio do URL do CloudFront. O URL do CloudFront é o **Nome de domínio da distribuição** na guia **Detalhes** no console do Amazon CloudFront. Será algo do tipo: 

   `a1b23cdef4ghij.cloudfront.net`

1. Para reproduzir o vídeo gravado por meio da distribuição do CloudFront, localize a chave de objeto para o arquivo `multivariant.m3u8` no bucket do s3. Será algo do tipo:

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

1. Acrescente a chave de objeto ao final do URL do CloudFront. O URL final será mais ou menos assim:

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

1. Agora, você pode adicionar o URL final ao atributo de origem de um Reprodutor do IVS para assistir à gravação completa. Para assistir ao vídeo gravado, você pode usar a demonstração em [Introdução](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/web-getting-started.html) no *SDK do Reprodutor do IVS: guia da Web*.

### Exemplo: política de bucket do S3 com acesso do CloudFront e IVS
<a name="comp-rec-playback-example"></a>

O trecho abaixo ilustra uma política de bucket do S3 que permite ao CloudFront ler conteúdo no bucket privado e ao IVS gravar conteúdo no bucket. **Obs.: não copie e cole o trecho abaixo em seu próprio bucket. Sua política deve conter as IDs relevantes para sua distribuição e configuração de armazenamento do CloudFront.**

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

------

## Solução de problemas
<a name="comp-rec-troubleshooting"></a>
+ **A composição não é gravada no bucket do S3**: certifique-se de que o bucket do S3 e os objetos do StorageConfiguration estejam criados e estejam na mesma região. Além disso, certifique-se de que o IVS tenha acesso ao bucket verificando sua política de bucket. Consulte [Política de bucket para StorageConfiguration](#comp-rec-bucket-policy).
+ **Não consigo encontrar uma composição ao executar *ListCompositions***: as composições são recursos efêmeros. Após passarem para o estado final, elas serão excluídos automaticamente após alguns minutos.
+ **Minha composição para automaticamente:** uma composição será interrompida automaticamente se não houver um publicador no palco por mais de 60 segundos.

## Problema conhecido
<a name="comp-rec-issues"></a>

A playlist de mídia escrita por gravação composta terá a tag `#EXT-X-PLAYLIST-TYPE:EVENT` enquanto a composição estiver em andamento. Quando a composição for concluída, a tag será atualizada para `#EXT-X-PLAYLIST-TYPE:VOD`. Para uma experiência tranquila de reprodução, recomendamos que você use essa lista de reprodução somente depois que a composição for finalizada com sucesso.