CloudFront の署名付き Cookie によるプライベートコンテンツ配信でワイルドカードを使用する
ワイルドカードを使用したプライベートコンテンツ配信
先日下記のブログにて、CloudFront の署名付き Cookie という機能を使ってプライベートコンテンツを配信する方法をご紹介しました。
この例では1つの URL に対してのポリシーのみ設定していますが、ワイルドカードを指定した複数のコンテンツを対象にすることができます。ということで、今回はワイルドカードを使用したプライベートコンテンツの配信を試してみたいと思います。
既定ポリシーとカスタムポリシーの違い
そもそも、CloudFront の署名付き Cookie を使用したプライベートコンテンツ配信には、2種類のポリシーが指定できます。既定ポリシーとカスタムポリシーです。次の表に示す違いがあります。
説明 | 既定ポリシー | カスタムポリシー |
---|---|---|
ポリシーを複数のオブジェクトへの使用 | ☓ | ◯ |
アクセスできるようになる日時の指定 | ☓ | ◯ (省略可能) |
アクセスできなくなる日時の指定 | ◯ | ◯ |
IPアドレス指定 | ☓ | ◯ (省略可能) |
署名付き Cookie の使用 - Amazon CloudFront
前回のブログは既定ポリシーを使用したため、ポリシーを複数のオブジェクトには指定できなかったということです。カスタムポリシーを使うと、複数オブジェクトへの使用、アクセス可能日時の指定、IPアドレス指定といったより複雑なポリシーが定義です。
カスタムポリシーを作成する
ということで、カスタムポリシーを作成してみましょう。今回は sample
バケットを作成し、sample/*.html
とすることで対象のバケット配下の HTML ファイルのみにアクセス可能なポリシーを作成します。
policy.json
{ "Statement":[ { "Resource":"http://xxxxxxxxxxxxx.cloudfront.net/sample/*.html", "Condition":{ "DateLessThan":{ "AWS:EpochTime":1435676400 } } } ] }
ここから空白行を削除します。
{"Statement":[{"Resource":"http://xxxxxxxxxxxxx.cloudfront.net/sample/*.html","Condition":{"DateLessThan":{"AWS:EpochTime":1435676400}}}]}
これでポリシーが完成です。次に Base64 エンコードした文字列と署名された Base64 エンコードした文字列を作成します。2つ作成するところがポイントです。
まず Base64 エンコード。
$ cat policy.json | openssl base64 | tr '+=/' '-_~' eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2RidXdicnljMmVkcmcu Y2xvdWRmcm9udC5uZXQvc2FtcGxlLyouaHRtbCIsIkNvbmRpdGlvbiI6eyJEYXRl TGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQzNTY3Njxxxxxxxxxx
次に署名された Base64 エンコード。キーペアの作成方法はこちらを参考にしてください。
$ cat policy.json | openssl sha1 -sign pk.pem | openssl base64 | tr '+=/' '-_~' S-GjE1yQZOiR0N7NeAhluifvPJfuWw8yUSGDoBemEGDraQJpUyjA3xthK2gGKzLn QlPbgG1NLytt5ge5IThXWa-1rfeyflwpD3OAAH5GL4JCraDZyWqAGmoV30ExQkFL el-BogSuq0ckhVukTnZ~2vZV5X7hmoxwaplmP0BO-EvpE65-Y7yAsD6FJT7Aj8ty qtpmuXBNGDst3dhCJAsls-MkIlOZKAKLdviTwQ5AYwVFW2fEU~q0Xx5FygV83Gg~ B4DLlRncZfNOnnIA8M3MAQyc1lVLTatksU-9i3-OIx5DUa-uo3nwJsfQALIVnpUy znLaCi3T6R4u4Txxxxxxxxxx
これらの文字列をメモしておいてください。
Cookie をセットしてアクセスしてみる
あとは Cookie をセットして対象のURLにアクセスします。Cookie は3つの値をセットします。既定ポリシーとヘッダーが異なるので、注意してください。
CloudFront-Policy
: 先ほど作成した、Base64 エンコードしたポリシーCloudFront-Signature
: 先ほど作成した、署名された Base64 エンコードしたポリシーCloudFront-Key-Pair-Id
: 作成した CloudFront キーペアのID
Cookie を設定するフォーマットは次の通りです。このうち Domain
と Path
はオプションです。
Set-Cookie: Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly; CloudFront-Policy=base64 encoded version of the policy statement Set-Cookie: Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly; CloudFront-Signature=hashed and signed version of the policy statement Set-Cookie: Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly; CloudFront-Key-Pair-Id=active CloudFront key pair Id for the key pair that you are using to generate the signature
これに当てはめてみると…
Set-Cookie: Secure; HttpOnly; CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2RidXdicnljMmVkcmcu Y2xvdWRmcm9udC5uZXQvc2FtcGxlLyouaHRtbCIsIkNvbmRpdGlvbiI6eyJEYXRl TGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQzNTY3Njxxxxxxxxxx Set-Cookie: Secure; HttpOnly; CloudFront-Signature=S-GjE1yQZOiR0N7NeAhluifvPJfuWw8yUSGDoBemEGDraQJpUyjA3xthK2gGKzLn QlPbgG1NLytt5ge5IThXWa-1rfeyflwpD3OAAH5GL4JCraDZyWqAGmoV30ExQkFL el-BogSuq0ckhVukTnZ~2vZV5X7hmoxwaplmP0BO-EvpE65-Y7yAsD6FJT7Aj8ty qtpmuXBNGDst3dhCJAsls-MkIlOZKAKLdviTwQ5AYwVFW2fEU~q0Xx5FygV83Gg~ B4DLlRncZfNOnnIA8M3MAQyc1lVLTatksU-9i3-OIx5DUa-uo3nwJsfQALIVnpUy znLaCi3T6R4u4Txxxxxxxxxx Set-Cookie: Secure; HttpOnly; CloudFront-Key-Pair-Id=XXXXXXXXXXXXXXXXXXX
こんな感じになります。ビューア(クライアント)からは、これらを ;
区切りで1つの値として Cookie
としてリクエストヘッダーにセットします。
コマンドから呼び出してみましょう。
curl http://xxxxxxxxxxxxx.cloudfront.net/sample/sample.html -H 'Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2RidXdicnljMmVkcmcuY2xvdWRmcm9udC5uZXQvc2FtcGxlLyouaHRtbCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQzNTY3Njxxxxxxxxxx; CloudFront-Signature=S-GjE1yQZOiR0N7NeAhluifvPJfuWw8yUSGDoBemEGDraQJpUyjA3xthK2gGKzLnQlPbgG1NLytt5ge5IThXWa-1rfeyflwpD3OAAH5GL4JCraDZyWqAGmoV30ExQkFLel-BogSuq0ckhVukTnZ~2vZV5X7hmoxwaplmP0BO-EvpE65-Y7yAsD6FJT7Aj8tyqtpmuXBNGDst3dhCJAsls-MkIlOZKAKLdviTwQ5AYwVFW2fEU~q0Xx5FygV83Gg~B4DLlRncZfNOnnIA8M3MAQyc1lVLTatksU-9i3-OIx5DUa-uo3nwJsfQALIVnpUyznLaCi3T6R4u4Txxxxxxxxxx; CloudFront-Key-Pair-Id=XXXXXXXXXXXXXXXXXXX'
OKです!
<br /><br /><br />Hello!
別なオブジェクトにアクセスしてみましょう。
curl http://xxxxxxxxxxxxx.cloudfront.net/sample/sample2.html -H 'Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2RidXdicnljMmVkcmcuY2xvdWRmcm9udC5uZXQvc2FtcGxlLyouaHRtbCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQzNTY3Njxxxxxxxxxx; CloudFront-Signature=S-GjE1yQZOiR0N7NeAhluifvPJfuWw8yUSGDoBemEGDraQJpUyjA3xthK2gGKzLnQlPbgG1NLytt5ge5IThXWa-1rfeyflwpD3OAAH5GL4JCraDZyWqAGmoV30ExQkFLel-BogSuq0ckhVukTnZ~2vZV5X7hmoxwaplmP0BO-EvpE65-Y7yAsD6FJT7Aj8tyqtpmuXBNGDst3dhCJAsls-MkIlOZKAKLdviTwQ5AYwVFW2fEU~q0Xx5FygV83Gg~B4DLlRncZfNOnnIA8M3MAQyc1lVLTatksU-9i3-OIx5DUa-uo3nwJsfQALIVnpUyznLaCi3T6R4u4Txxxxxxxxxx; CloudFront-Key-Pair-Id=XXXXXXXXXXXXXXXXXXX'
OKです!
<br /><br /><br />Hello!!!!
まとめ
以上、ワイルドカードを使用したプライベート配信の手順でした。利用用途としては、例えばモバイルアプリの会員限定コンテンツや、ユーザー専用のプライベートフォルダ(ユーザー別に Cookie を発行する)などといった機能が実現できます。IP制限を使うことでステージング用途としても使えそうですね。