如何用Terraform创建含多指标与多表达式的AWS EFS CloudWatch告警?
解决EFS吞吐量利用率CloudWatch告警的Insufficient Data问题
核心逻辑梳理
EFS吞吐量利用率的计算依赖两个指标的数学组合:
TotalIOBytes:统计周期内的总IO字节数,需用Sum聚合ThroughputCapacity:EFS的实时吞吐量容量,需用Average聚合
最终公式:(TotalIOBytes总和 / ThroughputCapacity平均值) * 100
正确的Terraform配置示例
不能嵌套metric_query块,每个指标和表达式都要作为独立块,用id关联:
resource "aws_cloudwatch_metric_alarm" "efs_throughput_utilization" { alarm_name = "EFS-Throughput-Utilization-Alarm" comparison_operator = "GreaterThanThreshold" evaluation_periods = 2 threshold = 80 # 阈值可按需调整 alarm_description = "EFS吞吐量利用率超过80%时触发告警" alarm_actions = [aws_sns_topic.efs_alerts.arn] # 替换为你的告警接收SNS Topic # 定义TotalIOBytes指标,仅用于后续计算 metric_query { id = "total_io" return_data = false metric { namespace = "AWS/EFS" metric_name = "TotalIOBytes" dimensions = { FileSystemId = aws_efs_file_system.my_efs.id # 替换为你的EFS实例ID } stat = "Sum" period = 60 } } # 定义ThroughputCapacity指标,仅用于后续计算 metric_query { id = "throughput_capacity" return_data = false metric { namespace = "AWS/EFS" metric_name = "ThroughputCapacity" dimensions = { FileSystemId = aws_efs_file_system.my_efs.id } stat = "Average" period = 60 } } # 计算最终利用率的表达式,作为告警依据 metric_query { id = "utilization" return_data = true expression = "(total_io / throughput_capacity) * 100" label = "Throughput Utilization (%)" } }
Insufficient Data问题排查清单
- 维度匹配错误:检查
FileSystemId是否和目标EFS实例的ID完全一致,大小写敏感 - 聚合方式错误:
TotalIOBytes必须用Sum,ThroughputCapacity必须用Average,错用会导致无有效数据 - return_data配置错误:只有最终表达式块设为
true,前置指标块必须设为false,否则CloudWatch会尝试单独返回这些指标,引发数据异常 - 表达式ID引用错误:表达式里的
total_io、throughput_capacity必须和对应metric_query的id完全一致 - EFS实例状态:确认EFS处于运行状态且有实际IO操作,空实例不会上报指标
- 数据延迟:新创建的EFS实例通常需要5-15分钟才会开始向CloudWatch上报指标,耐心等待后再查看告警状态
内容的提问来源于stack exchange,提问作者striker
相关产品推荐
相关产品推荐

