[AWS]S3の期限付きURLを生成する[node]

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

期限付きURLで安全にS3アクセス

先日aws-sdkのソースをみていたところ、pre signed url機能が実装されているのを見かけました。
pre signed urlとは、S3のオブジェクトに対して任意の期限を設定してアクセスさせるURLを生成するあれです。
今回はこの機能を試してみましょう。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.8
  • npm : 1.2.23
  • rake: 10.0.4

現在(2013/6/5)、aws-sdkは1.2.0がリリースされていますが、今回試すpre singed urlの機能は実装されていません。
ので、githubからソースを取得してそれを使用します。
git cloneでaws-sdkを取得し、rakeで依存ライブラリを取得しておきます。

% git clone https://github.com/aws/aws-sdk-js.git
% cd aws-sdk-js
% rake build
% cd ../
% mkdir aws-sample
% cd aws-sample

pre signed urlを取得するためのサンプルプログラムを作成します。aws-sdkは取得したディレクトリを指定するので注意してください。
バケットとキーを指定してgetSignedUrl関数を使用すると、それにアクセスするための期限付URLを生成してくれます。

//aws-sample/s3.js
var AWS = require('../aws-sdk-js');
AWS.config.update({
    "accessKeyId": "<アクセスキー>",
    "secretAccessKey":"<シークレットキー>",
    "region": "<リージョン>" });

var s3 = new AWS.S3();
var params = {Bucket: '<バケット名>', Key: '<キー名>'};
s3.getSignedUrl('getObject', params, function (err, url) {
    console.log("The URL is", url);
});

上記サンプルでは非同期ですが、第3引数にコールバックを指定しなかった場合、同期でURLが生成されます。
その場合、getSignedUrl関数の戻り値としてURLが返されます。

なお、生成された期限付きURLは、デフォルトでは15分に指定されています。
時間を指定したい場合、getSignedUrlへ渡すパラメータに秒単位で指定して渡すことができます。

//期限を自分で設定したい場合.60秒に指定
var params = {Bucket: '<バケット名>', Key: '<キー名>', Expires: 60};

まとめ

aws-sdk 1.2.0ではまだ使えませんが、そのうちリリースされるバージョンでは使えるようになっているはずです。
もう少し待ちましょう。

参考サイトなど