S3へのアクセスをEC2経由(特定のURL)のみに設定する
開発環境などに使用することがあるのでメモ
やりたいこと
- UserがEC2経由のhttpアクセス時のみS3のコンテンツを表示
- UserからS3への直アクセスは拒否する
設定
EC2側
- httpdをインストール
# yum install httpd
- 下記のようにS3へアクセスするためのファイルを準備
index.html
S3link
S3側
- Bucketを作成
- Bucket配下にindex.htmlを配置
- index.htmlへアクセスを確認する (この段階ではアクセス出来る)
- BucketのPropertiesからPermissionsを選択、Edit bucket policyに下記を追加
bucketpolicy.
{ "Version": "2012-10-17", "Id": "policy example", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKETNAME/*", "Condition": { "StringLike": { "aws:Referer": "http://xxx.xxx.xxx.xxx/*" } } } ] }
設定後
- S3へ直接アクセス
AccessDeniedになることを確認 - EC2を経由しアクセス
S3へのリンクからコンテンツが表示されることを確認
追加検証
S3へファイルをアップロードする際にpublic-readを付与するとどうなるか
- index.htmlにpublic-readのACLを付与してS3へアップロード
# aws s3 cp index.html s3://BUCKETNAME/index2.html --acl public-read
- アクセスを確認する
S3への直接アクセスでアクセスが出来る
まとめ
S3への直接アクセスは拒否しつつEC2経由でのアクセスが出来る。
アクセス元のURLを指定すれば同じように特定のURLからのアクセス等も指定できる。
bucketpolicyの設定をすればbucket内の特定の拡張子やパスのみといった使い方も可能なはず。
HTTP Refererを利用してアクセスをしているためアクセス管理設定をEC2側である程度コントロール出来る。
(SecurityGroupで制限や特定のサブドメイン経由のみ、Basic認証付きや一部のコンテンツだけとかetc…)
今回のケースの様に使う際には、acl設定に注意してS3へアップロードすること。