S3で有効期限付きのページを作る
業務向けのサービスで、任意の時間内に限定してアクセス可能なサインアップページを用意する必要がありました。
こういったケースでは、S3の期限付きURL(pre-signed urlと呼ばれる)を発行させるのが便利そうです。ということで早速nodeで試してみました。
photo by Mr. Alex Garcia - Double Cliche on flickr
node.jsから期限付きURLを得る
まずはaws-sdk
をインストールします。
1 | npm install aws-sdk --save |
次にnodeから実行するjsファイルへ、S3バケットやアクセス許可する時間を記述していきます。
1 | var AWS = require('aws-sdk'); |
例えば、S3にcognito-signup
というバケットを用意し、./signup.html
へ1時間に限りアクセス許可させたい場合には以下のようになります。
1 | var s3 = new AWS.S3(); |
実行すると期限付きURLが発行されます。
1 | $ node index.js |
かなり手軽に生成できますね。LambdaやEC2から生成させるなど、限定してアクセスしてもらいたい場合に活用したいと思います。
参考記事
以下の記事が参考になりました。
S3の期限付きURLを生成する | Developers.io
http://dev.classmethod.jp/cloud/aws/node-pre-signed-url/
注意点としては、期限に設定できる期間は1秒から604800(7日間)だそうです。
S3の事前署名付き(期限付き)URLに設定できる期限には上限がある | Qiita
http://qiita.com/kikuchy/items/223ced22d824bec78e1a
また、GETだけでなく、S3のオブジェクトをPUTすることもできるようです。以下の例では期限付きURLを発行した後でcurlからファイルをアップロードしています。
Boto3でS3のpre-signed URLを生成する | Developers.io
http://dev.classmethod.jp/cloud/aws/generate-pre-signed-url-for-s3-with-boto3/
S3 オブジェクトを更新するときにも pre-signed URL は使えます。 この機能を利用すると、モバイル端末や外部サービスなどから一時的に権限を付与し、S3 に直接アップロードさせることもできるようになります。