S3 Presigned URL を使ってみる
Amazon S3にアップロードしたファイルをダウンロードするには、AWS アカウントの認証が必要になります。
アクセス権限を全員がアクセス可能な状態にすれば、S3 上のファイルの URL を指定しただけでダウンロードが可能ですが。
一部の人のみダウンロード可能にする方法の一つとして、S3 の Pre-signed URL というものがあります。
https://bucket-name.s3.amazonaws.com/test.txt?Expires=1353386085&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=9Vvu49EtywfHkvPWgcuI%2FabdUAc%3D
これは、どういうものかと言うと、URL の部分に下記のように文字列を追加して、この URL を用いて S3 のファイルをダウンロード可能にするものです。
今回この機能を使ってみました。
まず、S3 にファイルをアップします。
S3 へのファイルのアップロードは AWS Management Console で可能です。
今回はファイル名を test.txt、bucket 名を bucket-name とします。
AWS SDK for Java を使って、下記のようなプログラムを実行します。
public class S3PresignedURLGenerator { public static void main(String[] args) throws IOException { AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(S3PresignedURLGenerator.class.getResourceAsStream("AwsCredentials.properties"))); String bucketName = "bucket-name"; String key = "test.txt"; Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, 20); Date expiration = cal.getTime(); URL url = s3.generatePresignedUrl(bucketName, key, expiration); System.out.println(url.toString()); } }
次に AwsCredentials.properties ファイルを作成して、下記を書き込みます。
secretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX accessKey=XXXXXXXXXXXXXXXXXXXXXX
上記の S3PresignedURLGenerator を実行してみると、下記のような URL がコンソールに表示されます。
https://bucket-name.s3.amazonaws.com/test.txt?Expires=1353386085&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=9Vvu49EtywfHkvPWgcuI%2FabdUAc%3D
こちらにアクセスすると、誰でもファイルをダウンロードが可能となります。
ただし、こちらは期限付きです。
指定した日時が過ぎると、ダウンロードができなくなります。
主な用途としては、Web/Application サーバ上にファイルを置くのではなく、S3 上にファイルを保管する場合。
S3 から直接ユーザーがダウンロードさせるために、一時的に上記のような URL を取得して、ユーザーにその URL を渡してあげます。
このようにすることで、ダウンロードするたびに一時的な URL で、かつ類推しにくい URL を渡すようにすることで、ユーザーは S3 から直接ファイルをダウンロードできるようになります。
S3 からダウンロードさせることで、Web/Application サーバ側の負荷を軽減できます。
ファイルを直接 S3 に置いて、そこからダウンロードさせる用途に向いた方法ですね。