cloud-report
Version:
Collects and analyzes cloud resources
75 lines (74 loc) • 3.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("../../../types");
const base_1 = require("../../base");
class LambdaInvocationsCountAlarmAnalyzer extends base_1.BaseAnalyzer {
analyze(params, fullReport) {
const allAlarms = params.alarms;
if (!allAlarms || !fullReport["aws.lambda"] || !fullReport["aws.lambda"].functions) {
return undefined;
}
const allLambdaFunctions = fullReport["aws.lambda"].functions;
const lambda_invocations_count_alarm = {
type: types_1.CheckAnalysisType.OperationalExcellence,
};
lambda_invocations_count_alarm.what = "Are alarms are enabled for Lambda function based on invocation count?";
lambda_invocations_count_alarm.why = `It is important to set invocation count alarm for all Lambda functions
as if there is any bug in the code then Lambda functions can be
triggered continuously in a loop and eventually you will get a huge AWS bill.`;
lambda_invocations_count_alarm.recommendation = `Recommended to set invocation
alarm for all the Lambda functions.`;
lambda_invocations_count_alarm.benchmark = ['all'];
const allRegionsAnalysis = {};
for (const region in allLambdaFunctions) {
const regionLambdaFunctions = allLambdaFunctions[region];
const regionAlarms = allAlarms[region];
const alarmsMapByLambdaFunction = this.mapAlarmsByLambdaFunction(regionAlarms);
allRegionsAnalysis[region] = [];
for (const lambdaFunction of regionLambdaFunctions) {
const alarmAnalysis = {};
const lambdaFunctionAlarms = alarmsMapByLambdaFunction[lambdaFunction.FunctionName];
alarmAnalysis.resource = { lambdaFunction, alarms: lambdaFunctionAlarms };
alarmAnalysis.resourceSummary = {
name: "LambdaFunction",
value: lambdaFunction.FunctionName,
};
if (this.isInvocationAlarmPresent(lambdaFunctionAlarms)) {
alarmAnalysis.severity = types_1.SeverityStatus.Good;
alarmAnalysis.message = "Invocations count alarm is enabled";
}
else {
alarmAnalysis.severity = types_1.SeverityStatus.Warning;
alarmAnalysis.message = "Invocations count alarm is not enabled";
alarmAnalysis.action = "Set Invocations count alarm";
}
allRegionsAnalysis[region].push(alarmAnalysis);
}
}
lambda_invocations_count_alarm.regions = allRegionsAnalysis;
return { lambda_invocations_count_alarm };
}
mapAlarmsByLambdaFunction(alarms) {
return alarms.reduce((alarmsMap, alarm) => {
if (alarm.Namespace === "AWS/Lambda" && alarm.Dimensions) {
const lambdaFunctionDimension = alarm.Dimensions.find((dimension) => {
return dimension.Name === "FunctionName";
});
if (lambdaFunctionDimension && lambdaFunctionDimension.Value) {
alarmsMap[lambdaFunctionDimension.Value] = alarmsMap[lambdaFunctionDimension.Value] || [];
alarmsMap[lambdaFunctionDimension.Value].push(alarm);
}
}
return alarmsMap;
}, {});
}
isInvocationAlarmPresent(alarms) {
return alarms && alarms.some((alarm) => {
return alarm.ActionsEnabled &&
alarm.AlarmActions &&
alarm.AlarmActions.length &&
alarm.MetricName === "Invocations";
});
}
}
exports.LambdaInvocationsCountAlarmAnalyzer = LambdaInvocationsCountAlarmAnalyzer;