UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

70 lines (69 loc) 3.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const types_1 = require("../../../types"); const cloudfront_1 = require("../../../utils/aws/cloudfront"); const base_1 = require("../../base"); class CloudFront5xxAlarmsAnalyzer extends base_1.BaseAnalyzer { analyze(params, fullReport) { const allDistributions = params.distributions; if (!allDistributions || !fullReport["aws.cloudwatch"] || !fullReport["aws.cloudwatch"].alarms) { return undefined; } const allAlarms = fullReport["aws.cloudwatch"].alarms; const distribution_5xx_errors_alarms = { type: types_1.CheckAnalysisType.OperationalExcellence }; distribution_5xx_errors_alarms.what = "Are alarms are enabled for Distribution 5XX errors?"; distribution_5xx_errors_alarms.why = `It is important to set alarms for 5XX Errors as otherwise you won't be aware when the application is failing.`; distribution_5xx_errors_alarms.recommendation = `Recommended to set alarm for 5XX Errors to take appropriative action.`; distribution_5xx_errors_alarms.benchmark = ['all']; const allDistributionsAnalysis = []; for (const distribution of allDistributions) { const alarms = allAlarms["us-east-1"]; const alarmsMapByDistribution = this.mapAlarmsByDistribution(alarms); const alarmAnalysis = {}; const distributionAlarms = alarmsMapByDistribution[distribution.Id]; alarmAnalysis.resource = { distribution, alarms: distributionAlarms }; const distributionAlias = cloudfront_1.CloudFrontUtil.getAliasName(distribution); alarmAnalysis.resourceSummary = { name: "CloudFrontDistribution", value: distributionAlias ? `${distributionAlias} | ${distribution.Id}` : distribution.Id, }; if (this.is5xxAlarmsPresent(distributionAlarms)) { alarmAnalysis.severity = types_1.SeverityStatus.Good; alarmAnalysis.message = "5XX errors alarms are enabled."; } else { alarmAnalysis.severity = types_1.SeverityStatus.Failure; alarmAnalysis.message = "5XX errors alarms are not enabled."; alarmAnalysis.action = "Set 5XX errors alarms."; } allDistributionsAnalysis.push(alarmAnalysis); } distribution_5xx_errors_alarms.regions = { global: allDistributionsAnalysis }; return { distribution_5xx_errors_alarms }; } mapAlarmsByDistribution(alarms) { return alarms.reduce((alarmsMap, alarm) => { if (alarm.Namespace === "AWS/CloudFront" && alarm.Dimensions) { const distributionDimension = alarm.Dimensions.find((dimension) => { return dimension.Name === "DistributionId"; }); if (distributionDimension && distributionDimension.Value) { alarmsMap[distributionDimension.Value] = alarmsMap[distributionDimension.Value] || []; alarmsMap[distributionDimension.Value].push(alarm); } } return alarmsMap; }, {}); } is5xxAlarmsPresent(alarms) { return alarms && alarms.some((alarm) => { return alarm.ActionsEnabled && alarm.AlarmActions && alarm.AlarmActions.length && alarm.MetricName.toLowerCase().includes("5xx"); }); } } exports.CloudFront5xxAlarmsAnalyzer = CloudFront5xxAlarmsAnalyzer;