Terraform中如何为Cloudwatch Synthetics Canary创建关联的Cloudwatch Metric Alarm
问题
我已经用Terraform创建了一个Synthetics Canary资源,代码如下:
resource "aws_synthetics_canary" "some" { name = "some-canary" artifact_s3_location = "s3://some-bucket/" execution_role_arn = "some-role" handler = "exports.handler" zip_file = "test-fixtures/lambdatest.zip" runtime_version = "syn-1.0" schedule { expression = "rate(0 minute)" } }
现在想给这个Canary配置CloudWatch告警,但在aws_cloudwatch_metric_alarm资源里找不到类似AWS控制台里的CanaryName直接关联参数,当前我的告警配置是针对EC2的,显然不对:
resource "aws_cloudwatch_metric_alarm" "foobar" { alarm_name = "terraform-test-foobar5" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = "2" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = "120" statistic = "Average" threshold = "80" alarm_description = "This metric monitors ec2 cpu utilization" insufficient_data_actions = [] }
我已经确认CloudWatchSynthetics命名空间可用,请问该怎么配置才能关联到我的Canary?
解决方案
其实Terraform的aws_cloudwatch_metric_alarm是通过**维度(dimensions)**来关联特定Canary的,不需要专门的CanaryName参数,你只需要调整几个配置项就行:
1. 切换到正确的指标命名空间
把namespace从AWS/EC2改成CloudWatchSynthetics,这是Synthetics Canary指标所属的专属命名空间。
2. 添加Canary关联维度
在告警资源里加上dimensions块,指定CanaryName为你的Canary名称,推荐直接引用Terraform资源的属性,避免硬编码带来的维护问题:
dimensions = { CanaryName = aws_synthetics_canary.some.name }
3. 选择合适的Synthetics指标
Canary的核心监控指标不是CPUUtilization,而是比如SuccessPercent(执行成功率)、Failed(失败次数)、Duration(单次执行时长)这类业务相关指标,你可以根据监控需求选择。比如要监控Canary执行成功率过低的情况,就用SuccessPercent。
完整的告警配置示例
这里给你一个关联到上述Canary的告警示例,当Canary成功率低于90%且持续2个周期时触发告警:
resource "aws_cloudwatch_metric_alarm" "canary_success_alarm" { alarm_name = "some-canary-success-alarm" comparison_operator = "LessThanThreshold" evaluation_periods = 2 metric_name = "SuccessPercent" namespace = "CloudWatchSynthetics" period = 60 statistic = "Average" threshold = 90 alarm_description = "告警:Canary执行成功率低于90%" insufficient_data_actions = [] # 关联到你的Canary资源 dimensions = { CanaryName = aws_synthetics_canary.some.name } }
这样配置后,这个告警就会精准关联到你创建的some-canary资源,和控制台里选择CanaryName的效果完全一致。
内容的提问来源于stack exchange,提问作者Sandro_V

