S3+CloudFrontの期限付き認証URL発行機能でコンテンツ配信
概要
S3+CloudFrontで認証付きURL発行して、認証なしのアクセスを弾きたい。
設定手順
S3バケットの作成
コンテンツ格納先のS3の作成をします
マネージメントコンソールからS3をクリック
バケットの作成をクリック
任意のバケット名を入力して作成をクリック
作成されたらプロパティをおして、アクセス許可の項目を確認
現在はなにも設定されていないので、
「バケットポリシーの追加」などしか表示されていない
CloudFrontの設定
S3のファイルを配信するCloudFrontを設定します
マネージメントコンソールからCouldFrontをクリック
デリバリーメソッドの選択
今回はWebコンテンツの配信なのでWebの項目から「Get Started」をクリック
Origin Domain Nameの項目をクリックして、
先程作成したS3バケットを選択
オリジンアクセスアイデンティティ設定
「Restrict Bucket Access」でYesを選択
「Origin Access Identity」でCreate ad New Identityを選択cket
「Comment」に用途がわかるようなコメントを記入:例:access-identity-[バケット名]
「Grant Read Permissions on Bucket」でYes,Update BuPolisyを選択
その他はそのままでいいので、
一番下にある「Create Distribution」をクリック
最大15分程度設定反映まで時間がかかるので、
以下の行程は時間を置いてから行います
オリジンアクセスアイデンティティの確認
左メニューからOrigin Access Identityをクリック
すると今設定されてるものがリストで表示されます
先程Commentで入力したaccess-identity-[バケット名]が表示されている事を確認
「ID」の部分を覚えておきます(今回の場合はECS***)
S3バケットのポリシー確認
バケットのポリシーも同時に変更されているので確認
マネージメントコンソールからS3管理画面に飛んで、
先程作成したS3バケットを選択して、
「プロパティ」→「アクセス許可」→「バケットポリシーの編集」をクリック
先程を空欄だったらバケットポリシーが変更されていて、
GetAbjectに先程CloudFrontで設定されたIDが付与されています
コンテンツの利用確認
S3管理画面からバケットを選択して、適当なコンテンツをアップロードします
コンテンツを選択してプロパティを選択するとその画像のURLが表示されます
例、リンク: https://s3-ap-******.amazonaws.com/dev.hogehoge/hogehogehoge.jpg
そのURLを開こうとするとAccessDeniedではじかれます
次はCloudFrontの管理画面をひらき、先程作成したディストリビューションを選択
Genetalのタブをひらくと、Domain Nameという項目があるのでそれをコピー
ブラウザからに貼り付けて、先程S3にアップしたコンテンツのファイル名をつけてアクセス
例、https://********.cloudfront.net/hogehogehoge.jpg
するとちゃんと画像が表示されます
CloudFrontキーペアの作成
以下のドキュメントの通り、管理画面からキーペアを作成します
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html
ユーザ権限によっては作成できないので、出来ない場合は管理者に問い合わせます
作成したキーペアをCloudFrontのディストリビューションに紐付ける
CloudFrontの管理画面からディストリビューションを選択して、
「Behavior」タブから一つのポリシーを選択して、
「Edit」ボタンをクリック
Restrict Viewer Accessをyesにし、
Trusted SignersでSelfを選択して、下にある「yes,Edit」をクリックします
※作成したキーペアの所有者がCloudFrontディストリビューションを作成している
AWSアカウント自体であればSelfで大丈夫ですが、
それ以外のAWSアカウントであれば「Specity Accounts」をチェックして、
そのAWSアカウント番号を入力
perlを使って認証URL発行テストする
1.Amazon CloudFront Signed URLs helper toolをダウンロードしてくる
https://aws.amazon.com/items/3052?externalID=3052&categoryID=215
2. perlで足りなかったモジュール入れます
yum install perl-URI
3. ツール実行
./cfsign.pl --action encode --url http://hogehoge**.cloudfront.net/index.html --expires 1435047210 --private-key pk-*****.pem --key-pair-id *****
すると、
Encoded URL: http://*****.cloudfront.net/index.html?Expires=1435047210&Signature=PEJX4gtNsXPjVd5Hm4s9yRMGaQlYA7bRzeex-dz4f2Cgeha9GshVnwVUfTK0mv7WrO4nfvE53Ykcxxy4XfjNlvmy17fHDMsRT3gqlGgpBBPNTh55zPcjJkWMNMp7xSzDFKX3D7wsFeIhk2a5ppeQhXC2xK6yK81KOHuW-vOLqKBk6yRZyhpTFcwQohlGjARt0rkoJepCA8grwX84v6w79BB6k7kjxzNoMTjg7g1WvO0BHKnVvqKhogehogehogehogehogehoge <l --expires 1435047210 --private-key pk-*****.pem --key-pair-id *****
のような期限付きで利用可能なURLが帰ってきます
参考URL
[CloudFront + S3]特定バケットに特定ディストリビューションのみからアクセスできるよう設定する
http://dev.classmethod.jp/cloud/aws/cloudfront-s3-origin-access-identity/
CloudFront+S3で署名付きURLでプライベートコンテンツを配信する
http://dev.classmethod.jp/cloud/aws/cf-s3-deliveries-use-signurl/
CloudFront を使用してプライベートコンテンツを供給する
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html