2016-08-02 3 views
2

X 수의 SQS 대기열이있을 경우 ApproximateNumberOfMessages를 하나의 CloudWatch Metric으로 어떻게 집계 할 수 있습니까?AWS SQS를 집계하는 방법 ApproximateNumberOfMessages

대기열에있는 메시지 수에 따라 자동 크기 조정 그룹 배율을 갖고 싶습니다. 여러 개의 CloudWatch Alarm (각 대기열에 하나씩)을 사용하면 하나의 대기열이 비어 있고 다른 대기열은 "가득 찰"때 문제가 발생합니다.

답변

5

내가 달성 한 방법은 AWS Lambda를 Node.js와 함께 사용하는 것입니다. CloudWatch 이벤트 트리거를 추가하여 매분마다 람다 함수를 실행했습니다. 이 쿼리는 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 개 이상의 큐를 처리하기 위해 최적화 할 수 있습니다 아마 비동기 폭포 혜택을 누릴 수 있습니다.

EDIT : 약속을 사용하도록 업데이트되었습니다.

EDIT2 : CloudWatch 메트릭의 큐 이름 연결

관련 문제