如何基于退出码获取已计划的AWS ECS任务失败的指标/警报

10
我们使用AWS ECS任务与CloudWatch事件/EventBridge计划设置。我们希望基于容器退出代码的失败运行获得度量和通知。
我们原本计划使用使用CloudWatch指标监控用法中的FailedInvocations。
但是,似乎在指标中没有看到非零任务退出代码。在AWS控制台中,已验证ECS任务的退出代码为非零,但指标仅包括“调用”和“触发规则”。我们在设置任务和启动任务所需的缺少策略时曾遇到过FailedInvocations,但似乎非零退出代码不会影响该指标。
是EventBridge只是不提供非零容器退出代码的指标,还是我们在设置中遗漏了某些内容?
我们可以通过任务记录某些错误消息来解决此问题,但退出代码更为通用。

1
您可能希望考虑创建一个事件,当任务达到STOPPED时触发该事件,请参见https://dev59.com/qbLma4cB1Zd3GeqPcYvb。 - Tom Harvey
1个回答

5

我创建了一个 CW 规则,可以捕获容器停止时触发的事件。

以下是 Python CDK 代码示例,但其中的参数应该可以指导你。

        result_rule = events.Rule(self, 'TaskCompletion%s' % id_suffix,
            event_pattern=events.EventPattern(
                source=["aws.ecs"],
                detail_type=["ECS Task State Change"],
                region=[scope.env.region],
                detail={
                    "lastStatus": ["STOPPED"],
                    "containers":
                        {
                            "name": [container_name]
                        }
                    }
            ),
            targets=[
                targets.SqsQueue(
                    queue=scope.result_queue,
                )
            ]
        )

它会将整个事件上下文发送到SQS队列中(也可以是SNS,你可能需要一个 Lambda 来处理这个过程)。
然后 Lambda 可以从上下文中读取退出代码,并获取:
- 容器/任务名称 - 启动和停止时间 - CPU 和内存配置
这使您可以在退出代码(0或非0)上创建度量标准,还可以报告运行时间指标。

这个上下文对一些人来说可能很明显,但值得注意的是:这些事件会在与ECS集群相同的区域上的默认事件总线上到达,您无需配置任何内容即可让ECS发送它们(通常它们会被忽略)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接