Skip to content

Commit 3fe1b2d

Browse files
fix: satisfy serverless lint and Terraform formatting gates
1 parent e30fb78 commit 3fe1b2d

5 files changed

Lines changed: 13 additions & 12 deletions

File tree

‎.github/workflows/aws-snowflake-validation.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
terraform_version: '1.9.8'
5555

5656
- name: Check Terraform formatting
57-
run: terraform fmt -check -recursive infra/aws
57+
run: terraform fmt -check -diff -recursive infra/aws
5858

5959
- name: Initialize providers without backend
6060
run: terraform -chdir=infra/aws init -backend=false

‎app/api/routes.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import time
88
import uuid
99
from dataclasses import dataclass
10-
from datetime import datetime, timezone
10+
from datetime import UTC, datetime
1111
from typing import Literal
1212

1313
from fastapi import APIRouter, Header, HTTPException
@@ -211,7 +211,7 @@ def feedback(req: FeedbackRequest, x_api_key: str | None = Header(default=None))
211211
"schema_version": 1,
212212
"event_id": str(uuid.uuid4()),
213213
"anonymous_user_id": anonymized_user,
214-
"occurred_at": datetime.now(timezone.utc).isoformat(),
214+
"occurred_at": datetime.now(UTC).isoformat(),
215215
}
216216
try:
217217
_feedback_sink.publish(event)

‎app/core/feedback_sink.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import json
66
import logging
7-
from typing import Any, Mapping, Protocol
7+
from collections.abc import Mapping
8+
from typing import Any, Protocol
89

910
logger = logging.getLogger(__name__)
1011

‎infra/aws/main.tf‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ resource "aws_iam_role_policy" "feedback_lambda" {
115115
Resource = aws_sqs_queue.feedback.arn
116116
},
117117
{
118-
Effect = "Allow"
119-
Action = ["s3:PutObject"]
118+
Effect = "Allow"
119+
Action = ["s3:PutObject"]
120120
Resource = "${aws_s3_bucket.feedback.arn}/feedback/*"
121121
}
122122
]

‎serverless/feedback_ingestion/handler.py‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import logging
77
import os
88
import re
9-
from datetime import datetime, timezone
9+
from datetime import UTC, datetime
1010
from typing import Any
1111

12+
from botocore.exceptions import BotoCoreError, ClientError
13+
1214
logger = logging.getLogger(__name__)
1315

1416
ALLOWED_EVENT_TYPES = {"impression", "click", "skip", "cart", "purchase", "dislike"}
@@ -63,16 +65,14 @@ def parse_feedback_message(body: str) -> dict[str, Any]:
6365
if not isinstance(payload["event_id"], str) or not payload["event_id"]:
6466
raise TypeError("event_id must be a non-empty string")
6567

66-
occurred_at = str(payload["occurred_at"])
67-
parsed = datetime.fromisoformat(occurred_at.replace("Z", "+00:00"))
68+
parsed = datetime.fromisoformat(str(payload["occurred_at"]))
6869
if parsed.tzinfo is None:
6970
raise ValueError("occurred_at must include a timezone")
7071
return payload
7172

7273

7374
def _storage_key(payload: dict[str, Any], message_id: str) -> str:
74-
occurred = datetime.fromisoformat(str(payload["occurred_at"]).replace("Z", "+00:00"))
75-
occurred = occurred.astimezone(timezone.utc)
75+
occurred = datetime.fromisoformat(str(payload["occurred_at"])).astimezone(UTC)
7676
safe_message_id = re.sub(r"[^A-Za-z0-9_.-]", "_", message_id)
7777
return (
7878
f"feedback/event_date={occurred:%Y-%m-%d}/hour={occurred:%H}/"
@@ -125,7 +125,7 @@ def lambda_handler(event: dict[str, Any], context: Any) -> dict[str, list[dict[s
125125
raise TypeError("SQS record must be an object")
126126
key = _process_record(record, bucket=bucket, s3_client=s3_client)
127127
logger.info("feedback_landed message_id=%s key=%s", message_id, key)
128-
except Exception as exc: # Lambda must isolate malformed records in a batch.
128+
except (TypeError, ValueError, BotoCoreError, ClientError) as exc:
129129
logger.warning(
130130
"feedback_ingestion_failed message_id=%s error_type=%s",
131131
message_id,

0 commit comments

Comments
 (0)