配置监听ECS任务健康检查的AWS Event Rule未触发,求排查
问题描述
我希望在ECS中的nginx服务器启动且健康检查通过时触发应用,目前先测试验证能否在服务器启动后立即输出日志。
我的配置
任务定义健康检查配置
{ "name": "nginx-example", "healthCheck": { "command": [ "CMD-SHELL", "curl -f http://localhost:80/ || exit 1" ], "interval": 30, "timeout": 5, "retries": 3, "startPeriod": 10 } }
CloudWatch事件规则配置
{ "Name": "rule-nginx-ok", "EventPattern": "{\"source\": [\"aws.ecs\"], \"detail-type\": [\"ECS Task State Change\"], \"detail\": {\"lastStatus\": [\"RUNNING\"], \"healthStatus\": [\"HEALTHY\"], \"containers\": {\"name\": [\"nginx-example\"]}}}", "State": "ENABLED", "Description": "Rule to capture ECS nginx health check OK events" }
测试情况
规则触发目标为输出日志,权限已配置完成,手动触发事件时能在Lambda日志中看到记录:
{ "time": 1697929865000, "detail": { "lastStatus": "RUNNING", "healthStatus": "HEALTHY", "containers": [ { "name": "nginx-example" } ] } }
但nginx服务器启动且健康检查通过后,该规则并未触发。想知道是否在事件规则配置中遗漏了什么?
问题原因及解决方案
你的事件规则中EventPattern的containers字段匹配语法错误。ECS发送的任务状态变更事件里,containers是数组类型,而你当前的规则里直接用对象形式匹配{"name": ["nginx-example"]},无法正确匹配数组中的元素。
需要修改EventPattern里的containers部分,改为数组匹配语法,确保能匹配到数组中存在名称为nginx-example的容器:
修正后的事件规则配置:
{ "Name": "rule-nginx-ok", "EventPattern": "{\"source\": [\"aws.ecs\"], \"detail-type\": [\"ECS Task State Change\"], \"detail\": {\"lastStatus\": [\"RUNNING\"], \"healthStatus\": [\"HEALTHY\"], \"containers\": [{\"name\": [\"nginx-example\"]}]}}", "State": "ENABLED", "Description": "Rule to capture ECS nginx health check OK events" }
简单来说,就是把"containers": {"name": ["nginx-example"]}改成"containers": [{"name": ["nginx-example"]}],用数组包裹容器匹配条件,这样CloudWatch Events就能正确识别数组中的容器对象属性。
额外验证建议:
- 确认ECS任务确实进入了
HEALTHY状态,可在ECS控制台查看任务的健康状态 - 检查CloudWatch Events的事件历史,确认是否有符合条件的事件被发送但未匹配规则
内容的提问来源于stack exchange,提问作者chassy Dave
相关产品推荐
相关产品推荐

