AWS Elemental MediaPackageのVODパッケージングでアクセスログを設定してみた

AWS Elemental MediaPackageでライブパッケージングに続きVODパッケージングでもアクセスログがサポートされるようになっていました。実際にVODパッケージングでアクセスログを設定、内容を確認してみます。
2021.06.30

はじめに

清水です。AWS Elemental MediaPackageでは2020年10月のアップデートでライブパッケージング機能に対してのアクセスログをサポートしました。

そこから数ヶ月、MediaPackageのユーザガイドのドキュメント履歴を確認してみたところVODパッケージング機能に対してもアクセスログがサポートされるようになっていました、2021年2月24日付のドキュメントアップデートです。本エントリではこのMediaPakcageのVODパッケージングでアクセスログを設定、確認してみたのでまとめてみます。

MediaPackageのVODパッケージングでアクセスログを設定してみた

それでは実際にMediaPackageのVODパッケージング機能でアクセスログを有効化し、その内容を確認していきます。

VODパッケージングを行う上での準備

MediaPackageでVODパッケージングを行うにあたり、MediaPackageからS3へのアクセス権を設定したIAMロールが必要となります。ユーザガイドのAmazon S3 access for VOD workflowsを参考にIAMポリシーを作成しIAMロールに紐付けます。このIAMロールは信頼ポリシー(信頼関係)で"Service": "mediapackage.amazonaws.com"をPrincipalに持つように設定します。詳細はユーザガイドのAllowing AWS Elemental MediaPackage to access other AWS servicesを参照ください。また実際に設定した例をMediaPackageのVODパッケージング機能をまとめたエントリに記載しています。本エントリではこの際に作成したIAMロールMediaPackageVoD-Roleを使用します。 またVODパッケージングの入力はS3上にあるHLSまたはSMIL形式のコンテンツとなります。(VOD supported codecs and input types)今回はIAMロールと同様、MediaPackageのVODパッケージング機能をまとめたエントリ記載の際のHLS形式のコンテンツをそのまま使用します。iPhoneで撮影した動画(拡張子mov、QuickTime形式)をAWS Elemental MediaConvertのJob templates、System templates/System-Ott_Hls_Ts_Avc_Aacを使って変換したものになります。

Packaging groupの作成とアクセスログ有効化

MediaPackageのVODパッケージングにおけるリソース単位となるPackaging groupsをAWSマネジメントコンソールから作成します。この作成の際に、アクセスログ設定箇所があるので、こちらを有効にします。アクセスログの出力先はCloudWatch Logsです。Log group nameを指定可能ですが、デフォルトのVodEgressAccessLogsのまま進めます。

[Create]を押下してpackaging groupを作成すると、AWSServiceRoleForMediaPackageというIAMロールが作成されます。こちらはMediaPackageがCloudWatch Logsにアクセスログを書き込むために使用するもので、このIAMロールが存在していなければアクセスログ設定時に作成される、という挙動かと思います。

権限としてはAWS managed policy「MediaPackageServiceRolePolicy」がアタッチされ、信頼ポリシーで"Service": "mediapackage.amazonaws.com"をPrincipalに持つよう設定されていました。

AWS managed policyのMediaPackageServiceRolePolicyは現時点(2021/06/30)で以下の内容が設定されていました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:PutLogEvents",
            "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*:log-stream:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*"
        }
    ]
}

Packaging groupの設定とAssetsの作成

作成されたPackaging groupについて、Packaging configurationを作成します。実際にどんなパッケージングを行うかの設定ですね。[Manage configurations]ボタンから進みます。

Idを「mediapackage-vod-packaging-access-logging-hls-config」と設定、Package typeはデフォルトのApple HLSのままとします。(ほか項目もデフォルトのまま進めます。)

もう一つ、Package typeをDASH-ISOとしたPackaging configurationも作成しておきます。Idを「mediapackage-vod-packaging-access-logging-dash-config」としました。Package type以外の項目はデフォルトとします。

続いてAssetsを作成します。先述の通り別エントリで準備していたVODコンテンツを使用します。格納されているS3バケットを選択、IAMロールはMediaPackageVoD-Roleを選択します。Asset detailsにて、S3バケット内のm3u8ファイルへのパスを入力します。

Packaging settingsでは、先ほど作成したPackaging group「mediapackage-vod-packaging-access-logging」を選択します。最後に[Ingest assets]ボタンでAssetsが作成されます。

VODの再生とアクセスログの確認

Assetの準備ができたら(CloudWatch Eventsで確認ができます)、Playback detailsの各configurationのURLを確認して、パッケージングされたVODを再生してみます。VideoJS HTTP Streaming (VHS)を使ってHLS、DASHとも数回再生をしてみました。

VODの再生後、AWSマネジメントコンソールのCloudWatchページ、Log groupsを確認してみます、以下のようにロググループ「/aws/MediaPackage/VodEgressAccessLogs」といくつかのログストリームができていますね。

実際のログエントリを2つほどひろってみました。(うまくマニフェストファイルへのアクセスがひろえました。)

HLSエンドポイント、マニフェストファイルへのアクセス

{
    "timestamp": "2021-06-30T07:11:01.645302Z",
    "clientIp": "XXX.XXX.XXX.XXX",
    "processingTime": 0.09000000000000001,
    "statusCode": "200",
    "receivedBytes": 466,
    "sentBytes": 623,
    "method": "GET",
    "request": "https://b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com:443/out/v1/ea69xxxxxxxxxxxxxxxxxxxxxxxxxxxx/1487xxxxxxxxxxxxxxxxxxxxxxxxxxxx/6648xxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.m3u8",
    "protocol": "HTTP/2.0",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
    "account": "123456789012",
    "domainName": "b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com",
    "requestId": "Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxx536ac",
    "packagingConfigArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-configurations/mediapackage-vod-packaging-access-logging-hls-config",
    "packagingGroupArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-groups/mediapackage-vod-packaging-access-logging",
    "assetArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2"
}

DASHエンドポイント、マニフェストファイルへのアクセス

{
    "timestamp": "2021-06-30T07:14:04.555375Z",
    "clientIp": "XXX.XXX.XXX.XXX",
    "processingTime": 0.149,
    "statusCode": "200",
    "receivedBytes": 447,
    "sentBytes": 2112,
    "method": "GET",
    "request": "https://b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com:443/out/v1/ea69xxxxxxxxxxxxxxxxxxxxxxxxxxxx/c7b6xxxxxxxxxxxxxxxxxxxxxxxxxxxx/13ccxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.mpd",
    "protocol": "HTTP/2.0",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
    "account": "123456789012",
    "domainName": "b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com",
    "requestId": "Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxec020",
    "packagingConfigArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-configurations/mediapackage-vod-packaging-access-logging-dash-config",
    "packagingGroupArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-groups/mediapackage-vod-packaging-access-logging",
    "assetArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2"
}

MediaPackageユーザガイドのAccess logging - Read the access logs に例示されているサンプルをもとに、CloudWatch Logs Insightsでの確認もしてみましょう。Assetごと(といっても1つだけですが)、statusCodeでカウントしてみました。

fields @timestamp, @message
| filter assetArn like 'arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2'
| stats count() by statusCode

まとめ

AWS Elemental MediaPackageのVODパッケージングでアクセスログを設定してみました。ライブパッケージングでのアクセスログサポートのアップデートから、わずか約4ヶ月でのVODパッケージングでのサポートです、大変嬉しいですね。VODパッケージングではライブパッケージングとリソース構成などが異なることから(そもそもAPIなども異なりますね)、ログフィールドの中身もライブパッケージングと異なる項目があります。内容を確認する際には注意しましょう。