Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
227370c
Add Notificatiosn Dynamodb table and SQS
thiessenp-cds Oct 27, 2025
0edef0b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Oct 27, 2025
ea3a55d
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Oct 28, 2025
f1da004
rename notifications to notification
thiessenp-cds Oct 30, 2025
7765e7b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Nov 3, 2025
fd439f7
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Nov 24, 2025
31afd96
Update terraform formatting
thiessenp-cds Nov 24, 2025
a2ba616
Fix checkov lint error
thiessenp-cds Nov 24, 2025
5eb5369
Skip checkov check
thiessenp-cds Nov 24, 2025
6a75693
SQS notification
thiessenp-cds Nov 25, 2025
6cea62a
Update dynamodb output names
thiessenp-cds Nov 26, 2025
05191ca
Add configuration for notification lambda
thiessenp-cds Nov 26, 2025
b36486b
Update formatting
thiessenp-cds Nov 26, 2025
7c57ef4
Add ability to store and retrieve notifications from dynamodb
thiessenp-cds Nov 27, 2025
26eb61d
Remove and update comments
thiessenp-cds Nov 27, 2025
888225c
Add email functionality - notify api commented out for now
thiessenp-cds Nov 27, 2025
e3752cf
Update comments
thiessenp-cds Nov 27, 2025
f7a4931
Update comments
thiessenp-cds Dec 1, 2025
d6ee264
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Dec 1, 2025
c3f7957
Add check for invalid notification data
thiessenp-cds Dec 1, 2025
8b4123b
Update readme
thiessenp-cds Dec 1, 2025
ae7be00
Update readme
thiessenp-cds Dec 1, 2025
65a1370
Refactor sqs handler to be more readable
thiessenp-cds Dec 2, 2025
83482c0
Update comments and formatting
thiessenp-cds Dec 2, 2025
626d83f
Clean up notification db after retrieving a record
thiessenp-cds Dec 2, 2025
7b56130
Infra updates from review
thiessenp-cds Dec 2, 2025
9cb237d
Refactor lambda to only get and send notifcation
thiessenp-cds Dec 2, 2025
dad9a96
Add more logging info
thiessenp-cds Dec 2, 2025
849d113
Fix terraform formatting
thiessenp-cds Dec 2, 2025
eafd3e4
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Dec 2, 2025
a353223
Cleanup including removing old comments
thiessenp-cds Dec 3, 2025
0347fca
Remove old comments
thiessenp-cds Dec 3, 2025
1dea47b
Remove more old comments
thiessenp-cds Dec 3, 2025
cf1735c
Update lambda to allow failed notification retries using SQS
thiessenp-cds Dec 4, 2025
267b87c
Update lambda mapping to all batch item failures
thiessenp-cds Dec 4, 2025
fa7217e
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Dec 8, 2025
aac6154
Update comments
thiessenp-cds Dec 8, 2025
6c2bacf
Merge branch 'feat/notifications-v3' of https://github.com/cds-snc/fo…
thiessenp-cds Dec 8, 2025
d800f46
Add SQS notification call to reliability
thiessenp-cds Dec 10, 2025
2f6d77d
Add unit tests
thiessenp-cds Dec 11, 2025
a96df7d
Add more tests
thiessenp-cds Dec 11, 2025
347c117
Try to fix terragrunt error
thiessenp-cds Dec 11, 2025
0f85465
Undo previous change
thiessenp-cds Dec 11, 2025
32b6ec2
Add missing SQS url mock
thiessenp-cds Dec 11, 2025
d04c372
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Dec 15, 2025
1b6a1c6
Update notification lambda to handle case of no queued but no record …
thiessenp-cds Dec 15, 2025
211fbe7
Add lambda batch catch for any edge case
thiessenp-cds Dec 15, 2025
d26b6b1
Update tests with changes
thiessenp-cds Dec 15, 2025
0515e03
Update reliability with try-catch
thiessenp-cds Dec 15, 2025
c3faeaf
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Dec 17, 2025
5f885e8
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 5, 2026
7d63f20
Update to use notification package
thiessenp-cds Jan 6, 2026
0d5f484
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 12, 2026
647bb4f
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 12, 2026
3f9fe1a
Update reliability yarn lock file to latest connector package version
thiessenp-cds Jan 12, 2026
68eae64
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 13, 2026
24bf126
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 13, 2026
0bf4556
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 14, 2026
1a9d00a
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 15, 2026
f34e89b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 16, 2026
dea4c57
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 19, 2026
c56b73b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 20, 2026
4020a93
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 22, 2026
795709a
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 23, 2026
a59e1c3
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 27, 2026
5048394
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Jan 28, 2026
794b81a
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Feb 2, 2026
b46e841
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Feb 4, 2026
22408c6
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Feb 9, 2026
9e037f0
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Feb 12, 2026
4df7597
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Feb 24, 2026
037984b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 2, 2026
78df001
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 5, 2026
c81f813
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 10, 2026
86356cc
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 11, 2026
8caca8e
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 17, 2026
ab8f60b
Merge branch 'main' into feat/notifications-v3
thiessenp-cds Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/lambda-filter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ file-upload-processor:
- "lambda-code/file-upload-processor/**"
file-upload-cleanup:
- "lambda-code/file-upload-cleanup/**"
notification:
- "lambda-code/notification/**"
3 changes: 2 additions & 1 deletion aws/alarms/cloudwatch_app.tf
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,8 @@ locals {
vault_integrity = var.lambda_vault_integrity_log_group_name,
api_end_to_end_test = var.lambda_api_end_to_end_test_log_group_name,
file_upload_processor = var.lambda_file_upload_processor_log_group_name,
file_upload_cleanup = var.lambda_file_upload_cleanup_log_group_name
file_upload_cleanup = var.lambda_file_upload_cleanup_log_group_name,
notification = var.lambda_notification_log_group_name,
}
}

Expand Down
1 change: 1 addition & 0 deletions aws/alarms/dashboards.tf
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ resource "aws_cloudwatch_dashboard" "forms_service_health" {
lambda_response_archiver_log_group_name = var.lambda_response_archiver_log_group_name,
lambda_submission_log_group_name = var.lambda_submission_log_group_name,
lambda_vault_integrity_log_group_name = var.lambda_vault_integrity_log_group_name,
lambda_notification_log_group_name = var.lambda_notification_log_group_name,
rds_cluster_identifier = var.rds_cluster_identifier,
region = var.region
})
Expand Down
5 changes: 5 additions & 0 deletions aws/alarms/inputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -325,3 +325,8 @@ variable "unhealthy_host_count_for_target_group_2_alarm_arn" {
description = "ARN of unhealthy host count alarm for target group 2"
type = string
}

variable "lambda_notification_log_group_name" {
description = "Notification Lambda CloudWatch log group name"
type = string
}
26 changes: 26 additions & 0 deletions aws/dynamodb/dynamo.tf
Original file line number Diff line number Diff line change
Expand Up @@ -218,3 +218,29 @@ resource "aws_dynamodb_table" "api_audit_logs" {
}
}

resource "aws_dynamodb_table" "notification" {
# checkov:skip=CKV_AWS_28: 'point in time recovery' is set to true for staging and production
name = "Notification"
billing_mode = "PAY_PER_REQUEST"
hash_key = "NotificationID"
deletion_protection_enabled = var.env != "development"

attribute {
name = "NotificationID"
type = "S"
}

ttl {
enabled = true
attribute_name = "TTL"
}

server_side_encryption {
enabled = true
kms_key_arn = var.kms_key_dynamodb_arn
}

point_in_time_recovery {
enabled = var.env != "development"
}
}
12 changes: 11 additions & 1 deletion aws/dynamodb/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,14 @@ output "dynamodb_api_audit_logs_arn" {
output "dynamodb_api_audit_logs_table_name" {
description = "API Audit Logs table name"
value = aws_dynamodb_table.api_audit_logs.name
}
}

output "dynamodb_notification_table_arn" {
description = "DynamoDB notification table ARN"
value = aws_dynamodb_table.notification.arn
}

output "dynamodb_notification_table_name" {
description = "DynamoDB notification table name"
value = aws_dynamodb_table.notification.name
}
1 change: 1 addition & 0 deletions aws/ecr/ecr.tf
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ locals {
"api-end-to-end-test-lambda",
"file-upload-processor-lambda",
"file-upload-cleanup-lambda",
"notification-lambda",
var.env == "staging" ? "load-testing-lambda" : null
]))
}
Expand Down
4 changes: 3 additions & 1 deletion aws/lambdas/iam.tf
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ data "aws_iam_policy_document" "lambda_dynamodb" {
var.dynamodb_app_audit_logs_arn,
"${var.dynamodb_app_audit_logs_arn}/index/*",
var.dynamodb_api_audit_logs_arn,
"${var.dynamodb_api_audit_logs_arn}/index/*"
"${var.dynamodb_api_audit_logs_arn}/index/*",
var.dynamodb_notification_table_arn,
"${var.dynamodb_notification_table_arn}/index/*"
]
}
}
Expand Down
20 changes: 20 additions & 0 deletions aws/lambdas/inputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -281,3 +281,23 @@ variable "api_end_to_end_test_lambda_security_group_id" {
description = "API end to end test Lambda security group ID"
type = string
}

variable "sqs_notification_queue_arn" {
description = "ARN of the notification SQS queue"
type = string
}

variable "sqs_notification_queue_url" {
description = "URL of the notification SQS queue"
type = string
}

variable "dynamodb_notification_table_arn" {
description = "ARN of the notification DynamoDB table"
type = string
}

variable "dynamodb_notification_table_name" {
description = "Name of the notification DynamoDB table"
type = string
}
48 changes: 48 additions & 0 deletions aws/lambdas/notification.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@

resource "aws_lambda_function" "notification" {
function_name = "notification"
image_uri = "${var.ecr_repository_lambda_urls["notification-lambda"]}:latest"
package_type = "Image"
role = aws_iam_role.lambda.arn
timeout = 300 # lambda can run for up to 5 minutes
memory_size = 512

dynamic "vpc_config" {
for_each = local.vpc_config
content {
security_group_ids = vpc_config.value.security_group_ids
subnet_ids = vpc_config.value.subnet_ids
}
}

environment {
variables = {
REGION = var.region
DYNAMODB_NOTIFICATION_TABLE_NAME = var.dynamodb_notification_table_name
NOTIFY_API_KEY = var.notify_api_key_secret_arn
}
}

logging_config {
log_format = "Text"
log_group = "/aws/lambda/Notification"
}

tracing_config {
mode = "Active"
}
}

resource "aws_cloudwatch_log_group" "notification" {
name = "/aws/lambda/Notification"
kms_key_id = var.kms_key_cloudwatch_arn
retention_in_days = 731
}

resource "aws_lambda_event_source_mapping" "notification_sqs" {
event_source_arn = var.sqs_notification_queue_arn
function_name = aws_lambda_function.notification.function_name
batch_size = 10
enabled = true
function_response_types = ["ReportBatchItemFailures"]
}
10 changes: 10 additions & 0 deletions aws/lambdas/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,13 @@ output "forms_lambda_client_iam_role_name" {
description = "IAM role name for forms client Lambda"
value = try(aws_iam_role.forms_lambda_client[0].name, null)
}

output "lambda_notification_log_group_name" {
description = "Notification Lambda CloudWatch log group name"
value = aws_cloudwatch_log_group.notification.name
}

output "lambda_notification_function_name" {
description = "Notification Lambda function name"
value = aws_lambda_function.notification.function_name
}
11 changes: 6 additions & 5 deletions aws/lambdas/reliability.tf
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ resource "aws_lambda_function" "reliability" {

environment {
variables = {
ENVIRONMENT = local.env
REGION = var.region
NOTIFY_API_KEY = var.notify_api_key_secret_arn
TEMPLATE_ID = var.gc_template_id
DB_URL = var.database_url_secret_arn
ENVIRONMENT = local.env
REGION = var.region
NOTIFY_API_KEY = var.notify_api_key_secret_arn
TEMPLATE_ID = var.gc_template_id
DB_URL = var.database_url_secret_arn
NOTIFICATION_QUEUE_URL = var.sqs_notification_queue_url
}
}

Expand Down
11 changes: 11 additions & 0 deletions aws/network/development_env/vpc_endpoints.tf
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,15 @@ resource "aws_vpc_endpoint" "secretsmanager" {
aws_security_group.privatelink.id,
]
subnet_ids = local.private_subnet_ids
}

resource "aws_vpc_endpoint" "sqs" {
vpc_id = aws_vpc.forms.id
vpc_endpoint_type = "Interface"
service_name = "com.amazonaws.${var.region}.sqs"
private_dns_enabled = true
security_group_ids = [
aws_security_group.privatelink.id
]
subnet_ids = local.private_subnet_ids
}
10 changes: 10 additions & 0 deletions aws/sqs/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,13 @@ output "sqs_file_upload_deadletter_queue_name" {
description = "File upload dead-letter queue name"
value = aws_sqs_queue.file_upload_deadletter_queue.name
}

output "sqs_notification_queue_arn" {
description = "Notification queue ARN"
value = aws_sqs_queue.notification_queue.arn
}

output "sqs_notification_queue_url" {
description = "Notification queue URL"
value = aws_sqs_queue.notification_queue.url
}
12 changes: 12 additions & 0 deletions aws/sqs/sqs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,15 @@ resource "aws_sqs_queue" "file_upload_deadletter_queue" {
message_retention_seconds = 1209600
receive_wait_time_seconds = 5
}

# Notification queue (no DLQ requirement)
resource "aws_sqs_queue" "notification_queue" {
# checkov:skip=CKV_AWS_27: Encrytion not Required and difficult to support with S3 notification source
name = "notification_queue"
delay_seconds = 0
max_message_size = 262144
message_retention_seconds = 86400 // 24 hours
visibility_timeout_seconds = 1800
kms_master_key_id = "alias/aws/sqs"
kms_data_key_reuse_period_seconds = 300
}
2 changes: 2 additions & 0 deletions env/cloud/alarms/terragrunt.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ dependency "lambdas" {
lambda_api_end_to_end_test_log_group_name = "/aws/lambda/API_End_To_End_Test"
lambda_file_upload_processor_log_group_name = "/aws/lambda/file-upload-processor"
lambda_file_upload_cleanup_log_group_name = "/aws/lambda/file-upload-cleanup"
lambda_notification_log_group_name = "/aws/lambda/Notification"
}
}

Expand Down Expand Up @@ -231,6 +232,7 @@ inputs = {
lambda_api_end_to_end_test_log_group_name = dependency.lambdas.outputs.lambda_api_end_to_end_test_log_group_name
lambda_file_upload_processor_log_group_name = dependency.lambdas.outputs.lambda_file_upload_processor_log_group_name
lambda_file_upload_cleanup_log_group_name = dependency.lambdas.outputs.lambda_file_upload_cleanup_log_group_name
lambda_notification_log_group_name = dependency.lambdas.outputs.lambda_notification_log_group_name

rds_cluster_identifier = dependency.rds.outputs.rds_cluster_identifier

Expand Down
11 changes: 10 additions & 1 deletion env/cloud/lambdas/terragrunt.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ dependency "sqs" {
sqs_reliability_dead_letter_queue_id = "https://sqs.ca-central-1.amazonaws.com/${local.aws_account_id}/reliability_deadletter_queue"
sqs_app_audit_log_queue_arn = "arn:aws:sqs:ca-central-1:${local.aws_account_id}:audit_log_queue"
sqs_api_audit_log_queue_arn = "arn:aws:sqs:ca-central-1:${local.aws_account_id}:api_audit_log_queue"
sqs_notification_queue_arn = "arn:aws:sqs:ca-central-1:${local.aws_account_id}:notification_queue"
sqs_notification_queue_url = "https://sqs.ca-central-1.amazonaws.com/${local.aws_account_id}/notification_queue"
}
}

Expand Down Expand Up @@ -119,6 +121,8 @@ dependency "dynamodb" {
dynamodb_app_audit_logs_arn = "arn:aws:dynamodb:ca-central-1:${local.aws_account_id}:table/AuditLogs"
dynamodb_api_audit_logs_table_name = "ApiAuditLogs"
dynamodb_api_audit_logs_arn = "arn:aws:dynamodb:ca-central-1:${local.aws_account_id}:table/ApiAuditLogs"
dynamodb_notification_table_name = "Notification"
dynamodb_notification_table_arn = "arn:aws:dynamodb:ca-central-1:${local.aws_account_id}:table/Notification"
}
}

Expand Down Expand Up @@ -179,7 +183,8 @@ dependency "ecr" {
api-end-to-end-test-lambda = "test_url",
file-upload-processor-lambda = "test_url",
file-upload-cleanup-lambda = "test_url",
load-testing-lambda = "test_url"
load-testing-lambda = "test_url",
notification-lambda = "test_url"
}
}
}
Expand Down Expand Up @@ -233,6 +238,8 @@ inputs = {
dynamodb_app_audit_logs_arn = dependency.dynamodb.outputs.dynamodb_app_audit_logs_arn
dynamodb_api_audit_logs_table_name = dependency.dynamodb.outputs.dynamodb_api_audit_logs_table_name
dynamodb_api_audit_logs_arn = dependency.dynamodb.outputs.dynamodb_api_audit_logs_arn
dynamodb_notification_table_name = dependency.dynamodb.outputs.dynamodb_notification_table_name
dynamodb_notification_table_arn = dependency.dynamodb.outputs.dynamodb_notification_table_arn

kms_key_cloudwatch_arn = dependency.kms.outputs.kms_key_cloudwatch_arn
kms_key_dynamodb_arn = dependency.kms.outputs.kms_key_dynamodb_arn
Expand All @@ -252,6 +259,8 @@ inputs = {
sqs_reliability_dead_letter_queue_id = dependency.sqs.outputs.sqs_reliability_dead_letter_queue_id
sqs_app_audit_log_queue_arn = dependency.sqs.outputs.sqs_app_audit_log_queue_arn
sqs_api_audit_log_queue_arn = dependency.sqs.outputs.sqs_api_audit_log_queue_arn
sqs_notification_queue_arn = dependency.sqs.outputs.sqs_notification_queue_arn
sqs_notification_queue_url = dependency.sqs.outputs.sqs_notification_queue_url

sns_topic_alert_critical_arn = dependency.sns.outputs.sns_topic_alert_critical_arn

Expand Down
Loading
Loading