CloudFront の署名付き Cookie によるプライベートコンテンツ配信でワイルドカードを使用する

2015.06.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ワイルドカードを使用したプライベートコンテンツ配信

先日下記のブログにて、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 をセットして対象のURLにアクセスします。Cookie は3つの値をセットします。既定ポリシーとヘッダーが異なるので、注意してください。

  • CloudFront-Policy : 先ほど作成した、Base64 エンコードしたポリシー
  • CloudFront-Signature : 先ほど作成した、署名された Base64 エンコードしたポリシー
  • CloudFront-Key-Pair-Id : 作成した CloudFront キーペアのID

Cookie を設定するフォーマットは次の通りです。このうち DomainPath はオプションです。

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制限を使うことでステージング用途としても使えそうですね。

参考