Skip to content

Commit 2d8262b

Browse files
committed
wip
1 parent fb25a72 commit 2d8262b

File tree

6 files changed

+101
-28
lines changed

6 files changed

+101
-28
lines changed

aws/alarms/cloudwatch_app.tf

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -404,19 +404,55 @@ resource "aws_cloudwatch_metric_alarm" "vault_data_integrity_check_lambda_iterat
404404
// Cloudwatch log subscription filters
405405

406406
locals {
407-
map_of_lambda_log_group = {
408-
audit_logs = var.lambda_audit_logs_log_group_name,
409-
audit_logs_archiver = var.lambda_audit_logs_archiver_log_group_name,
410-
form_archiver = var.lambda_form_archiver_log_group_name,
411-
nagware = var.lambda_nagware_log_group_name,
412-
reliability = var.lambda_reliability_log_group_name,
413-
reliability_dlq_consumer = var.lambda_reliability_dlq_consumer_log_group_name,
414-
response_archiver = var.lambda_response_archiver_log_group_name,
415-
submission = var.lambda_submission_log_group_name,
416-
vault_integrity = var.lambda_vault_integrity_log_group_name,
417-
api_end_to_end_test = var.lambda_api_end_to_end_test_log_group_name,
418-
file_upload_processor = var.lambda_file_upload_processor_log_group_name,
419-
file_upload_cleanup = var.lambda_file_upload_cleanup_log_group_name
407+
map_of_forms_app_lambda = {
408+
audit_logs = {
409+
function_name = var.todo
410+
log_group_name = var.lambda_audit_logs_log_group_name
411+
}
412+
audit_logs_archiver = {
413+
function_name = var.todo
414+
log_group_name = var.lambda_audit_logs_archiver_log_group_name
415+
}
416+
form_archiver = {
417+
function_name = var.todo
418+
log_group_name = var.lambda_form_archiver_log_group_name
419+
}
420+
nagware = {
421+
function_name = var.todo
422+
log_group_name = var.lambda_nagware_log_group_name
423+
}
424+
reliability = {
425+
function_name = var.todo
426+
log_group_name = var.lambda_reliability_log_group_name
427+
}
428+
reliability_dlq_consumer = {
429+
function_name = var.todo
430+
log_group_name = var.lambda_reliability_dlq_consumer_log_group_name
431+
}
432+
response_archiver = {
433+
function_name = var.todo
434+
log_group_name = var.lambda_response_archiver_log_group_name
435+
}
436+
submission = {
437+
function_name = var.todo
438+
log_group_name = var.lambda_submission_log_group_name
439+
}
440+
vault_integrity = {
441+
function_name = var.todo
442+
log_group_name = var.lambda_vault_integrity_log_group_name
443+
}
444+
api_end_to_end_test = {
445+
function_name = var.todo
446+
log_group_name = var.lambda_api_end_to_end_test_log_group_name
447+
}
448+
file_upload_processor = {
449+
function_name = var.todo
450+
log_group_name = var.lambda_file_upload_processor_log_group_name
451+
}
452+
file_upload_cleanup = {
453+
function_name = var.todo
454+
log_group_name = var.lambda_file_upload_cleanup_log_group_name
455+
}
420456
}
421457
}
422458

@@ -441,25 +477,31 @@ resource "aws_cloudwatch_log_subscription_filter" "forms_app_log_stream" {
441477
}
442478

443479
resource "aws_cloudwatch_log_subscription_filter" "lambda_error_detection" {
444-
for_each = local.map_of_lambda_log_group
480+
for_each = local.map_of_forms_app_lambda
445481
name = "error_detection_in_${each.key}_lambda_logs"
446-
log_group_name = each.value
482+
log_group_name = each.value.log_group_name
447483
filter_pattern = "{($.level = \"warn\") || ($.level = \"error\")}"
448484
destination_arn = aws_lambda_function.notify_slack.arn
449485
}
450486

451-
/*
452-
* Lambda timeout detection
453-
* Note: We used the second and final lambda subscription filter to detect function time out.
454-
* If we ever need to create a new subscription filter we will have to rework the way we parse logs to extract errors and time out logs.
455-
*/
487+
resource "aws_cloudwatch_metric_alarm" "forms_app_lambda_error_detection" {
488+
for_each = local.map_of_forms_app_lambda
489+
alarm_name = "${each.key}-lambda-error-detection"
490+
alarm_description = "Detects when the ${each.key} lambda function logs/throws an error or times out"
491+
comparison_operator = "GreaterThanThreshold"
492+
evaluation_periods = "1"
493+
metric_name = "Errors"
494+
namespace = "AWS/Lambda"
495+
period = "60"
496+
statistic = "Sum"
497+
threshold = "0"
498+
treat_missing_data = "notBreaching"
456499

457-
resource "aws_cloudwatch_log_subscription_filter" "lambda_timeout_detection" {
458-
for_each = local.map_of_lambda_log_group
459-
name = "timeout_detection_in_${each.key}_lambda_logs"
460-
log_group_name = each.value
461-
filter_pattern = "Task timed out"
462-
destination_arn = aws_lambda_function.notify_slack.arn
500+
dimensions = {
501+
FunctionName = each.value.function_name
502+
}
503+
504+
alarm_actions = [var.sns_topic_alert_critical_arn]
463505
}
464506

465507
// Allow Cloudwatch filters to trigger Lambda

aws/alarms/cloudwatch_global.tf

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,23 @@ resource "aws_cloudwatch_metric_alarm" "ip_added_to_block_list" {
1111
alarm_description = "WAF - IP(s) Has been added to the dynamic block list."
1212

1313
alarm_actions = [var.sns_topic_alert_warning_arn]
14-
}
14+
}
15+
16+
resource "aws_cloudwatch_metric_alarm" "waf_ipv4_blocklist_lambda_error_detection" {
17+
alarm_name = "${var.waf_ipv4_blocklist_lambda_function_name}-lambda-error-detection"
18+
alarm_description = "Detects when the ${var.var.waf_ipv4_blocklist_lambda_function_name} lambda function logs/throws an error or times out"
19+
comparison_operator = "GreaterThanThreshold"
20+
evaluation_periods = "1"
21+
metric_name = "Errors"
22+
namespace = "AWS/Lambda"
23+
period = "60"
24+
statistic = "Sum"
25+
threshold = "0"
26+
treat_missing_data = "notBreaching"
27+
28+
dimensions = {
29+
FunctionName = var.waf_ipv4_blocklist_lambda_function_name
30+
}
31+
32+
alarm_actions = [var.sns_topic_alert_critical_arn]
33+
}

aws/alarms/inputs.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ variable "waf_ipv4_new_blocked_ip_metric_filter_namespace" {
316316
type = string
317317
}
318318

319+
variable "waf_ipv4_blocklist_lambda_function_name" {
320+
description = "Name of WAF Blocklist associated Lambda"
321+
type = string
322+
}
323+
319324
variable "unhealthy_host_count_for_target_group_1_alarm_arn" {
320325
description = "ARN of unhealthy host count alarm for target group 1"
321326
type = string

aws/load_balancer/outputs.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ output "waf_ipv4_new_blocked_ip_metric_filter_namespace" {
6868
value = module.waf_ip_blocklist.ipv4_new_blocked_ip_metric_filter_namespace
6969
}
7070

71+
output "waf_ipv4_blocklist_lambda_function_name" {
72+
description = "Name of WAF Blocklist associated Lambda"
73+
value = module.waf_ip_blocklist.ipv4_lambda_function_name
74+
}
75+
7176
output "unhealthy_host_count_for_target_group_1_alarm_arn" {
7277
description = "ARN of unhealthy host count alarm for target group 1"
7378
value = aws_cloudwatch_metric_alarm.UnHealthyHostCount-TargetGroup1.arn

aws/load_balancer/waf.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ resource "aws_wafv2_regex_pattern_set" "valid_maintenance_mode_uri_paths" {
793793
# that crosses a block threshold will be added to the blocklist.
794794
#
795795
module "waf_ip_blocklist" {
796-
source = "github.com/cds-snc/terraform-modules//waf_ip_blocklist?ref=ae656dd178b8086ae4b422da6b310550fa1d86c0" # v10.8.2
796+
source = "github.com/cds-snc/terraform-modules//waf_ip_blocklist?ref=5df29471c3868586b55149a72275a0e3b29fb3b0" # v10.11.1
797797

798798
service_name = "forms_app"
799799
athena_database_name = "access_logs"

env/cloud/alarms/terragrunt.hcl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ dependency "load_balancer" {
4545
lb_target_group_api_arn_suffix = null
4646
waf_ipv4_new_blocked_ip_metric_filter_name = "default"
4747
waf_ipv4_new_blocked_ip_metric_filter_namespace = "default"
48+
waf_ipv4_blocklist_lambda_function_name = "ipv4_blocklist_forms_app"
4849
unhealthy_host_count_for_target_group_1_alarm_arn = ""
4950
unhealthy_host_count_for_target_group_2_alarm_arn = ""
5051
}
@@ -201,6 +202,7 @@ inputs = {
201202
lb_api_target_group_arn_suffix = dependency.load_balancer.outputs.lb_target_group_api_arn_suffix
202203
waf_ipv4_new_blocked_ip_metric_filter_name = dependency.load_balancer.outputs.waf_ipv4_new_blocked_ip_metric_filter_name
203204
waf_ipv4_new_blocked_ip_metric_filter_namespace = dependency.load_balancer.outputs.waf_ipv4_new_blocked_ip_metric_filter_namespace
205+
waf_ipv4_blocklist_lambda_function_name = dependency.load_balancer.outputs.waf_ipv4_blocklist_lambda_function_name
204206
unhealthy_host_count_for_target_group_1_alarm_arn = dependency.load_balancer.outputs.unhealthy_host_count_for_target_group_1_alarm_arn
205207
unhealthy_host_count_for_target_group_2_alarm_arn = dependency.load_balancer.outputs.unhealthy_host_count_for_target_group_2_alarm_arn
206208

0 commit comments

Comments
 (0)