From 9bec1c01354c3f2178cf75130c8ded682ab68741 Mon Sep 17 00:00:00 2001 From: kujon Date: Tue, 2 Jul 2019 16:11:10 +0100 Subject: [PATCH 1/5] Adding support for mentions --- .env.example | 3 ++- config.js | 4 +++- index.js | 10 +++++++++- package.json | 2 +- scripts/deploy.sh | 4 ++-- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index 0d719c0..16e04b7 100644 --- a/.env.example +++ b/.env.example @@ -3,8 +3,9 @@ UNENCRYPTED_HOOK_URL= AWS_FUNCTION_NAME= AWS_REGION=eu-west-1 AWS_ROLE="arn:aws:iam::123456789123:role/lambda_exec_role" +MENTION=channel # You can get AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY here: https://console.aws.amazon.com/iam/home#/users # Click on user -> Security credentials -> Access keys -> Create access key AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= \ No newline at end of file +AWS_SECRET_ACCESS_KEY= diff --git a/config.js b/config.js index ce51bc7..f3e5821 100644 --- a/config.js +++ b/config.js @@ -2,6 +2,8 @@ module.exports = { kmsEncryptedHookUrl: process.env.KMS_ENCRYPTED_HOOK_URL, // encrypted slack webhook url unencryptedHookUrl: process.env.UNENCRYPTED_HOOK_URL, // unencrypted slack webhook url + mention: process.env.MENTION, + services: { elasticbeanstalk: { // text in the sns message or topicname to match on to process this service type @@ -27,4 +29,4 @@ module.exports = { } } -} \ No newline at end of file +} diff --git a/index.js b/index.js index c61ab4e..dd6e219 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,15 @@ var config = require('./config'); var _ = require('lodash'); var hookUrl; -var baseSlackMessage = {} +var baseSlackMessage = { + attachments: [ + { + fields: config.mention ? [ + { title: "Mention", value: "", short: true } + ] : [] + } + ] +} var postMessage = function(message, callback) { var body = JSON.stringify(message); diff --git a/package.json b/package.json index 6e1e021..15d9e24 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lambda-cloudwatch-slack", "version": "0.3.0", "description": "Better Slack notifications for AWS CloudWatch", - "authors": [ + "authors": [ "Christopher Reichert ", "Cody Reichert ", "Alexandr Promakh " diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 8c49fc7..06a626c 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -2,5 +2,5 @@ NODE_LAMBDA=./node_modules/node-lambda/bin/node-lambda test -s $NODE_LAMBDA || { echo "node-lambda not installed. Run 'npm install' first."; exit 1; } mkdir -p tmp -cat .env | grep HOOK_URL > ./tmp/deploy.env -$NODE_LAMBDA deploy --configFile ./tmp/deploy.env \ No newline at end of file +cat .env | grep -v AWS > ./tmp/deploy.env +$NODE_LAMBDA deploy --configFile ./tmp/deploy.env From d8e1be203cc8145c72942fe524b88eefddd6d5d3 Mon Sep 17 00:00:00 2001 From: kujon Date: Tue, 2 Jul 2019 16:21:17 +0100 Subject: [PATCH 2/5] Allowing for full slack mention syntax --- .env.example | 3 ++- index.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 16e04b7..1388347 100644 --- a/.env.example +++ b/.env.example @@ -3,7 +3,8 @@ UNENCRYPTED_HOOK_URL= AWS_FUNCTION_NAME= AWS_REGION=eu-west-1 AWS_ROLE="arn:aws:iam::123456789123:role/lambda_exec_role" -MENTION=channel +# See message formatting for a guide on how to format mentions https://api.slack.com/docs/message-formatting +MENTION= # You can get AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY here: https://console.aws.amazon.com/iam/home#/users # Click on user -> Security credentials -> Access keys -> Create access key diff --git a/index.js b/index.js index dd6e219..9e49d7b 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,7 @@ var baseSlackMessage = { attachments: [ { fields: config.mention ? [ - { title: "Mention", value: "", short: true } + { title: "Mention", value: config.mention, short: true } ] : [] } ] From 944c203c936e2c2d205c613077acadfcf2281900 Mon Sep 17 00:00:00 2001 From: kujon Date: Tue, 2 Jul 2019 17:46:37 +0100 Subject: [PATCH 3/5] Added support for linking to the log groups --- index.js | 121 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 51 deletions(-) diff --git a/index.js b/index.js index 9e49d7b..9687e94 100644 --- a/index.js +++ b/index.js @@ -92,7 +92,7 @@ var handleElasticBeanstalk = function(event, context) { ] }; - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; var handleCodeDeploy = function(event, context) { @@ -139,7 +139,7 @@ var handleCodeDeploy = function(event, context) { ] }; - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; var handleCodePipeline = function(event, context) { @@ -198,7 +198,7 @@ var handleCodePipeline = function(event, context) { ] }; - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; var handleElasticache = function(event, context) { @@ -232,7 +232,7 @@ var handleElasticache = function(event, context) { } ] }; - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; var handleCloudWatch = function(event, context) { @@ -242,50 +242,67 @@ var handleCloudWatch = function(event, context) { var subject = "AWS CloudWatch Notification"; var alarmName = message.AlarmName; var metricName = message.Trigger.MetricName; + var metricNamespace = message.Trigger.Namespace; var oldState = message.OldStateValue; var newState = message.NewStateValue; var alarmDescription = message.AlarmDescription; var alarmReason = message.NewStateReason; var trigger = message.Trigger; var color = "warning"; + var logs = new AWS.CloudWatchLogs({ region: region }); - if (message.NewStateValue === "ALARM") { + var metricFilters = logs + .describeMetricFilters({ metricName: metricName, metricNamespace: metricNamespace }) + .promise(); + + return metricFilters.then(data => { + if (message.NewStateValue === "ALARM") { color = "danger"; - } else if (message.NewStateValue === "OK") { + } else if (message.NewStateValue === "OK") { color = "good"; - } + } - var slackMessage = { - text: "*" + subject + "*", - attachments: [ - { - "color": color, - "fields": [ - { "title": "Alarm Name", "value": alarmName, "short": true }, - { "title": "Alarm Description", "value": alarmDescription, "short": false}, - { - "title": "Trigger", - "value": trigger.Statistic + " " - + metricName + " " - + trigger.ComparisonOperator + " " - + trigger.Threshold + " for " - + trigger.EvaluationPeriods + " period(s) of " - + trigger.Period + " seconds.", + var cloudwatchURLBase = "https://console.aws.amazon.com/cloudwatch/home?region=" + region + + var logGroupLinks = data.metricFilters + .map(filter => ({ + "title": filter.filterName + " logs source", + "value": cloudwatchURLBase + "#logEventViewer:group=" + encodeURIComponent(filter.logGroupName) + ";filter=" + encodeURIComponent(filter.filterPattern) + ";start=PT" + trigger.EvaluationPeriods + "S", + "short": false + })) + + var slackMessage = { + text: "*" + subject + "*", + attachments: [ + { + "color": color, + "fields": [ + { "title": "Alarm Name", "value": alarmName, "short": true }, + { "title": "Alarm Description", "value": alarmDescription, "short": false}, + { + "title": "Trigger", + "value": trigger.Statistic + " " + + metricName + " " + + trigger.ComparisonOperator + " " + + trigger.Threshold + " for " + + trigger.EvaluationPeriods + " period(s) of " + + trigger.Period + " seconds.", + "short": false + }, + { "title": "Old State", "value": oldState, "short": true }, + { "title": "Current State", "value": newState, "short": true }, + { + "title": "Link to Alarm", + "value": cloudwatchURLBase + "#alarm:alarmFilter=ANY;name=" + encodeURIComponent(alarmName), "short": false - }, - { "title": "Old State", "value": oldState, "short": true }, - { "title": "Current State", "value": newState, "short": true }, - { - "title": "Link to Alarm", - "value": "https://console.aws.amazon.com/cloudwatch/home?region=" + region + "#alarm:alarmFilter=ANY;name=" + encodeURIComponent(alarmName), - "short": false - } - ], - "ts": timestamp - } - ] - }; - return _.merge(slackMessage, baseSlackMessage); + } + ].concat(logGroupLinks), + "ts": timestamp + } + ] + }; + return _.merge(slackMessage, baseSlackMessage); + }); }; var handleAutoScaling = function(event, context) { @@ -316,7 +333,7 @@ var handleAutoScaling = function(event, context) { } ] }; - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; var handleCatchAll = function(event, context) { @@ -358,7 +375,7 @@ var handleCatchAll = function(event, context) { ] } - return _.merge(slackMessage, baseSlackMessage); + return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); } var processEvent = function(event, context) { @@ -403,18 +420,20 @@ var processEvent = function(event, context) { slackMessage = handleCatchAll(event, context); } - postMessage(slackMessage, function(response) { - if (response.statusCode < 400) { - console.info('message posted successfully'); - context.succeed(); - } else if (response.statusCode < 500) { - console.error("error posting message to slack API: " + response.statusCode + " - " + response.statusMessage); - // Don't retry because the error is due to a problem with the request - context.succeed(); - } else { - // Let Lambda retry - context.fail("server error when processing message: " + response.statusCode + " - " + response.statusMessage); - } + slackMessage.then(message => { + postMessage(message, function(response) { + if (response.statusCode < 400) { + console.info('message posted successfully'); + context.succeed(); + } else if (response.statusCode < 500) { + console.error("error posting message to slack API: " + response.statusCode + " - " + response.statusMessage); + // Don't retry because the error is due to a problem with the request + context.succeed(); + } else { + // Let Lambda retry + context.fail("server error when processing message: " + response.statusCode + " - " + response.statusMessage); + } + }); }); }; From 11a875e61d20bc6025cd16ce9493938648688fb5 Mon Sep 17 00:00:00 2001 From: kujon Date: Tue, 2 Jul 2019 18:13:11 +0100 Subject: [PATCH 4/5] Fixed a bug with setting an incorrect time period for logs link --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 9687e94..b9512bc 100644 --- a/index.js +++ b/index.js @@ -267,7 +267,7 @@ var handleCloudWatch = function(event, context) { var logGroupLinks = data.metricFilters .map(filter => ({ "title": filter.filterName + " logs source", - "value": cloudwatchURLBase + "#logEventViewer:group=" + encodeURIComponent(filter.logGroupName) + ";filter=" + encodeURIComponent(filter.filterPattern) + ";start=PT" + trigger.EvaluationPeriods + "S", + "value": cloudwatchURLBase + "#logEventViewer:group=" + encodeURIComponent(filter.logGroupName) + ";filter=" + encodeURIComponent(filter.filterPattern) + ";start=PT" + trigger.Period + "S", "short": false })) From 4c19378f6db09b31b73949760f7b969b51268919 Mon Sep 17 00:00:00 2001 From: Nguyen Lam Phuc Date: Wed, 2 Sep 2020 16:32:14 +0800 Subject: [PATCH 5/5] Make Slack channel name configurable --- config.js | 3 +- index.js | 165 +++++++++++++++++++++++++++--------------------------- 2 files changed, 85 insertions(+), 83 deletions(-) diff --git a/config.js b/config.js index f3e5821..399c62f 100644 --- a/config.js +++ b/config.js @@ -3,13 +3,14 @@ module.exports = { unencryptedHookUrl: process.env.UNENCRYPTED_HOOK_URL, // unencrypted slack webhook url mention: process.env.MENTION, + channel: process.env.CHANNEL, services: { elasticbeanstalk: { // text in the sns message or topicname to match on to process this service type match_text: "ElasticBeanstalkNotifications" }, - cloudwatch: { + cloudwatch: { }, codepipeline: { // text in the sns message or topicname to match on to process this service type diff --git a/index.js b/index.js index b9512bc..a8b7aeb 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ var _ = require('lodash'); var hookUrl; var baseSlackMessage = { + channel: config.channel, attachments: [ { fields: config.mention ? [ @@ -15,7 +16,7 @@ var baseSlackMessage = { ] } -var postMessage = function(message, callback) { +var postMessage = function (message, callback) { var body = JSON.stringify(message); var options = url.parse(hookUrl); options.method = 'POST'; @@ -24,13 +25,13 @@ var postMessage = function(message, callback) { 'Content-Length': Buffer.byteLength(body), }; - var postReq = https.request(options, function(res) { + var postReq = https.request(options, function (res) { var chunks = []; res.setEncoding('utf8'); - res.on('data', function(chunk) { + res.on('data', function (chunk) { return chunks.push(chunk); }); - res.on('end', function() { + res.on('end', function () { var body = chunks.join(''); if (callback) { callback({ @@ -47,8 +48,8 @@ var postMessage = function(message, callback) { postReq.end(); }; -var handleElasticBeanstalk = function(event, context) { - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; +var handleElasticBeanstalk = function (event, context) { + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var subject = event.Records[0].Sns.Subject || "AWS Elastic Beanstalk Notification"; var message = event.Records[0].Sns.Message; @@ -83,11 +84,11 @@ var handleElasticBeanstalk = function(event, context) { attachments: [ { "fields": [ - { "title": "Subject", "value": event.Records[0].Sns.Subject, "short": false}, - { "title": "Message", "value": message, "short": false} + { "title": "Subject", "value": event.Records[0].Sns.Subject, "short": false }, + { "title": "Message", "value": message, "short": false } ], "color": color, - "ts": timestamp + "ts": timestamp } ] }; @@ -95,9 +96,9 @@ var handleElasticBeanstalk = function(event, context) { return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; -var handleCodeDeploy = function(event, context) { +var handleCodeDeploy = function (event, context) { var subject = "AWS CodeDeploy Notification"; - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var snsSubject = event.Records[0].Sns.Subject; var message; var fields = []; @@ -106,9 +107,9 @@ var handleCodeDeploy = function(event, context) { try { message = JSON.parse(event.Records[0].Sns.Message); - if(message.status === "SUCCEEDED"){ + if (message.status === "SUCCEEDED") { color = "good"; - } else if(message.status === "FAILED"){ + } else if (message.status === "FAILED") { color = "danger"; } fields.push({ "title": "Message", "value": snsSubject, "short": false }); @@ -120,7 +121,7 @@ var handleCodeDeploy = function(event, context) { "short": false }); } - catch(e) { + catch (e) { color = "good"; message = event.Records[0].Sns.Message; fields.push({ "title": "Message", "value": snsSubject, "short": false }); @@ -142,9 +143,9 @@ var handleCodeDeploy = function(event, context) { return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; -var handleCodePipeline = function(event, context) { +var handleCodePipeline = function (event, context) { var subject = "AWS CodePipeline Notification"; - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var snsSubject = event.Records[0].Sns.Subject; var message; var fields = []; @@ -155,17 +156,17 @@ var handleCodePipeline = function(event, context) { message = JSON.parse(event.Records[0].Sns.Message); detailType = message['detail-type']; - if(detailType === "CodePipeline Pipeline Execution State Change"){ + if (detailType === "CodePipeline Pipeline Execution State Change") { changeType = ""; - } else if(detailType === "CodePipeline Stage Execution State Change"){ + } else if (detailType === "CodePipeline Stage Execution State Change") { changeType = "STAGE " + message.detail.stage; - } else if(detailType === "CodePipeline Action Execution State Change"){ + } else if (detailType === "CodePipeline Action Execution State Change") { changeType = "ACTION"; } - if(message.detail.state === "SUCCEEDED"){ + if (message.detail.state === "SUCCEEDED") { color = "good"; - } else if(message.detail.state === "FAILED"){ + } else if (message.detail.state === "FAILED") { color = "danger"; } header = message.detail.state + ": CodePipeline " + changeType; @@ -178,7 +179,7 @@ var handleCodePipeline = function(event, context) { "short": false }); } - catch(e) { + catch (e) { color = "good"; message = event.Records[0].Sns.Message; header = message.detail.state + ": CodePipeline " + message.detail.pipeline; @@ -201,15 +202,15 @@ var handleCodePipeline = function(event, context) { return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; -var handleElasticache = function(event, context) { +var handleElasticache = function (event, context) { var subject = "AWS ElastiCache Notification" var message = JSON.parse(event.Records[0].Sns.Message); - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var region = event.Records[0].EventSubscriptionArn.split(":")[3]; var eventname, nodename; var color = "good"; - for(key in message){ + for (key in message) { eventname = key; nodename = message[key]; break; @@ -235,8 +236,8 @@ var handleElasticache = function(event, context) { return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; -var handleCloudWatch = function(event, context) { - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; +var handleCloudWatch = function (event, context) { + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var message = JSON.parse(event.Records[0].Sns.Message); var region = event.Records[0].EventSubscriptionArn.split(":")[3]; var subject = "AWS CloudWatch Notification"; @@ -278,7 +279,7 @@ var handleCloudWatch = function(event, context) { "color": color, "fields": [ { "title": "Alarm Name", "value": alarmName, "short": true }, - { "title": "Alarm Description", "value": alarmDescription, "short": false}, + { "title": "Alarm Description", "value": alarmDescription, "short": false }, { "title": "Trigger", "value": trigger.Statistic + " " @@ -287,7 +288,7 @@ var handleCloudWatch = function(event, context) { + trigger.Threshold + " for " + trigger.EvaluationPeriods + " period(s) of " + trigger.Period + " seconds.", - "short": false + "short": false }, { "title": "Old State", "value": oldState, "short": true }, { "title": "Current State", "value": newState, "short": true }, @@ -297,7 +298,7 @@ var handleCloudWatch = function(event, context) { "short": false } ].concat(logGroupLinks), - "ts": timestamp + "ts": timestamp } ] }; @@ -305,14 +306,14 @@ var handleCloudWatch = function(event, context) { }); }; -var handleAutoScaling = function(event, context) { +var handleAutoScaling = function (event, context) { var subject = "AWS AutoScaling Notification" var message = JSON.parse(event.Records[0].Sns.Message); - var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime()/1000; + var timestamp = (new Date(event.Records[0].Sns.Timestamp)).getTime() / 1000; var eventname, nodename; var color = "good"; - for(key in message){ + for (key in message) { eventname = key; nodename = message[key]; break; @@ -336,49 +337,49 @@ var handleAutoScaling = function(event, context) { return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); }; -var handleCatchAll = function(event, context) { +var handleCatchAll = function (event, context) { - var record = event.Records[0] - var subject = record.Sns.Subject - var timestamp = new Date(record.Sns.Timestamp).getTime() / 1000; - var message = JSON.parse(record.Sns.Message) - var color = "warning"; + var record = event.Records[0] + var subject = record.Sns.Subject + var timestamp = new Date(record.Sns.Timestamp).getTime() / 1000; + var message = JSON.parse(record.Sns.Message) + var color = "warning"; - if (message.NewStateValue === "ALARM") { - color = "danger"; - } else if (message.NewStateValue === "OK") { - color = "good"; - } + if (message.NewStateValue === "ALARM") { + color = "danger"; + } else if (message.NewStateValue === "OK") { + color = "good"; + } - // Add all of the values from the event message to the Slack message description - var description = "" - for(key in message) { + // Add all of the values from the event message to the Slack message description + var description = "" + for (key in message) { - var renderedMessage = typeof message[key] === 'object' - ? JSON.stringify(message[key]) - : message[key] + var renderedMessage = typeof message[key] === 'object' + ? JSON.stringify(message[key]) + : message[key] - description = description + "\n" + key + ": " + renderedMessage - } + description = description + "\n" + key + ": " + renderedMessage + } - var slackMessage = { - text: "*" + subject + "*", - attachments: [ - { - "color": color, - "fields": [ - { "title": "Message", "value": record.Sns.Subject, "short": false }, - { "title": "Description", "value": description, "short": false } - ], - "ts": timestamp - } - ] - } + var slackMessage = { + text: "*" + subject + "*", + attachments: [ + { + "color": color, + "fields": [ + { "title": "Message", "value": record.Sns.Subject, "short": false }, + { "title": "Description", "value": description, "short": false } + ], + "ts": timestamp + } + ] + } return Promise.resolve(_.merge(slackMessage, baseSlackMessage)); } -var processEvent = function(event, context) { +var processEvent = function (event, context) { console.log("sns received:" + JSON.stringify(event, null, 2)); var slackMessage = null; var eventSubscriptionArn = event.Records[0].EventSubscriptionArn; @@ -389,39 +390,39 @@ var processEvent = function(event, context) { try { eventSnsMessage = JSON.parse(eventSnsMessageRaw); } - catch (e) { + catch (e) { } - if(eventSubscriptionArn.indexOf(config.services.codepipeline.match_text) > -1 || eventSnsSubject.indexOf(config.services.codepipeline.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.codepipeline.match_text) > -1){ + if (eventSubscriptionArn.indexOf(config.services.codepipeline.match_text) > -1 || eventSnsSubject.indexOf(config.services.codepipeline.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.codepipeline.match_text) > -1) { console.log("processing codepipeline notification"); - slackMessage = handleCodePipeline(event,context) + slackMessage = handleCodePipeline(event, context) } - else if(eventSubscriptionArn.indexOf(config.services.elasticbeanstalk.match_text) > -1 || eventSnsSubject.indexOf(config.services.elasticbeanstalk.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.elasticbeanstalk.match_text) > -1){ + else if (eventSubscriptionArn.indexOf(config.services.elasticbeanstalk.match_text) > -1 || eventSnsSubject.indexOf(config.services.elasticbeanstalk.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.elasticbeanstalk.match_text) > -1) { console.log("processing elasticbeanstalk notification"); - slackMessage = handleElasticBeanstalk(event,context) + slackMessage = handleElasticBeanstalk(event, context) } - else if(eventSnsMessage && 'AlarmName' in eventSnsMessage && 'AlarmDescription' in eventSnsMessage){ + else if (eventSnsMessage && 'AlarmName' in eventSnsMessage && 'AlarmDescription' in eventSnsMessage) { console.log("processing cloudwatch notification"); - slackMessage = handleCloudWatch(event,context); + slackMessage = handleCloudWatch(event, context); } - else if(eventSubscriptionArn.indexOf(config.services.codedeploy.match_text) > -1 || eventSnsSubject.indexOf(config.services.codedeploy.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.codedeploy.match_text) > -1){ + else if (eventSubscriptionArn.indexOf(config.services.codedeploy.match_text) > -1 || eventSnsSubject.indexOf(config.services.codedeploy.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.codedeploy.match_text) > -1) { console.log("processing codedeploy notification"); - slackMessage = handleCodeDeploy(event,context); + slackMessage = handleCodeDeploy(event, context); } - else if(eventSubscriptionArn.indexOf(config.services.elasticache.match_text) > -1 || eventSnsSubject.indexOf(config.services.elasticache.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.elasticache.match_text) > -1){ + else if (eventSubscriptionArn.indexOf(config.services.elasticache.match_text) > -1 || eventSnsSubject.indexOf(config.services.elasticache.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.elasticache.match_text) > -1) { console.log("processing elasticache notification"); - slackMessage = handleElasticache(event,context); + slackMessage = handleElasticache(event, context); } - else if(eventSubscriptionArn.indexOf(config.services.autoscaling.match_text) > -1 || eventSnsSubject.indexOf(config.services.autoscaling.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.autoscaling.match_text) > -1){ + else if (eventSubscriptionArn.indexOf(config.services.autoscaling.match_text) > -1 || eventSnsSubject.indexOf(config.services.autoscaling.match_text) > -1 || eventSnsMessageRaw.indexOf(config.services.autoscaling.match_text) > -1) { console.log("processing autoscaling notification"); slackMessage = handleAutoScaling(event, context); } - else{ + else { slackMessage = handleCatchAll(event, context); } slackMessage.then(message => { - postMessage(message, function(response) { + postMessage(message, function (response) { if (response.statusCode < 400) { console.info('message posted successfully'); context.succeed(); @@ -437,7 +438,7 @@ var processEvent = function(event, context) { }); }; -exports.handler = function(event, context) { +exports.handler = function (event, context) { if (hookUrl) { processEvent(event, context); } else if (config.unencryptedHookUrl) { @@ -448,7 +449,7 @@ exports.handler = function(event, context) { var cipherText = { CiphertextBlob: encryptedBuf }; var kms = new AWS.KMS(); - kms.decrypt(cipherText, function(err, data) { + kms.decrypt(cipherText, function (err, data) { if (err) { console.log("decrypt error: " + err); processEvent(event, context);