diff --git a/terraform/main.tf b/terraform/main.tf index ae2b657..08ddf7f 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -3,15 +3,27 @@ provider "aws" { } module "alpr_counts" { - module_name = "alpr_counts" - source = "./modules/alpr_counts" + module_name = "alpr_counts" + source = "./modules/alpr_counts" deflock_stats_bucket = var.deflock_stats_bucket - rate = "rate(60 minutes)" + rate = "rate(60 minutes)" + sns_topic_arn = aws_sns_topic.lambda_alarms.arn } module "alpr_clusters" { - module_name = "alpr_clusters" - source = "./modules/alpr_clusters" - deflock_cdn_bucket = var.deflock_cdn_bucket - rate = "rate(1 hour)" + module_name = "alpr_clusters" + source = "./modules/alpr_clusters" + deflock_cdn_bucket = var.deflock_cdn_bucket + rate = "rate(1 hour)" + sns_topic_arn = aws_sns_topic.lambda_alarms.arn +} + +resource "aws_sns_topic" "lambda_alarms" { + name = "lambda_alarms_topic" +} + +resource "aws_sns_topic_subscription" "sms_subscription" { + topic_arn = aws_sns_topic.lambda_alarms.arn + protocol = "sms" + endpoint = var.alarm_phone_number } diff --git a/terraform/modules/alpr_clusters/main.tf b/terraform/modules/alpr_clusters/main.tf index 51529dd..fde1d39 100644 --- a/terraform/modules/alpr_clusters/main.tf +++ b/terraform/modules/alpr_clusters/main.tf @@ -89,3 +89,23 @@ resource "aws_cloudwatch_log_group" "lambda_log_group" { name = "/aws/lambda/${aws_lambda_function.overpass_lambda.function_name}" retention_in_days = 14 } + +resource "aws_sns_topic" "lambda_alarms" { + name = "${var.module_name}_lambda_alarms" +} + +resource "aws_cloudwatch_metric_alarm" "lambda_error_alarm" { + alarm_name = "${var.module_name}_execution_error" + alarm_description = "An error has occurred while executing the ${var.module_name} Lambda" + namespace = "AWS/Lambda" + metric_name = "Errors" + dimensions = { + FunctionName = aws_lambda_function.overpass_lambda.function_name + } + statistic = "Sum" + period = 86400 # 1 day + evaluation_periods = 1 + threshold = 0 + comparison_operator = "GreaterThanThreshold" + alarm_actions = [var.sns_topic_arn] +} diff --git a/terraform/modules/alpr_clusters/variables.tf b/terraform/modules/alpr_clusters/variables.tf index 7d1614d..b70fe8c 100644 --- a/terraform/modules/alpr_clusters/variables.tf +++ b/terraform/modules/alpr_clusters/variables.tf @@ -9,3 +9,8 @@ variable "deflock_cdn_bucket" { variable "rate" { description = "Rate at which to run the Lambda function" } + +variable "sns_topic_arn" { + description = "The ARN of the SNS topic for Lambda alarms" + type = string +} diff --git a/terraform/modules/alpr_counts/main.tf b/terraform/modules/alpr_counts/main.tf index d800917..253759c 100644 --- a/terraform/modules/alpr_counts/main.tf +++ b/terraform/modules/alpr_counts/main.tf @@ -120,3 +120,22 @@ resource "aws_iam_role_policy_attachment" "lambda_cloudwatch_logs_attachment" { role = aws_iam_role.lambda_role.name policy_arn = aws_iam_policy.lambda_cloudwatch_logs_policy.arn } + +# Alarms for Failure + +resource "aws_cloudwatch_metric_alarm" "lambda_error_alarm" { + alarm_name = "${var.module_name}_execution_error" + alarm_description = "An error has occurred while executing the ${var.module_name} Lambda" + comparison_operator = "GreaterThanThreshold" + evaluation_periods = 1 + metric_name = "Errors" + namespace = "AWS/Lambda" + period = 86400 # 1 day + statistic = "Sum" + threshold = 0 + dimensions = { + FunctionName = aws_lambda_function.overpass_lambda.function_name + } + + alarm_actions = [var.sns_topic_arn] +} diff --git a/terraform/modules/alpr_counts/variables.tf b/terraform/modules/alpr_counts/variables.tf index 4363d8b..4ff54c2 100644 --- a/terraform/modules/alpr_counts/variables.tf +++ b/terraform/modules/alpr_counts/variables.tf @@ -26,3 +26,8 @@ variable "aws_account_id" { type = string default = "912821578123" } + +variable "sns_topic_arn" { + description = "The ARN of the SNS topic for Lambda alarms" + type = string +} diff --git a/terraform/variables.tf b/terraform/variables.tf index 28ab153..5bb35e1 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -7,3 +7,8 @@ variable "deflock_cdn_bucket" { description = "S3 bucket for the CDN" default = "cdn.deflock.me" } + +variable "alarm_phone_number" { + description = "Phone number to receive alarm notifications" + # intentionally left blank since this file is checked into git +}