任何通过SNS格式化S3通知的方法



我正在测试存储桶中创建的新对象的SNS通知。当我收到SNS通知时,它看起来像一堆带有参数的代码。比如:

{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"eu-west-1","eventTime":"2016-08-28T09:12:36.709Z","eventName":"ObjectCreated:Put","userIdentity":.......

我想把这些数据转换成人类可读的格式,比如:

Time: xxxxxxx
Bucket: xxxxxxxx 
Event: xxxxx

有办法吗?一些我应该知道的攻略?

我假设你的SNS通知订阅者是电子邮件端点?

我认为最简单的方法是使用AWS Lambda进行格式化。

与其将s3事件发布到SNS,不如将它们发布到AWS Lambda函数。在Lambda函数中,编写一些代码来按照需要格式化事件记录。然后Lambda函数可以向SNS主题发布消息。

请参阅http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html获取与设置Lambda函数相关的教程,以便在将图像上传到S3时生成缩略图。

演示如何在lambda函数中访问事件属性。

参考那个例子,根据你的情况调整:

var util = require('util');
var AWS = require('aws-sdk');  
AWS.config.region = 'eu-west-1';

exports.handler = function(event, context, callback) {
    // Read options from the event.
    console.log("Reading options from event:n", util.inspect(event, {depth: 5}));
    var s3Event = event.Records[0];
    var srcBucket = s3Event.s3.bucket.name;
    var srcEvent = s3Event.eventName;
    var time = s3Event.eventTime;
    var msg = "Time: " + time + "rn" +
              "Bucket: " + srcBucket + "rn" + 
              "Event: " + srcEvent + "rn";
    var sns = new AWS.SNS();
    sns.publish({
        Message: msg,
        TopicArn: 'TOPIC_ARN'
    }, function(err, data) {
        if (err) {
            console.log(err.stack);
            return;
        }
        console.log('push sent');
        console.log(data);
        context.done(null, 'Function Finished!');  
    });
}

(上面还包括https://gist.github.com/jeremypruitt/ab70d78b815eae84e037关于发布到sns的一个片段)

这只是一个未经测试的示例—我建议您遵循上面的教程,因为它还告诉您需要进行的各种权限和其他配置—但是上面的函数应该作为一个起点。

所以在所有这些更改之后这是最终的代码:

var util = require('util');
var AWS = require('aws-sdk');  
AWS.config.region = 'eu-west-1';

exports.handler = function(event, context, callback) {
    // Read options from the event.
    console.log("Reading options from event:n", util.inspect(event, {depth: 5}));
    var s3Event = event.Records[0];
    var srcBucket = s3Event.s3.bucket.name;
    var srcEvent = s3Event.eventName;
    var time = s3Event.eventTime;
    var nombre = s3Event.s3.object.key;
    var tamano = s3Event.s3.object.size;
    var msg = "Nuevo objeto rn" +
              "Hora: " + time + "rn" +
              "Bucket: " + srcBucket + "rn" + 
              "Evento: " + srcEvent + "rn" +
              "Objeto: " + nombre + "rn" +
              "Tamaño (en MB): " + tamano/1048576 + "rn";
    var sns = new AWS.SNS();
    sns.publish({
        Message: msg,
        TopicArn: 'TOPIC_ARN'
    }, function(err, data) {
        if (err) {
            console.log(err.stack);
            return;
        }
        console.log('push sent');
        console.log(msg);
        context.done(null, 'Function Finished!');  
    });
}

注意,我已经添加了2个新变量:"nombre"获取创建的文件的名称,"tamano"获取文件的大小。最后一个以字节为单位,所以我通过一个简单的操作将其转换为兆字节。

最新更新