github.com/mweagle/Sparta@v1.15.0/decorator/alarm.go (about) 1 package decorator 2 3 import ( 4 "fmt" 5 6 sparta "github.com/mweagle/Sparta" 7 gocf "github.com/mweagle/go-cloudformation" 8 "github.com/sirupsen/logrus" 9 ) 10 11 // CloudWatchErrorAlarmDecorator returns a TemplateDecoratorHookFunc 12 // that associates a CloudWatch Lambda Error count alarm with the given 13 // lambda function. The four parameters are periodWindow, minutes per period 14 // the strict lower bound value, and the SNS topic to which alerts should be 15 // sent. See the CloudWatch alarm resource type in the official 16 // AWS documentation at https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html 17 // for more information 18 func CloudWatchErrorAlarmDecorator(periodWindow int, 19 minutesPerPeriod int, 20 thresholdGreaterThanOrEqualToValue int, 21 snsTopic gocf.Stringable) sparta.TemplateDecoratorHookFunc { 22 alarmDecorator := func(serviceName string, 23 lambdaResourceName string, 24 lambdaResource gocf.LambdaFunction, 25 resourceMetadata map[string]interface{}, 26 S3Bucket string, 27 S3Key string, 28 buildID string, 29 template *gocf.Template, 30 context map[string]interface{}, 31 logger *logrus.Logger) error { 32 33 periodInSeconds := minutesPerPeriod * 60 34 35 alarm := &gocf.CloudWatchAlarm{ 36 AlarmName: gocf.Join("", 37 gocf.String("ERROR Alarm for "), 38 gocf.Ref(lambdaResourceName)), 39 AlarmDescription: gocf.Join(" ", 40 gocf.String("ERROR count for AWS Lambda function"), 41 gocf.Ref(lambdaResourceName), 42 gocf.String("( Stack:"), 43 gocf.Ref("AWS::StackName"), 44 gocf.String(") is greater than"), 45 gocf.String(fmt.Sprintf("%d", thresholdGreaterThanOrEqualToValue)), 46 gocf.String("over the last"), 47 gocf.String(fmt.Sprintf("%d", periodInSeconds)), 48 gocf.String("seconds"), 49 ), 50 MetricName: gocf.String("Errors"), 51 Namespace: gocf.String("AWS/Lambda"), 52 Statistic: gocf.String("Sum"), 53 Period: gocf.Integer(int64(periodInSeconds)), 54 EvaluationPeriods: gocf.Integer(int64(periodWindow)), 55 Threshold: gocf.Integer(int64(thresholdGreaterThanOrEqualToValue)), 56 ComparisonOperator: gocf.String("GreaterThanOrEqualToThreshold"), 57 Dimensions: &gocf.CloudWatchAlarmDimensionList{ 58 gocf.CloudWatchAlarmDimension{ 59 Name: gocf.String("FunctionName"), 60 Value: gocf.Ref(lambdaResourceName).String(), 61 }, 62 }, 63 TreatMissingData: gocf.String("notBreaching"), 64 AlarmActions: gocf.StringList( 65 snsTopic, 66 ), 67 } 68 // Create the resource, add it... 69 alarmResourceName := sparta.CloudFormationResourceName("Alarm", 70 lambdaResourceName) 71 template.AddResource(alarmResourceName, alarm) 72 return nil 73 } 74 return sparta.TemplateDecoratorHookFunc(alarmDecorator) 75 }