S3へのアクセスをEC2経由(特定のURL)のみに設定する
開発環境などに使用することがあるのでメモ

やりたいこと

  1. UserがEC2経由のhttpアクセス時のみS3のコンテンツを表示
  2. UserからS3への直アクセスは拒否する

設定

EC2側

  1. httpdをインストール
# yum install httpd
  1. 下記のようにS3へアクセスするためのファイルを準備

index.html


S3link

S3側

  1. Bucketを作成
  2. Bucket配下にindex.htmlを配置
  3. index.htmlへアクセスを確認する (この段階ではアクセス出来る)
  4. 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/*"
                }
            }
        }
    ]
}

設定後

  1. S3へ直接アクセス
    AccessDeniedになることを確認
  2. EC2を経由しアクセス
    S3へのリンクからコンテンツが表示されることを確認

追加検証

S3へファイルをアップロードする際にpublic-readを付与するとどうなるか

  1. index.htmlにpublic-readのACLを付与してS3へアップロード
    # aws s3 cp index.html s3://BUCKETNAME/index2.html --acl public-read
  2. アクセスを確認する
    S3への直接アクセスでアクセスが出来る

まとめ

S3への直接アクセスは拒否しつつEC2経由でのアクセスが出来る。
アクセス元のURLを指定すれば同じように特定のURLからのアクセス等も指定できる。
bucketpolicyの設定をすればbucket内の特定の拡張子やパスのみといった使い方も可能なはず。
HTTP Refererを利用してアクセスをしているためアクセス管理設定をEC2側である程度コントロール出来る。
(SecurityGroupで制限や特定のサブドメイン経由のみ、Basic認証付きや一部のコンテンツだけとかetc…)

今回のケースの様に使う際には、acl設定に注意してS3へアップロードすること。

参考サイト

MD-Blog_Server/Network

元記事はこちら

S3へのアクセスをEC2経由のみにする