CloudFront接收请求时未触发CloudWatch告警问题求助
核心问题分析
你的配置目标是当CloudFront收到请求时触发告警,但当前设置存在几个可能导致告警不生效的点,以下是逐一排查和修正方案:
1. 阈值与比较运算符逻辑错误
当前配置使用GreaterThanOrEqualToThreshold+threshold = 0,意味着只要有数据点(哪怕请求数为0)就会触发告警,但你设置了treat_missing_data = "notBreaching"(无数据时视为正常)。而实际有请求时,请求数Sum=1满足>=0,但可能因为CloudFront在无请求时不会上报Sum=0的数据点,导致告警的状态判断逻辑不符合预期。
修正方案:
将比较运算符改为GreaterThanThreshold,保持阈值为0,这样只有当请求数>0(即有实际请求)时才会触发告警:
comparison_operator = "GreaterThanThreshold" threshold = 0
2. CloudWatch指标延迟
CloudFront的指标数据并非实时上报,通常存在5-15分钟的延迟。测试时访问CloudFront后,需要等待足够时间让数据同步到CloudWatch,再查看告警状态是否变化。
3. 维度配置验证
确认DistributionId变量的值与实际CloudFront分发的ID完全一致(区分大小写)。CloudFront的Region固定为Global,这部分配置是正确的,但需确保分发ID没有输入错误。
4. SNS主题权限检查
CloudWatch需要具备向指定SNS主题发送消息的权限,否则即使告警触发,你也无法收到通知(看起来像是告警未触发)。检查SNS主题的访问策略是否包含以下权限:
{ "Effect": "Allow", "Principal": { "Service": "cloudwatch.amazonaws.com" }, "Action": "sns:Publish", "Resource": "你的SNS主题ARN" }
5. 指标数据存在性验证
手动在CloudWatch控制台查看对应CloudFront分发的Requests指标,确认是否有请求数据生成:
- 进入CloudWatch控制台 → 指标 → 找到
AWS/CloudFront命名空间 → 选择对应的DistributionId → 查看Sum统计下的Requests指标曲线,确认测试请求是否已被统计。
6. 告警状态转换逻辑
如果之前告警处于OK状态,当满足触发条件时,需要等待一个完整的period(60秒)周期,CloudWatch才会评估并更新告警状态为ALARM,进而触发SNS动作。
修正后的完整配置
resource "aws_cloudwatch_metric_alarm" "service_start_alarm" { alarm_name = "${var.module_name}-start" insufficient_data_actions = [] ok_actions = [] alarm_actions = [var.trigger_sns.arn] treat_missing_data = "notBreaching" metric_name = "Requests" namespace = "AWS/CloudFront" statistic = "Sum" comparison_operator = "GreaterThanThreshold" # 修改此处 evaluation_periods = 1 datapoints_to_alarm = 1 threshold = 0 period = 60 dimensions = { DistributionId = var.distribution_id Region = "Global" } }
内容的提问来源于stack exchange,提问作者Moravas

