【AWS】ライブ配信 お手軽設定のススメ


#はじめに
AWS Media Servicesを使ってライブ配信を行ったときの、
最低限の設定を備忘録としてメモしておきます。

細かな設定値は、それぞれの環境に置き換えていただければ幸いです。

#構成
MediaLive - MediaStore - CloudFront

<img width="930" alt="product-page-diagram-Elemental-MediaStore@2x.c9dbe057a8a9614d36fd9a196019b002cb898d01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/3160ead9-6674-8d0f-6e8b-f1463a1ab87b.png">

引用：https://aws.amazon.com/jp/mediastore/

#要件
・HLS
・ABR（2M, 1M ,500K）
・各種ログ : 有効（トラブルシューティング対応のため）
・トップレベルマニフェスト : 有効

#MediaLive
##Input
|項目|値|その他|
|:--|:--|:--|
|Input type|RTMP(push)|
|Network mode|Public|
|Input security group|0.0.0.0/0|
|Input destinations|Destination A|live, xxx|
|Input destinations|Destination B|live, xxx|

##Channnel
###Channel and input details
|項目|値|その他|
|:--|:--|:--|
|IAM role|MediaLiveAccessRole|
###General settings
|項目|値|その他|
|:--|:--|:--|
|Channnel logging|Log level = **INFO**|
###Input attachment
|項目|値|その他|
|:--|:--|:--|
|Attachment name|上記で作成したInputを選択|
###Output Groups
「**HLS**」で作成

|項目|値|その他|
|:--|:--|:--|
|HLS group destination A|mediastoressl://XXXXXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/live/xxx|
|HLS group destination B|mediastoressl://XXXXXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/live/xxx|

####HLS settings
|項目|値|その他|
|:--|:--|:--|
|CDN Settings|Hls media store|
|Input Loss Action|PAUSE_OUTPUT|
####HLS outputs
|項目|値|その他|
|:--|:--|:--|
|Output 1|_2000k|
|Output 2|_1000k|
|Output 3|_500k|
#####Manifest and Segments
|項目|値|その他|
|:--|:--|:--|
|Segment Length|任意の秒数|
|Redundant Manifest|ENABLED|
####Output1 - Stream settings

Video

|項目|値|その他|
|:--|:--|:--|
|Width|1280
|Height|720
|Codec Settings|H264|
|Rate Control|CBR, 2000000|
|Frame rate|SPECIFIED, 30, 1|
|GOP Structure|60, FRAMES, 2|

Audio

|項目|値|その他|
|:--|:--|:--|
|Codec Settings|Aac|
|Bitrate|128000|

Output2,3は省略。

#MediaStore
|項目|値|その他|
|:--|:--|:--|
|Access logging|Enabled|AWSコンソールから操作可能
|Container policy|※1|下記参照|
|Container CORS policy|※2|下記参照|

※1 : Container policy

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadOverHttps",
      "Effect": "Allow",
      "Action": ["mediastore:GetObject", "mediastore:DescribeObject"],
      "Principal": "*",
      "Resource": "arn:aws:mediastore:<region>:<owner acct number>:container/<container name>/*",
      "Condition": {
        "Bool": {
            "aws:SecureTransport": "true"
        }
      }
    }
  ]
}
```

【参考】コンテナポリシーの例: HTTPS 経由のパブリック読み取りアクセス
https://docs.aws.amazon.com/ja_jp/mediastore/latest/ug/policies-examples-public-https.html

※2 : Container CORS policy

```
[
  {
    "AllowedHeaders": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ],
    "AllowedOrigins": [
      "*"
    ],
    "MaxAgeSeconds": 3000
  }
]
```

【参考】CORS ポリシーの例: 任意のドメインへの読み取りアクセス
https://docs.aws.amazon.com/ja_jp/mediastore/latest/ug/cors-policies-examples-read-all-domains.html

#CloudFront
|項目|値|その他|
|:--|:--|:--|
|Logging|On|
|Origin Protocol Policy|Match Viewer
|Viewer Protocol Policy|Redirect HTTP to HTTPS
|Whitelist Headers|Origin|
|Error Pages|必要なものを設定|

【参考】AWS Elemental MediaStore をオリジンとしたビデオの配信
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/live-streaming.html#video-streaming-mediastore

#おわりに
上記の設定で簡単にライブ配信が可能です。いい時代になりました。
MediaStoreのCORS設定は、忘れがちなので注意が必要。