はじめに
CloudFrontでプライベートなコンテンツを配布する必要があり、署名付きcookieを使うことになりました。公式のドキュメントに説明はありますが、ドキュメントが分散していたり、わかりづらかったので手順をまとめてみました。
手順
1. CloudFront用のキーペアを作成する
コンソールから作成する方法と、ローカルでキーペアを作成してからAWSにアップロードする方法とがある。
コンソールから作成する方法は、このページ(http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html )の「AWS マネジメントコンソールで CloudFront キーペアを作成するには」を参照。
プライベートキーをダウンロードして、「private_pk.pem」のファイル名で保存する。また、アクセスキーをメモしておく。
ルートアカウントでログインしないと、CloudFront用のキーペアは作成できないので注意。IAMユーザーでキーペアを作成しようとすると、権限がないとのエラーになる。
2. ポリシーステートメントを用意する
ポリシーステートメントの例:
{"Statement":[{"Resource":"http*://test.example.com/*","Condition":{"DateLessThan":{"AWS:EpochTime":1501372800}}}]}
JSON形式でドメインや有効期限などを設定する。他にも、DateGreaterThanやIpAddress(特定のIPからのみアクセスを許可)といったオプショナルパラメータを指定できる。「policy.json」のファイル名で保存する。
3. 1.で作ったポリシーステートメントをbase64エンコードする
cat ./policy.json | openssl base64 | tr '+=/' '-_~'
「./policy.json」は2.で作ったポリシーステートメントのパス。trは、URLクエリ内の無効な文字を置き換えるため。上のコマンドで出力された文字列をメモしておく。
コマンドの説明はこちらを参照: http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-linux-openssl.html
4. 1で作ったポリシーステートメントを署名し、base64エンコードする
cat ./policy.json | openssl sha1 -sign ./private_pk.pem | openssl base64 | tr '+=/' '-_~'
「./private_pk.pem」は、1.でダウンロードしたプライベートキーのパス。上のコマンドで出力された文字列をメモしておく。
5. cookieをセットする
CloudFront-Key-Pair-Id={1.でメモしたアクセスキー}
CloudFront-Policy={3.で作ったbase64エンコードされたポリシーステートメント}
CloudFront-Signature={4.で作った署名済みのポリシーステートメント}
で、プライベートコンテンツをダウンロードするブラウザにcookieをセットする。
コード例:
// cfKeyPairId/cfPolicy/cfSignatureに、上記の値が入っている
document.cookie = "CloudFront-Key-Pair-Id=" + cfKeyPairId + "; "
document.cookie = "CloudFront-Policy=" + cfPolicy + "; "
document.cookie = "CloudFront-Signature=" + cfSignature + "; "
6. 動作チェック
正しく設定できていれば、5.でcookieをセットしたブラウザからだけ、ポリシーステートメントで指定したURLにアクセスできる。