[AWS]S3の期限付きURLを生成する[node]
期限付き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ではまだ使えませんが、そのうちリリースされるバージョンでは使えるようになっているはずです。 もう少し待ちましょう。