【发布时间】:2018-05-20 20:12:06
【问题描述】:
我刚开始学习 aws,我已经创建了几个 cloudwatch log 自定义指标过滤器并订阅了相同的 lambda 函数,但我想让我的 lambda 函数执行不同的操作,具体取决于哪个指标过滤器触发它。在 lambda 函数中(在 python 中)我怎么知道哪个度量过滤器触发它?
【问题讨论】:
标签: aws-lambda amazon-cloudwatchlogs
我刚开始学习 aws,我已经创建了几个 cloudwatch log 自定义指标过滤器并订阅了相同的 lambda 函数,但我想让我的 lambda 函数执行不同的操作,具体取决于哪个指标过滤器触发它。在 lambda 函数中(在 python 中)我怎么知道哪个度量过滤器触发它?
【问题讨论】:
标签: aws-lambda amazon-cloudwatchlogs
在 Lambda 函数处理程序中,您将拥有一个事件对象,该对象通常包含有关请求的信息。根据documentation,这是base64 编码和压缩的。我想这是因为预计日志会变得相当大。
解压后结构如下:
{ messageType: 'DATA_MESSAGE',
owner: '123456789123',
logGroup: 'testLogGroup',
logStream: 'testLogStream',
subscriptionFilters: [ 'testFilter' ],
logEvents:
[ { id: 'eventId1',
timestamp: 1440442987000,
message: '[ERROR] First test message' },
{ id: 'eventId2',
timestamp: 1440442987001,
message: '[ERROR] Second test message' } ] }
这可以在 CloudWatch Logs 下的 AWS docs 中找到。
您可以检查事件数据中的subscriptionFilters 字段,以检查哪个过滤器触发了 Lambda。
如果您的 Lambda 在 NodeJS 中,您可以编写如下内容:
const zlib = require('zlib');
const YOUR_FILTER = 'filter1';
exports.handler = async (event) => {
const zippedInput = new Buffer(event.awslogs.data, 'base64');
await new Promise((resolve, reject) => {
zlib.gunzip(zippedInput, function (e, buffer) {
const awslogsData = JSON.parse(buffer.toString('utf-8'));
// Conditions on filters to do something
if (awslogsData.subscriptionFilters.includes(YOUR_FILTER)) {
// do something
} else if (awslogsData.subscriptionFilters.includes('your_other_filter')) {
// do something else
}
resolve();
});
})
return 'Hello from Lambda!'
};
【讨论】:
def lambda_handler(event, context): outEvent = str(event['awslogs']['data']) outEvent = gzip.GzipFile(fileobj=StringIO(outEvent.decode('base64','strict'))).read()但它返回以下错误:@ 987654327@如何解决这个错误?
base64.b64decode(outEvent) 之类的操作。