diff --git a/cdk/po_stack.py b/cdk/po_stack.py index 4648842..787ce07 100644 --- a/cdk/po_stack.py +++ b/cdk/po_stack.py @@ -157,6 +157,21 @@ class PoIngestStack(Stack): enforce_ssl=True, ) + # --- Explicit log group (INFRA-114) --- + # Replaces the deprecated log_retention prop, which provisioned a + # LogRetention custom resource whose role held logs:PutRetentionPolicy/ + # DeleteRetentionPolicy on Resource "*" (checkov CKV_AWS_111). The name + # matches Lambda's default (/aws/lambda/) so the function + # keeps writing to the same group; RETAIN matches the repo convention for + # stateful resources. + email_processor_log_group = logs.LogGroup( + self, + "EmailProcessorLogGroup", + log_group_name="/aws/lambda/po-email-processor", + retention=logs.RetentionDays.TWO_MONTHS, + removal_policy=RemovalPolicy.RETAIN, + ) + # --- Lambda function --- email_processor = lambda_.Function( self, @@ -180,7 +195,7 @@ class PoIngestStack(Stack): ), timeout=Duration.seconds(60), memory_size=256, - log_retention=logs.RetentionDays.TWO_MONTHS, + log_group=email_processor_log_group, dead_letter_queue=email_processor_dlq, environment={ "PO_TABLE": "purchase-orders", @@ -297,6 +312,14 @@ class PoIngestStack(Stack): ) # --- Web UI Lambda --- + web_ui_log_group = logs.LogGroup( + self, + "WebUILogGroup", + log_group_name="/aws/lambda/po-web-ui", + retention=logs.RetentionDays.TWO_MONTHS, + removal_policy=RemovalPolicy.RETAIN, + ) + web_ui = lambda_.Function( self, "WebUI", @@ -307,7 +330,7 @@ class PoIngestStack(Stack): code=lambda_.Code.from_asset("../lambdas/po/web_ui"), timeout=Duration.seconds(60), memory_size=256, - log_retention=logs.RetentionDays.TWO_MONTHS, + log_group=web_ui_log_group, environment={ "PO_TABLE": "purchase-orders", }, @@ -369,6 +392,14 @@ class PoIngestStack(Stack): # 518 WCU of write amplification. Re-add if a state-level query path ships. # --- Site extractor Lambda (DynamoDB Streams → verified-sites) --- + site_extractor_log_group = logs.LogGroup( + self, + "SiteExtractorLogGroup", + log_group_name="/aws/lambda/po-ingest-site-extractor", + retention=logs.RetentionDays.TWO_MONTHS, + removal_policy=RemovalPolicy.RETAIN, + ) + site_extractor = lambda_.Function( self, "SiteExtractor", @@ -379,7 +410,7 @@ class PoIngestStack(Stack): code=lambda_.Code.from_asset("../lambdas/po/site_extractor"), timeout=Duration.seconds(60), memory_size=256, - log_retention=logs.RetentionDays.TWO_MONTHS, + log_group=site_extractor_log_group, environment={ "VERIFIED_SITES_TABLE": verified_sites_table.table_name, "PENDING_REVIEW_TABLE": "pending-site-review", diff --git a/cdk/wo_stack.py b/cdk/wo_stack.py index fc8d166..e1cb926 100644 --- a/cdk/wo_stack.py +++ b/cdk/wo_stack.py @@ -156,6 +156,21 @@ class WorkorderIngestStack(Stack): enforce_ssl=True, ) + # --- Explicit log group (INFRA-114) --- + # Replaces the deprecated log_retention prop, which provisioned a + # LogRetention custom resource whose role held logs:PutRetentionPolicy/ + # DeleteRetentionPolicy on Resource "*" (checkov CKV_AWS_111). The name + # matches Lambda's default (/aws/lambda/) so the function + # keeps writing to the same group; RETAIN matches the repo convention for + # stateful resources. + email_processor_log_group = logs.LogGroup( + self, + "EmailProcessorLogGroup", + log_group_name="/aws/lambda/workorder-email-processor", + retention=logs.RetentionDays.TWO_MONTHS, + removal_policy=RemovalPolicy.RETAIN, + ) + # --- Lambda function --- email_processor = lambda_.Function( self, @@ -179,7 +194,7 @@ class WorkorderIngestStack(Stack): ), timeout=Duration.seconds(60), memory_size=256, - log_retention=logs.RetentionDays.TWO_MONTHS, + log_group=email_processor_log_group, dead_letter_queue=email_processor_dlq, environment={ "WORK_ORDERS_TABLE": work_orders_table.table_name, @@ -311,6 +326,14 @@ class WorkorderIngestStack(Stack): ) # --- Web UI Lambda --- + web_ui_log_group = logs.LogGroup( + self, + "WebUILogGroup", + log_group_name="/aws/lambda/workorder-web-ui", + retention=logs.RetentionDays.TWO_MONTHS, + removal_policy=RemovalPolicy.RETAIN, + ) + web_ui = lambda_.Function( self, "WebUI", @@ -321,7 +344,7 @@ class WorkorderIngestStack(Stack): code=lambda_.Code.from_asset("../lambdas/wo/web_ui"), timeout=Duration.seconds(15), memory_size=128, - log_retention=logs.RetentionDays.TWO_MONTHS, + log_group=web_ui_log_group, environment={ "WORK_ORDERS_TABLE": work_orders_table.table_name, "COMMENTS_TABLE": comments_table.table_name,