
resource "aws_apigatewayv2_stage" "tracks" {
api_id = aws_apigatewayv2_api.tracks.id
auto_deploy = true
name = "prod"
access_log_settings {
destination_arn = aws_cloudwatch_log_group.tracks_access_logs.arn
format = jsonencode({
requestId = "$context.requestId"
httpMethod = "$context.httpMethod"
routeKey = "$context.routeKey"
status = "$context.status"
responseLength = "$context.responseLength"
requestTime = "$context.requestTime"
})
}
default_route_settings {
detailed_metrics_enabled = true
throttling_burst_limit = 5000
throttling_rate_limit = 10000
}
}
resource "aws_cloudwatch_log_group" "tracks_lambda_api" {
name = "/aws/lambda/tracks_lambda_api"
retention_in_days = 90
tags = {
"fluidattacks:comp" = "tracks" "fluidattacks:line" = "cost" "Name" = "tracks_lambda_api_function_log_group" }
}
/aws/api_gateway/[api-name]/aws/lambda/[function-name]Latency - Overall latency of your APIIntegrationLatency - Time between API Gateway and backend4XX / 5XX - Client and server errorsCount - Number of API callsDuration - Execution timeErrors - Number of errorsThrottles - Number of throttled invocationsConcurrentExecutions - Number of concurrent executionsfields @timestamp, requestId, routeKey, status
| filter status = 200
| sort @timestamp desc
fields @timestamp, routeKey, status, errorMessage
| filter status >= 400
| sort @timestamp desc
| limit 20
fields @timestamp, connectionId, eventType, errorMessage| filter eventType = "CONNECT" or eventType = "DISCONNECT"
| sort @timestamp descfields @timestamp, connectionId, eventType, errorMessage
| filter eventType = "MESSAGE" and status >= 400
| sort @timestamp descruns/vpc/infra/alarms.tf:resource "aws_cloudwatch_metric_alarm" "lambda_error_alarm" {
for_each = toset(var.lambda_names)
alarm_name = "${each.value}_Error_Alarm"
metric_name = "Errors"
namespace = "AWS/Lambda"
period = 60
statistic = "Sum"
threshold = 1
alarm_actions = [aws_sns_topic.central_alarms.arn]
}