2012年2月6日月曜日

S3ってなんじゃ?(CloudFrontでストリーミングログを取得)

CloudFrontでストリーミングをするときに、デフォルトで試聴ログが取れるので、試してみました。


ストリーミングの設定

まずストリーミング用とログ用のにバケットを2つ用意します。
  • stream.memorycraft.jp:CDNストリーミングとプレイヤーのWEBホスト用のバケット
  • log.stream.memorycraft.jp:ストリームログ用のバケット



CDN用のバケットではプレイヤーのページをWEBホスティングするので、「Website」の設定をしておきます。




次にストリーミング用のバケットにプレイヤーとムービーなどをアップします。
今回は以下のWEBプレイヤーを使用しました。

JWPlayer
http://www.longtailvideo.com/players/jw-flv-player/

このフリープレイヤーにはムービーのサンプルとプレイヤーを埋め込むためのHTMLのテンプレートが付属しているので、以下のように変更してCDN用のバケットにアップします。
また今回はユーザーを特定するために、rtmpアクセスにuser_idのクエリをつけて見ました。
変更部分は赤字で示しています。

<!--     THIS IS A BASIC HTML FILE TO PLAY FLV's USING JW PLAYER
The following code is from longtailvideo.com's 'Setup Wizard', found at http://www.longtailvideo.com/support/jw-player-setup-wizard
-->
<HTML>
<HEAD>
<TITLE> 
Streaming Video with JW Player
</TITLE> 
</HEAD>
<BODY>
<!-- Put a header above your video, if you like
-->
<H1>This is my header</H1>
<!--This is where you call on the required JavaScript file. You uploaded this in step 2a; you can recognize it by the .js suffix
-->
<script type='text/javascript' src='http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/swfobject.js'></script> 
<div id='mediaspace'>This text will be replaced</div>
<!--Where it says YOUR_BUCKET/player.swf is where you specify the player that you uploaded in step 2b
-->
<script type='text/javascript'>
var so = new SWFObject('http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf','mpl','470','290','9');
   so.addParam('allowfullscreen','true');
   so.addParam('allowscriptaccess','always');
   so.addParam('wmode','opaque');
<!--This next line is where you specify your video file (uploaded in step 2c). For .flv files, you must write it as below ('YOUR_VIDEO_FILE'),  *without*  the .flv extension.
-->
   so.addVariable('file','mp4:mymovie');
<!--This next line is where you point to your streaming distribution on cloudfront (done in step 3 above). NOTE: you *MUST* add "/cfx/st/" for it to work. This specifies it is a cloudfront object (cfx) and that it is to be streamed (st). This is the URL of the streaming distribution--it ends with .cloudfront.net. In the example above, I would write: 'rtmp:// s1jng015tymskd.cloudfront.net/cfx/st/'
--> 
so.addVariable('streamer','rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/?user_id=5678');
   so.write('mediaspace');
</script>
</BODY>
</HTML>
<!--Common problems:
- You cannot have any spaces in any of your URL's (including your 'rtmp://...'  URL)    (i.e.,  http:// thereisaspaceatthebeginninghere.xxx)
- Be sure you are calling the correctly numbered version of the flowplayer objects/players (i.e. flowplayer-3.2.2.swf
- You cannot have duplicates of 's3.amazonaws.com' or 'cloudfront.net' in the same address (i.e. (http://s3.amazonaws.com/s3.amazonaws.com/YOUR_BUCKET/player.swf)
- There is a different naming protocol for mp4 vs flv files. For .mp4 files, YOU MUST write it as 'mp4:YOUR_VIDEO_FILE_WITHOUT_THE _MP4_SUFFIX'. For .flv files, you simply write the name of the file, 'YOUR_VIDEO_FILE_WITHOUT_THE_FLV_SUFFIX'.
-->

バケットにアップされるファイルはこのようになります。



次にCDNの設定をします。CloudFrontタブで「Create Distribution」を選択し、最初のDISTRIBUTION TYPEのフェーズで「Delivery Method」にStreamingを選択します。またBucketには先程ムービー一式をアップしたCDN用のバケットを指定します。



次のDISTRIBUTION DETAILSフェーズでは「Logging」の項目をOnに設定して、「Select Log Bucket」から先ほどのログ用のバケットを指定します。また、ここでは「Log Prefix」にstreamと入力して作成を終了します。



それでは、S3ホスティングされたプレイヤーのページを表示してみます。


おお、表示されました!



ログの確認

しばらく(数時間)すると、ログ用のバケットにストリーミングのログが吐き出され始めます。



これらの一つをダウンロードして開いてみると以下のようになっています。いわゆるFMSのログです。


#Version: 1.0
#Fields: date time x-edge-location c-ip x-event sc-bytes x-cf-status x-cf-client-id cs-uri-stem cs-uri-query c-referrer x-page-url c-user-agent x-sname x-sname-query x-file-ext x-sid
2012-02-02 18:12:00 SFO4 219.117.233.241 connect 3073 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 - - - -
2012-02-02 18:12:00 SFO4 219.117.233.241 play 3476 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 mymovie - mp4 1
2012-02-02 18:12:01 SFO4 219.117.233.241 stop 205127 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 mymovie - mp4 1
2012-02-02 18:12:04 SFO4 219.117.233.241 pause 205295 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 mymovie - mp4 -
2012-02-02 18:12:18 SFO4 219.117.233.241 unpause 205295 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 mymovie - mp4 -
2012-02-02 18:12:21 SFO4 219.117.233.241 disconnect 205295 OK 66f18822-d17a-4e1d-9319-e279ffe82caa rtmp://s23sut0ft0hkv9.cloudfront.net/cfx/st/ user_id=5678 http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.swf http://s3-ap-northeast-1.amazonaws.com/stream.memorycraft.jp/player.html MAC%2011,2,202,183 - - - -


これらの項目は以下のようになっています。

date日付
time時刻
x-edge-locationCDNのエッジロケーションを空港名のような3文字コード+数字で示しています。
c-ipクライアントのIP
x-eventストリームのイベントです。
Connect, Disconnect, Play, Stop, Pause, Unpause, Seekがあります。
sc-bytesサーバーから送られたバイト数
x-cf-statusイベントのステータス
x-cf-client-id
コネクションに対して一意のクライアントID
cs-uri-stemストリームURIのベース部分
cs-uri-queryストリームURIのクエリ部分
c-referrerストリーミングアクセスのリファラ
x-page-urlストリーミングアクセス元のWEBページのURL
c-user-agentユーザーエージェント
x-snameストリーミングされるファイル名
x-sname-queryストリーミングアクセスのクエリ
x-file-extストリーミングされるファイルの拡張子
x-sidコネクション内で一意なストリームID

ここで、x-eventでストリームの状態(Play, Stop, Pause, Unpauseなど)と、x-sname-queryでユーザーの特定やその他のデータを送信できることで、工夫すれば試聴解析ができそうです。

とりあえず今回は以上です。