有什么方法可以通过 SNS 格式化 S3 通知吗?
Any way to format S3 notifications via SNS?
我正在为存储桶中创建的新对象测试 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 主题发布消息。
有关设置 Lambda 函数以在每次将图像上传到 S3 时生成缩略图的教程,请参阅 http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html。
它演示了如何在 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 + "\r\n" +
"Bucket: " + srcBucket + "\r\n" +
"Event: " + srcEvent + "\r\n";
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 \r\n" +
"Hora: " + time + "\r\n" +
"Bucket: " + srcBucket + "\r\n" +
"Evento: " + srcEvent + "\r\n" +
"Objeto: " + nombre + "\r\n" +
"Tamaño (en MB): " + tamano/1048576 + "\r\n";
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" 获取大小。最后一个以字节为单位,因此我通过简单的操作将其转换为兆字节。
我正在为存储桶中创建的新对象测试 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 主题发布消息。
有关设置 Lambda 函数以在每次将图像上传到 S3 时生成缩略图的教程,请参阅 http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html。
它演示了如何在 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 + "\r\n" +
"Bucket: " + srcBucket + "\r\n" +
"Event: " + srcEvent + "\r\n";
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 \r\n" +
"Hora: " + time + "\r\n" +
"Bucket: " + srcBucket + "\r\n" +
"Evento: " + srcEvent + "\r\n" +
"Objeto: " + nombre + "\r\n" +
"Tamaño (en MB): " + tamano/1048576 + "\r\n";
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" 获取大小。最后一个以字节为单位,因此我通过简单的操作将其转换为兆字节。