FAT47の底辺インフラ議事録

学んだことのメモ帳です

S3+CloudFrontの期限付き認証URL発行機能でコンテンツ配信

概要
S3+CloudFrontで認証付きURL発行して、認証なしのアクセスを弾きたい。


設定手順
S3バケットの作成
コンテンツ格納先のS3の作成をします
マネージメントコンソールからS3をクリック


バケットの作成をクリック


任意のバケット名を入力して作成をクリック


作成されたらプロパティをおして、アクセス許可の項目を確認
現在はなにも設定されていないので、
バケットポリシーの追加」などしか表示されていない


CloudFrontの設定
S3のファイルを配信するCloudFrontを設定します
マネージメントコンソールからCouldFrontをクリック


CreateDistributionをクリック


デリバリーメソッドの選択
今回は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 *****
    • url アクセスしたいコンテンツのCloudFront上のURL
    • expires 有効期限をUNIXタイムスタンプで指定
    • private-key AWS上で取得した秘密鍵を指定
    • 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