UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

75 lines (74 loc) 3.91 kB
"use strict"; 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;