Amazon S3でデータに簡単なアクセス制限をかける方法

PHP+Amazon S3でファイルアップローダーを作る

ありがちですが、ユーザーがフォームからファイル名を指定して、送信ボタンを押すとそれがAmazon S3に保存される・・・というシステムを作ります。

フォームは次のように、ただファイル名を入力する欄だけ用意しておきます。

<form action=”./upload_test.php” method=”post” enctype=”multipart/form-data”>
    <input type=”file” name=”data”>
    <input type=”submit”>
</form>

ローカルPCからデータをAmazon S3にアップロード

WEBサーバ上にあるファイルをAmazon S3に転送する方法は、PHPからAmazon S3を使うに書きました。

これをそのまま使って、WEBサーバからではなく、ユーザーのローカルPCのファイルをS3にアップロードするようにします。

$s3 = new AmazonS3();
$s3->create_object(“katty-practice2”, “upload_test.jpg”, array(‘fileUpload’=>$_FILES[‘data’][‘tmp_name’], ‘acl’=>AmazonS3::ACL_PRIVATE));

先の方法と本質的に変わったのは、fileUploadの要素だけです。ここにユーザーから送信されたファイルの場所を指定するだけです。

この$_FILES[‘data’][‘tmp_name’]の中身を見てみると、次のようにローカルPCのアドレスになっているのですが、うまいことやってアップロードしてくれます。

C:UserskattyDocumentstest.jpg

簡単なアクセス制限

今回は、acl(Access Control Listのこと)の要素に、AmazonS3::ACL_PRIVATEを指定しました。

これによって、アップロードしたファイルは、単純にURLを叩いても外から見えなくなります。

では、どのURLでアクセスしたら良いか?というのをライブラリを使って問い合わせてみます。

echo $s3->get_object_url(“katty-practice2”, “upload_test.jpg”, ‘1 minutes’);

この意味は?

katty-practice2というバケットのupload_test.jpgという画像のURLをください。ただし、そのURLは1分間で無効にしてください。

これによって、次のような長ったらしくて、暗号的なURLが手に入ります。これを使えば、1分間は、そのデータにアクセスできるようになります。

http://katty-practice2.s3.amazonaws.com/upload_test.jpg?AWSAccessKeyId=AKIAJE2IJHFYBVWUYV2Q&Expires=1301595777&Signature=v%2FLLfkNWjJsU7rPJrvbgo%2BTAA6A%3D

あとは、データベースなどでファイルのアクセス権限を管理して、許可されたユーザーにはその都度URLを問い合わせて渡せば簡単なアクセス制限ができると思われます。

コメント

タイトルとURLをコピーしました