Help us understand the problem. What is going on with this article?

最近知って改めてS3を好きになった機能!コンテンツ配信をセキュア化する「PresignedURL」

More than 5 years have passed since last update.

AWSのS3にはPresignedURLという、コンテンツを限定的に公開するための機能があります。
S3を使ってコンテンツ配信を行っている人は是非とも押させておくべき機能です。
PresignedURLの概要から利用シーン、具体的な使い方をまとめます。

PresignedURLとは

S3にアップロードされたコンテンツを制限時間付きで公開する機能です。
指定した時間内のみ有効なURLを動的に生成することができ、そのURLにアクセスすることでコンテンツにアクセスできます。
URLの生成にはアクセスキーとシークレットキーが必要です。
オブジェクトのアクセス権を持つ者が、アクセス権を持たない者に制限時間付きでコンテンツを公開できる機能なのです。

PresignedURLを使うとどんな嬉しいことがあるのか

「制限時間付きで公開できて嬉しいの?」
「API使って、時間がきたらコンテンツ削除すれば良いじゃん!」
と最初は思ったのですが、PresignedURLの想定利用シーンは、以下のようなシーンです。

WebアプリケーションサーバーのコンテンツをS3に配置して、Webアプリケーションサーバーの負荷軽減を行うとします。

下記の構成を実現することで、コンテンツをWebアプリケーションサーバーに配置した場合と比較して、Webアプリケーションサーバーの負荷を下げる事ができます。

スライド1.JPG

ただし、上記の構成を実現するためには、S3にアップロードしたコンテンツをどこからでもアクセス可能なように設定する必要があります。
つまり、Webアプリ関係なく、コンテンツが利用される可能性があるわけです。

そこで、PresignedURLの出番です!
Webアプリケーションサーバーで、一時的に有効なURLを動的に生成し、そのURLをブラウザに渡してやることで、コンテンツの全公開をする必要がなくなります。
生成されたURLもすぐに無効になるため、自由にそのコンテンツにアクセスできるという事は無くなります。
具体的には下記のイメージです。

スライド2.JPG

PresignedURLの機能は、時間を限定してコンテンツの公開ができて嬉しいというよりは、
「動的に」時間制限ありのコンテンツ公開ができるのが嬉しいのです。

実際にPresignedURLを生成してみる

実際にPresignedURLの生成をしてみます。

AWSから提供されているSDKを利用することで、簡単にPresignedURLを生成することができます。

以下は、PresignedURLの生成をJavaで実装してみたコードです。

    private static URL createPreSignedUrl(String accessKey, String secretKey, String bucketName, String objectName){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        AmazonS3 s3Client = new AmazonS3Client(credentials);

        Date expiration = new Date();
        long msec = expiration.getTime();
        msec += 1000 * 60; // 1分だけ有効なURLを生成する
        expiration.setTime(msec);

        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
        generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
        generatePresignedUrlRequest.setExpiration(expiration);

        return s3Client.generatePresignedUrl(generatePresignedUrlRequest); 
    }

上記を使って、"wakamatsu-test"という名前のバケットに作成したtest.txtを1分間だけ公開します。

s3ob.png

アクセスを許可していないので、以下の「リンク」にアクセスしても、Access Deniedが出てしまいます。

access.png

dn.png

先ほどのJavaプログラムを使ってPresignedURLを生成します。
以下が生成されたURLです。

https://wakamatsu-test.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAI2HC6MLP22MJDT2Q&Expires=1444751266&Signature=a97izpIZGlL%2F3ba%2BsjyKiVFJDk0%3D

ブラウザで上記のURLを開いてみます。

succ.png

全公開していないコンテンツにアクセスすることができました!

ちなみに、1分後にアクセスしてみると、、、

expire.png

"Request has expired"となり
ちゃんとアクセスできないようになっています!

まとめ

PresignedURLを使う事で、セキュアなコンテンツ公開を実現する事ができます。
PresignedURLの生成はSDKを使う事で簡単に生成できますので、ぜひ使ってみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away