1
CloudFrontで実現する
セキュアコンテンツ配信と
効果のトラッキング
2014.03.15
アマゾン  データ  サービス  ジャパン株式会社
ソリューション  アーキテクト
北北迫  清訓
今井  雄太
JAWS DAYS 2014
22
JAWS DAYS 2014
⾃自⼰己紹介
!   名前
北北迫  清訓  (きたさこ  きよのり)
!   所属
  アマゾンデータサービスジャパン
      ソリューションアーキテクト
!   好きなAWSサービス
Amazon Elastic Transcoder
33
JAWS DAYS 2014
Amazon  CloudFront
!  Contents  Delivery  Network
44
JAWS DAYS 2014
現時点のエッジロケーション
Europe	
  
Amsterdam,	
  Netherlands(2)	
  
Dublin,	
  Ireland	
  
Frankfurt,	
  Germany	
  	
  (3)	
  
London,	
  England	
  (3)	
  
Madrid,	
  Spain	
  
Marseille,	
  France	
  
Milan,	
  Italia	
  
Paris,	
  France	
  (2)	
  
Stockholm,	
  Sweden	
  
Warsaw,	
  Poland	
  	
  	
  
Asia	
  
Chennai,	
  India	
  
Hong	
  Kong,	
  China(2)	
  
Mumbai,	
  India	
  
Manila,	
  Philippines	
  
Osaka,	
  Japan	
  
Seoul,	
  Korea	
  
Singapore	
  (2)	
  
Sydney,	
  Australia	
  
Taipei,	
  Taiwan	
  
Tokyo,	
  Japan(2)	
  
South	
  America	
  
Sao	
  Paulo,	
  Brazil	
  
Rio	
  de	
  Janeiro,	
  Brazil	
  
North	
  America	
  
Atlanta,	
  GA	
  
Ashburn,	
  VA	
  (3)	
  
Dallas,	
  TX	
  (2)	
  
Hayward,	
  CA	
  
Jacksonville,	
  FL	
  
Los	
  Angeles,	
  CA(2)	
  
Miami,	
  FL	
  
New	
  York,	
  NY	
  (3)	
  
Newark,	
  NJ	
  
Palo	
  Alto,	
  CA	
  	
  
San	
  Jose,	
  CA	
  
Seattle,	
  WA	
  	
  
South	
  Bend,	
  IN	
  
St.	
  Louis,	
  MO	
  
	
  
2014年年03⽉月時点
51	
  Edge	
  Locations	
  
55
JAWS DAYS 2014
セキュアコンテンツ配信
66
JAWS DAYS 2014
CloudFrontのセキュア機能
!    HTTPSサポート
!    Geo  Restriction
!    Signed  URL
77
JAWS DAYS 2014
CloudFront  Signed  URL
! CloudFront経由で配信するコンテンツ
に対して期間指定URLを⽣生成する
ことで、配信コンテンツを保護する
既定ポリシ(Canned Policy)
•  有効化終了了時刻
•  許可コンテンツフルパス
カスタムポリシ(Custom Policy)
•  有効化開始時刻
•  アクセス元IPアドレス制限
•  ワイルドカード許可コンテンツパス
88
JAWS DAYS 2014
CloudFront  Signed  URL
既定ポリシ(Canned Policy)
http(s)://{CloudFront Distiburion CNAME}/{コンテンツパス}
?Expires={有効化終了了時刻(Unix Time)}
&Signature={署名したポリシー}
&Key−Pair-Id={CloudFront Key Pair ID}
カスタムポリシ(Custom Policy)
http(s)://{CloudFront Distiburion CNAME}/{コンテンツパス}
?Policy={JSONフォーマットのポリシー}
&Signature={署名したポリシー}
&Key−Pair-Id={CloudFront Key Pair ID}
基本は⾃自分でURLを⽣生成
99
JAWS DAYS 2014
CloudFront  Signed  URL
クライアント
Amazon
CloudFront
オリジンサーバ
署名確認
ダイレクトアクセス
SignedURL有効
Distribution
OAI
接続元IPアドレス制限
Origin Access Identity
オリジンへのダイレクトアクセス
1010
JAWS DAYS 2014
Geo  Restriction
CloudFront  Signed  URL
ユーザ認証
アクセス要求
署名付きURL配布
署名確認
署名付きURLで
アクセス
クライアント
認証サーバ
Amazon
CloudFront
オリジンサーバ
署名URL⽣生成
CloudFront
プライベートキー
SignedURL有効
Distribution
OAI
HTTPS通信
1111
JAWS DAYS 2014
セキュアな動画配信
1212
JAWS DAYS 2014
動画配信
マルチデバイスへの効率率率的な動画配信
HTTPストリーミング
HTTP Live Streaming
(HLS)
HTTP Dynamic Streaming
(HDS)
IIS Smooth Streaming
1313
JAWS DAYS 2014
動画配信
Android  3.2以前
Android  4.0以降降
+ + +
救世主?
1414
JAWS DAYS 2014
動画配信
(参考)2013年年 Google Developers
http://developer.android.com/about/dashboards/index.html
79.7%
本⽇日は
カジュアルに
HTTP Live Streaming
(HLS)
+
1515
JAWS DAYS 2014
HLSによるオンデマンド配信
クライアント
Webサーバ
マニフェストファイル(.m3u8)
  セグメントファイル01(.ts)
  セグメントファイル02(.ts)
  セグメントファイル03(.ts)
  セグメントファイル04(.ts)
  セグメントファイル05(.ts)
:
セグメンターで分割
元動画
HTTP/HTTPS
AES Encryption
マニフェストファイルを取得し、記載順に
セグメントファイルを取得し再⽣生
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:12
#EXTINF:11.333333,
segment_hls_1m00000.ts
#EXTINF:11.250000,
segment_hls_1m00001.ts
#EXTINF:7.500000,
segment_hls_1m00002.ts
:
#EXT-X-ENDLIST
マニフェストファイル(m3u8)
GET
1616
JAWS DAYS 2014
HLSセキュアオンデマンド配信
マニフェスト
ファイル要求
認証サーバ
署名URL⽣生成
マニフェスト
ファイル取得
マニフェスト
ファイル書換
Amazon
CloudFront Amazon S3
SignedURL有効
Distribution
署名付き
マニフェストファイル
OAI
署名付きURLで
セグメントファイル取得
署名確認
1717
JAWS DAYS 2014
HLSセキュアオンデマンド配信
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:12
#EXTINF:11.333333,
segment_hls_1m00000.ts
#EXTINF:11.250000,
segment_hls_1m00001.ts
#EXTINF:7.500000,
segment_hls_1m00002.ts
:
#EXT-X-ENDLIST
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:12
#EXTINF:11.333333,
https://xxx.cloudfront.net/hls/segment_hls_1m00000.ts?
Signature=Yana7RByw30iPHZQzFKIyqoAsLHMPPeZ~w-7RPuHeVTY06VDg
nW7MbNjQSbGkHn9kWPdlFAWCX7g1q9Mk5kORLXMcJwCOCm165~P6ss9
Bj8rMmYNoIj96u7Nm3xzwbFHfCf5WyafA6aX1PoQ2Vgod98TZVhHGuTdA-
IuiMz6Ly8_&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9
kMWJ3amwwb3JteW9veC5jbG91ZGZyb250Lm5ldC9obHMvKiIsIkNvbmRpd
GlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTM5NDI0Nj
MwM319fV19&Key-Pair-Id=APKAIZ4RI4PUMO3SNKLQ
#EXTINF:11.250000,
https://xxx.cloudfront.net/hls/segment_hls_1m00001.ts?
Signature=Yana7RByw30iPHZQzFKIyqoAsLHMPPeZ~w-7RPuHeVTY06VDg
nW7MbNjQSbGkHn9kWPdlFAWCX7g1q9Mk5kORLXMcJwCOCm165~P6ss9
Bj8rMmYNoIj96u7Nm3xzwbFHfCf5WyafA6aX1PoQ2Vgod98TZVhHGuTdA-
IuiMz6Ly8_&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9
kMWJ3amwwb3JteW9veC5jbG91ZGZyb250Lm5ldC9obHMvKiIsIkNvbmRpd
GlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTM5NDI0Nj
MwM319fV19&Key-Pair-Id=APKAIZ4RI4PUMO3SNKLQ
#EXTINF:7.500000,
:
#EXT-X-ENDLIST
SignedURL Custom Policy
ワイルドカードで許可コンテ
ンツパスを⽣生成し、同じ署名
をすべてのセグメントファイ
ルで利利⽤用
https://xxx.cloudfront.net/hls/*
オリジナル
マニフェストファイル 署名付き
マニフェストファイル
1818
JAWS DAYS 2014
HLSセキュアオンデマンド配信
!  保護しながらもキャッシュを活かした効率率率
的なコンテンツ配信
1.  マニフェストファイル内で
#EXT-X-ALLOW-CACHE:NO
2.  S3上のセグメントファイルのMetadataに
Cache-Control: max-age=0, s-maxage=⻑⾧長め
1.  セグメントファイル
をキャッシュせず
毎回リクエスト
2.  s-maxage期間
CloudFrontがセグメ
ントをキャッシュ
セグメントファイル
キャッシュ
コンテンツ保護 負荷軽減
1919
JAWS DAYS 2014
HLSライブ配信
クライアント
ストリーミングサーバ/Webサーバ
HTTP/HTTPS
GET
LIVE	
  
LiveEncoder	
  
マニフェストファイルの末尾に
#EXT-X-ENDLISTがなければ再要求
クライアント側挙動
マニフェストファイル(.m3u8)
  セグメントファイル01(.ts)
  セグメントファイル02(.ts)
   :  
マニフェストファイルは定期的に更更新
セグメントファイルは都度度追加
サーバ側挙動
リアルタイム
⽣生成
2020
JAWS DAYS 2014
HLSセキュアライブ配信
!  セキュアライブ配信のポイント
–  ライブの場合、マニフェストファイルの書き換えタ
イミングが難しい
–  マニフェストファイルは相対パスでセグメントファ
イルを記載しているのでCloudFrontのDistribution
は同⼀一パスの必要がある
CloudFrontのBehaviorを利利⽤用して、
マニフェストファイルだけ署名付きURLに設定
2121
JAWS DAYS 2014
セキュアライブ配信
マニフェストファイル(*.m3u8)のBehaviorを登録し、
「Restrict Viewer Access(Use Signed URLs」を有効
マニフェストファイルへのアクセスだけ署名付きURLが必要
となり、保護することが可能
HLSセキュアライブ配信
マニフェスト
ファイルURL要求
認証サーバ
Amazon
CloudFront
SignedURL有効
Distribution
署名付き
マニフェストファイルURL
セグメントファイル
取得
配信サーバ
LIVE	
  
LiveEncoder	
  
署名付きURLで
マニフェストファイル取得 署名確認
2323
JAWS DAYS 2014
中まとめ
! CloudFrontで⼩小規模から⼤大規模まであら
ゆる配信ニーズに答えられるだけでなく、
プレミアムコンテンツなどのアクセス制限
が必要なセキュアな動画配信も実現するこ
とが可能
!  Elastic  TranscoderはHLS変換をサポート
しています。
2424
JAWS DAYS 2014
効果のトラッキング
2525
JAWS DAYS 2014
⾃自⼰己紹介
!   名前
今井  雄太(いまい  ゆうた)
!   所属
  アマゾンデータサービスジャパン
      ソリューションアーキテクト
!   好きなAWSサービス
Amazon Simple Storage Service
2626
JAWS DAYS 2014
アジェンダ
!   アクセス可視化とは
!   ツールやエコシステム
!   ⾃自前で作るなら
2727
JAWS DAYS 2014
アクセス可視化とは
2828
JAWS DAYS 2014
なんのために⾏行行う?
!  売上予測
!  コスト予測
!  キャパシティプランニング
!  異異常検知
2929
JAWS DAYS 2014
気をつけるべきこと
!  APIやHTMLへのアクセス解析との棲み分
け
– 両⽅方同じことをしても意味がない
LogLog
Log
LogLog
Log
3030
JAWS DAYS 2014
CloudFrontで
アクセス可視化して嬉しいものは
!  地域(エッジロケーション)別アクセス
– コスト把握
– ユーザーの地理理的分布はAPI側のログでも
取れる
!  キャッシュヒット率率率
– オリジンのキャパシティプランニング
!  トラフィックスループット
– コスト把握
3131
JAWS DAYS 2014
ツールやエコシステム
3232
JAWS DAYS 2014
Just  Released!
!  おまたせしました!CloudFrontにもや
っとレポート機能が出ました!
!   現状取れるのは
•  HTTP/HTTPSそれぞれのアクセス数
•  HTTP/HTTPSそれぞれの転送量量
•  オリジンへの転送量量
3333
JAWS DAYS 2014
Sumo  Logic
! SaaSっぽいタイプ
!  S3上のログを解析してくれる
!  ログの量量は500MB/⽇日まで無料料
!  グラフを⾃自由に作り込める
3434
JAWS DAYS 2014
Splunk
!  ホストベースのタイプ
!  ログをSplunkにロードして利利⽤用
!  Market  PlaceにAMIがある
!  ログ可視化ツールなのでアクセス解析
に限らない
http://blogs.splunk.com/2012/08/14/splunking-app-net/
3535
JAWS DAYS 2014
Cedexis
!   サービス型
!   ログはビーコンで収集するので
リアルタイム性が⾼高い(と思う)
!   アクセス数にかかわらず無料料でレポート利利⽤用
が可能
3636
JAWS DAYS 2014
Google  Analytics
!   ⾔言わずと知れたSaaSタイプの解析サービス
!   アクセス解析にʼ’超ʼ’特化されている
!   1000万アクセス/⽉月まで無料料
http://www.google.co.jp/analytics/
3737
JAWS DAYS 2014
⾃自前でやるなら
3838
JAWS DAYS 2014
まずはCloudFrontのログについて
!  ディストリビューションごとに出⼒力力先のS
3を設定
!  ⾃自動的に指定のS3バケットに出⼒力力される
!  出揃うのにだいたい3〜~4時間
!  ⼩小さな多数のファイルとして出⼒力力される
–  HadoopやRedshiftで取り扱いにくい
3939
JAWS DAYS 2014
まずはCloudFrontのログについ
て(続き)
!  命名規則
– Prefix指定でListObjectすることで絞込
がしやすい!
– s3DistCpで正規表現でも絞りやすい!
${DISTRIBUTION_̲NAME}-‐‑‒${YYYY}-‐‑‒${MM}-‐‑‒${DD}-‐‑‒${HH}.*
4040
JAWS DAYS 2014
スポット解析
!  EMRにS3DistCpで必要なデータだけ読
み込んで好きなようにクエリする
SELECT
COUNT(*)
FROM….
S3DistCp
4141
JAWS DAYS 2014
スポット解析
!  ⼤大まかな⼿手順
– スクリプトでEMR起動
•  hiveインストール
•  S3DistCPで指定された範囲のログをS3から
hdfs:///dataにconcatして読み込み
•  hdfs:///dataをLocationに指定してExternal  
Tableを作成
– Hiveで解析
– 終わったらクラスタを破棄する
4242
JAWS DAYS 2014
スポット解析
!  起動スクリプト
#EMRクラスタの起動
FLOW=`̀elastic-‐‑‒mapreduce  -‐‑‒-‐‑‒create  -‐‑‒-‐‑‒alive  -‐‑‒-‐‑‒hive-‐‑‒interactive  -‐‑‒-‐‑‒key-‐‑‒pair  $
{KEYPAIR}  -‐‑‒-‐‑‒name  emr-‐‑‒cluster-‐‑‒${TARGET}  -‐‑‒-‐‑‒master-‐‑‒instance-‐‑‒type  $
{MASTER_̲INSTANCE_̲TYPE}  -‐‑‒-‐‑‒slave-‐‑‒instance-‐‑‒type  $
{SLAVE_̲INSTANCE_̲TYPE}  -‐‑‒-‐‑‒num-‐‑‒instances  ${NUM_̲INSTANCES}  -‐‑‒-‐‑‒log-‐‑‒uri  
${LOG_̲URI}  |  awk  '{print  $4}'`̀
#S3DistCpステップの追加
elastic-‐‑‒mapreduce  -‐‑‒-‐‑‒jobflow  $FLOW  -‐‑‒-‐‑‒jar  
/home/hadoop/lib/emr-‐‑‒s3distcp-‐‑‒1.0.jar  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒s3Endpoint  -‐‑‒-‐‑‒arg  "$S3ENDPOINT"  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒src  -‐‑‒-‐‑‒arg  "$CFLOG"  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒dest  -‐‑‒-‐‑‒arg  'hdfs:///data'  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒groupBy  -‐‑‒-‐‑‒arg  '.*([0-‐‑‒9]{4}-‐‑‒[0-‐‑‒9]{2}-‐‑‒[0-‐‑‒9]{2}-‐‑‒[0-‐‑‒9]{2}).*'  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒targetSize  -‐‑‒-‐‑‒arg  '128'  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒srcPattern  -‐‑‒-‐‑‒arg  ".*${TARGET}.*"  
-‐‑‒-‐‑‒arg  -‐‑‒-‐‑‒outputCodec  -‐‑‒-‐‑‒arg  'lzo'  
-‐‑‒-‐‑‒step-‐‑‒name  s3distcp
${TARGET}でS3上の対象ファ
イルを絞込み
ざっくり⾔言うと
•  対象ファイル絞り込んで
•  ⼩小さいファイルを128MBご
とにまとめて
•  LZOにして
•  hdfs:///dataに読み込む
4343
JAWS DAYS 2014
スポット解析
!  起動スクリプトのつづき
!  呼び出されるHiveスクリプト
#Hiveテーブルに読み込み
elastic-‐‑‒mapreduce  -‐‑‒-‐‑‒jobflow  $FLOW  
-‐‑‒-‐‑‒hive-‐‑‒script  $HIVESCRIPT  
-‐‑‒-‐‑‒step-‐‑‒name  table_̲construction
CREATE EXTERNAL TABLE cflog (
dt STRING, tm STRING, edge STRING,
bytes STRING, ip STRING, method STRING,
host STRING, uri STRING, status STRING,
referer STRING, ua STRING, querySTRING STRING,
cookie STRING, resultType STRING, requestId STRING,
hostHeader STRING, protocol STRING, csBytes STRING )
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
LOCATION '/data';
Hiveスクリプトを呼び出して
テーブルを作成するステップ
4444
JAWS DAYS 2014
ダッシュボード(定常的レポート)
!  DynamoDB  +  Javascript  SDK
S3DistCp AWS SDK
LINQ.JS
D3.js
指定したインターバルごとに起動
EC2やRDSなどのインスタンスものを1箇所も使わずに済む
↓
運⽤用の⼿手間なし!
4545
JAWS DAYS 2014
ダッシュボード(定常的レポ
ート)
!  DynamoDBからデータをSCANして、
ブラウザ側でD3.js等を使ってダッシュ
ボードを⽣生成
4646
JAWS DAYS 2014
ダッシュボード
!  サーバーサイドの⼤大まかな⼿手順
– S3からHDFSにデータ読み込み
– hiveで⼀一次集計
– 同じくhiveでDynamoDBに出⼒力力
– 定期的に繰り返す
4747
JAWS DAYS 2014
ダッシュボード(定常的レポート)
!  ⼀一次集計
4848
JAWS DAYS 2014
ダッシュボード(定常的レポート)
! DyamoDBのテーブル
4949
JAWS DAYS 2014
ダッシュボード(定常的レポ
ート)
!  hive  <-‐‑‒>  DynamoDB
CREATE  EXTERNAL  TABLE  dynamodb  (
        recordid  STRING,
        ts  STRING,
        uri  STRING,
        edge  STRING,
        count  STRING
)
STORED  BY  
'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES  (
    "dynamodb.table.name"  =  "cloudfront-‐‑‒digger",
    "dynamodb.region"  =  "ap-‐‑‒northeast-‐‑‒1",
    "dynamodb.throughput.write.percent"  =  "1.0",
    "dynamodb.throughput.read.percent"  =  "1.0",
    "dynamodb.column.mapping"  =  
"recordid:Record_̲ID,ts:Timestamp,uri:URI,edge:Edge,count:Count"
);
5050
JAWS DAYS 2014
ダッシュボード(定常的レポート)
!  DynamoDBへのインサート!
INSERT  OVERWRITE  TABLE  dynamodb
SELECT
    concat(ts,'-‐‑‒',uri,'-‐‑‒',edge),
    ts,
    uri,
    edge,
    count(1)
FROM
    source
WHERE  ts  !=  'NULL'
GROUP  BY
    ts,
    uri,
    edge
;
5151
JAWS DAYS 2014
ダッシュボード(定常的レポート)
1.  STSを使ってセキュリティトークンを払い出し
2.  DynamoDBから1週間分のデータをSCANで取得
3.  LINQ.jsでGroupByやらPivotやらCountやら
4.  D3.jsを使ってグラフ化!
!  クライアントサイドの⼤大まかな構成
5252
JAWS DAYS 2014
ダッシュボード(定常的レポ
ート)
!   ちなみに・・・
–  1⽇日1,000万リクエストくらいならEMRはm1.small⼀一台
で⼗十分だった
–  毎時1回起動して過去3時間分のデータを処理理した際の
所要時間
–  今回は間に合わなかったが、スポット使えばもっとお得
5353
JAWS DAYS 2014
BIツールで解析する
!  Redshift  +  BIツール
COPY
⼀一次集計
5454
JAWS DAYS 2014
BIツールで解析する
!  テーブルの定義
!  S3からのデータロード
CREATE  TABLE  cflog  (
        recordid  VARCHAR,
        ts  CHAR,
        uri  VARCHAR,
        edge  CHAR,
        count  INTEGER
)
SORTKEY(ts);
COPY  cflog  
FROM
      's3://BUCKET_̲NAME/PREFIXʼ’  CREDENTIALS  
'aws_̲access_̲key_̲id=AAAAA;aws_̲secret_̲access_̲key=BBBBʼ’
DELIMITER  't'  
MAXERROR  200;
5555
JAWS DAYS 2014
まとめ
!  BIしたいか、ダッシュボードがほし
いか、スポット解析かでやりかたはい
ろいろある
!  便便利利なサービスもいろいろある
!  要件にあった選択を
! CloudFrontのレポーティングへの機能
要望もお待ちしてます!
56
JAWS DAYS 2014

CloudFrontで実現するセキュアコンテンツ配信と効果のトラッキング