AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

署名付きURLはよくあるパターンですが、署名付きCookieでコンテンツ配信はあまり使用する機会がなかったので今回調べてみました。

CloudFront設定

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツをコンテンツを配信する方法

「Create Distribution」をクリックします。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツをコンテンツを配信する方法

Webの「Get Started」をクリックします。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

「Origin Domain Name」でS3バケットと紐づけます。

「Create Distribution」をクリックします。赤枠で囲んでいる部分がオリジンアクセスアイデンティティです。

オリジンアクセスアイデンティティ確認

S3のバケットポリシーを確認します。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

オリジンアクセスアイデンティティが追加されていることが確認できます。

これでS3経由でアクセスできずにCloudFront経由でしかアクセスできないようになっているはずです。

S3のURL

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

CloudFrontのURL

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

アクセスの確認ができました。今度は署名付きCookieもしくは署名付きURLのみアクセス可能に制限します。

CloudFrontのBehaviorsの設定を変更します。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

「Self」にチェックを入れると今のAWSアカウントIDのみとなります。

この設定で、再度、CloudFront経由でアクセスしてみます。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

正常にアクセスできず、エラー内容が「キーペアIDのcookieが設定されていない」、的な内容に変わっていることが確認できます。

CloudFront-Policy,CloudFront-Signature,CloudFront-Key-Pair-Idクッキーが必要

この3つのクッキーはシステムログイン時にでもヘッダ情報に設定してもらってからCloudFront + S3経由で署名付きCookieでアクセスすることになると思います。

ちなみにAPI Gateway + Lambdaでクッキーを設定する方法は「API Gateway+LambdaでヘッダにSet-Cookieを複数設定する方法」で書きましたが、スマートな方法ではないことは確かです。。

各クッキーに設定する値は以下の通りです。

クッキー
CloudFront-Policy base64エンコードされたJSON形式のポリシーステートメント
CloudFront-Signature 署名されたbase64エンコードバージョンのJSONポリシーステートメント
CloudFront-Key-Pair-Id アクティブなCloudFrontキーペアID

カスタムポリシーを作成する場合はこの3つが必要になります。署名するためにCloudFrontのキーペア作成も必要です。「AWS アカウントIDでCloudFrontのキーペアを取得する方法」参照ください。

ポリシーステートメントでプライベートコンテンツにワイルドカードが使える

以下、ポリシーステートメントの例です。URLにワイルドカードが使えるので便利です。

エポックタイムを指定して期間を指定することも可能です。

但し、いくつかカスタムポリシーには注意点があります。

1.Statementは配列になっているが1つだけしか指定できない

2.Resourceを配列にして複数URLを指定することができない

カスタムポリシーの構文が間違っている状態だと、ブラウザでアクセス時にMalformedPolicyエラーが発生します。

カスタムポリシーを使用した署名付き Cookie の設定 

policyファイル

ポリシーステートメントをbase64エンコードしていくのですが、参考サイトにある通り、cat policy | tr -d "\t\n\r "でポリシーステートメントの空白文字や改行コードを削除する必要があります。

base64エンコードされたJSON形式のポリシーステートメント

LinuxやWSLの環境などで以下を実行します。出力結果をCloudFront-Policyに設定します。

署名されたbase64エンコードバージョンのJSONポリシーステートメント

LinuxやWSLの環境などで以下を実行します。出力結果をCloudFront-Signatureに設定します。

アクティブなCloudFrontキーペアID

キーペアのファイル名(pk-キーペアID.pem)をCloudFront-Key-Pair-Idに設定します。

確認方法

これでcurlコマンドでアクセスできることを確認します。

Chromeで確認したかったので、開発者ツールのコンソールタブでdocument.cookieにcookieを設定しても確認することは可能です。

AWS CloudFront+S3で署名付きCookieでプライベートコンテンツを配信する方法

参考サイト

CloudFront+S3で署名付きURLでプライベートコンテンツを配信する

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AmazonCloudFront_DevGuide.pdf

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA