personal-lifecycle-tracker / terraform / aws-serverless / scheduler.tf
scheduler.tf
Raw
# Fix 1: The 4-minute warmer (keeps Lambda warm and Neon Postgres awake for $0)
resource "aws_cloudwatch_event_rule" "warmer" {
  name                = "${var.project_name}-warmer-${var.environment}"
  description         = "Pings /health every 4 minutes to eliminate cold starts"
  schedule_expression = var.warmer_rate
}

resource "aws_cloudwatch_event_target" "ping_warmer" {
  rule      = aws_cloudwatch_event_rule.warmer.name
  target_id = "PingHealth"
  arn       = aws_lambda_function.backend.arn
  input     = jsonencode({
    rawPath = "/health"
    requestContext = {
      http = {
        method = "GET"
        path   = "/health"
      }
    }
  })
}

resource "aws_lambda_permission" "allow_eventbridge_warmer" {
  statement_id  = "AllowExecutionFromEventBridgeWarmer"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.backend.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.warmer.arn
}

# Fix 4: Scheduled 08:00 AM Morning Email Digest
resource "aws_cloudwatch_event_rule" "digest" {
  name                = "${var.project_name}-daily-digest-${var.environment}"
  description         = "Triggers daily morning digest calculation at 08:00 AM UTC"
  schedule_expression = var.digest_cron
}

resource "aws_cloudwatch_event_target" "trigger_digest" {
  rule      = aws_cloudwatch_event_rule.digest.name
  target_id = "TriggerDigest"
  arn       = aws_lambda_function.backend.arn
  input     = jsonencode({
    rawPath = "/api/v1/reminders/digest/send"
    requestContext = {
      http = {
        method = "POST"
        path   = "/api/v1/reminders/digest/send"
      }
    }
  })
}

resource "aws_lambda_permission" "allow_eventbridge_digest" {
  statement_id  = "AllowExecutionFromEventBridgeDigest"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.backend.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.digest.arn
}