Edited at

AWS Lambdaを使ってS3の署名付きURLを自動的に発行する

More than 3 years have passed since last update.


はじめに

普段、メールに添付できないような容量の大きいファイルをやりとりするために、S3の署名付きURLを使っています。その他の用途でも、期間限定で特定の人にだけファイルを渡したいときに使うと非常に便利です。

署名付きURLを使用したオブジェクトのアップロード

ただし、署名付きURLの作成にはSDKを利用して自分でコーディングする必要があります。自分の場合、Pythonのコードを書いてました。さらに、アップロードの後にファイル名を指定してコードを実行する必要があるので、ちょっと面倒です。

というわけで、今回はlambdaを利用して特定のバケットに入ったファイルに対し、自動的に署名付きURLを発行し、SNSによりメールで通知する(自分に)を作ってみたいと思います。


処理の流れ


  1. S3にファイルをアップロード

  2. LambdaでEventを受信

  3. Lambda FunctionでS3の署名付きURL取得&SNSへパブリッシュ

  4. SNSでメール送信

20141204.png


事前準備


  • PUT用S3バケットの準備

  • SNSのトピック作成


Lambdaへの関数登録

S3のアップロードのイベントをトリガとして、S3の署名付きURL取得とSNS送信を行います。本当に簡単に実装できました。

有効期限を300秒としてますので、適宜変更してください。


s3signedurl.js

var aws = require('aws-sdk');

exports.aws = aws;

exports.handler = function(event, context){

var expired_period_sec = 300;
var bucket = event.Records[0].s3.bucket.name;
var key = event.Records[0].s3.object.key;

//S3署名付きURL取得
var s3 = new aws.S3( {Bucket: bucket, Key: key} );
var params = {Bucket: bucket, Key: key, Expires: expired_period_sec};
var url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url);

//SNSでURL送信
var sns = new aws.SNS({params: {TopicArn: '<SNSのTopic ARN>'}});
  sns.publish({Message: url}, function (err, data) {
if (!err) {
console.log('Message published');
context.done(null,'');
}else{
console.log("Err");
context.done('Err',err);
}
});
};



気をつけること

Lamba実行のIAM roleにSNSのpublish権限を付与する必要がありますので、お忘れなく。


さいごに

周りのLambda熱におされて、自分も何か作らねば・・・と思い、とりあえず簡単なものから試してみました。

ちょっとしたことでもLambdaを使って簡単に実装できるのがいいですね。これからもいろいろ試してみます。

免責事項:こちらは個人の意見で、所属する企業や団体は関係ありません。