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 に置いて、そこからダウンロードさせる用途に向いた方法ですね。