给定X个SQS队列,如何将ApproximateNumberOfMessages聚合到一个CloudWatch指标中? 我希望根据队列中有多少消息来设置自动缩放组.使用多个CloudWatch警报(每个队列一个)会导致问题,因为一个队列将
我希望根据队列中有多少消息来设置自动缩放组.使用多个CloudWatch警报(每个队列一个)会导致问题,因为一个队列将为空,而其他队列为“已满”.
我实现这一目标的方法是将AWS Lambda与Node.js一起使用.我添加了一个CloudWatch Event触发器,每分钟运行一次lambda函数.这将查询sqs队列,然后创建一个自定义CloudWatch指标,然后您可以使用该指标来扩展自动缩放组.var AWS = require('aws-sdk'); var sqs = new AWS.SQS(); var cloudWatch = new AWS.CloudWatch(); var queueUrls = ['https://sqs.REGION.amazonaws.com/ACCOUNT-NUMBER/queueUrl1','https://sqs.REGION.amazonaws.com/ACCOUNT-NUMBER/queueUrl2']; exports.handler = (event, context, callback) => { var fn = function (url) { return new Promise(resolve => { var sqsParams = { AttributeNames: ['ApproximateNumberOfMessages'], QueueUrl: url }; sqs.getQueueAttributes(sqsParams, function(err,data){ if(err) { console.log(err,err.stack); context.fail(err); } else { resolve({name: url.split('/').pop(), messageCount: parseInt(data.Attributes.ApproximateNumberOfMessages)}); } }); }); }; var actions = queueUrls.map(fn); Promise.all(actions).then(function(queues) { var messageCount = queues.map(function(m){return m.messageCount;}); var queueNames = queues.map(function(n){return n.name;}).join(); var metricParams = { MetricData:[{ MetricName: 'ApproximateNumberOfMessages', Dimensions:[{ Name: 'QueueName', Value: queueNames }], Unit: 'Count', StatisticValues: { Maximum: Math.max.apply(Math, messageCount), Minimum: Math.min.apply(Math, messageCount), SampleCount: queues.length, Sum: messageCount.reduce((pv, cv) => pv+cv, 0) } }], Namespace: 'AWS/SQS' }; cloudWatch.putMetricData(metricParams, function(err, metricData){ if(err) console.log(err,err.stack); else console.log(metricData); }); }); };
显然可以优化此代码以处理2个以上的队列,并且可能可以从异步瀑布中受益.
编辑:更新以使用承诺.
EDIT2:连接CloudWatch Metric的队列名称