CloudFront + 署名付きURL でFlashのcrossdomain.xml に対応する方法(マルチオリジン編)
Why?
CloudFrontを通してHLS動画配信などを行う場合、JWPlayerなどFlashを使うのが一般的です。(PCの場合)
ただし、Flashでは設置するページと、読み込みソースのドメインが異なる場合、/crossdomain.xml
が要求されます。
もし、例えば一部の課金ユーザにのみストリーミングを許可したい場合、CloudFrontの署名付きURL機能を使いますが、そのままでは/crossdomain.xml
にも署名が要求され、Flashのセキュリティエラーが発生します。
Flashで別ドメインから署名付きURLでCloudFrontにアクセスするときの問題 | Developers.IO
そこで、以前 CloudFront + 署名付きURL でFlashのcrossdomain.xml制限を回避した話 - フリーエンジニアライフで、カスタムエラーページで403をハンドリングすることで、無理矢理crossdomain.xmlに対応、署名付きURLでのFlashストリーミングに対応したと書きました。
しかし、最近この動作が修正されたのか?動作しなくなっていたので別の方法を調べた結果、マルチオリジンを使用することであっさり対応できることに気がついたのでメモ。
Amazon Web Services ブログ: 【AWS発表】Amazon CloudFrontが動的コンテンツをサポート
2012年5月ですから、かなり以前から使えましたね…
crossdomain.xml以外でも、1つのCloudFrontディストリビューションで、署名の有る無しを使い分けたい場合に役立つテクニックになりそうです。
前提
としてすでに署名付きURLでCloudFrontを利用する設定ができているものとします。
手順
S3などに
crossdomain.xml
を配置CloudFrontディストリビューションの設定で、Originsタブを開き、Create Originで1で用意した配信元を追加
Behaviorsタブを開き、Create BehaviorからPath Pattern「crossdomain.xml」の場合、2で作成したOriginを署名無しで使用するように設定
Field | Value |
---|---|
Path Pattern | crossdomain.xml |
Origin | 2で作成したOrigin |
Restrict Viewer Access (Use Signed URLs) | No |
トラブルシューティング
307 Temporary Redirect
S3バケットを作って間もないと307を返すようです。しばらく待つ。CloudFrontでキャッシュされるっぽいので、Invalidationsしてみます。