将 CloudWatch 日志流事件传输到另一个系统时如何保留它们的顺序?

sed*_*vav 6 amazon-web-services amazon-cloudwatch aws-lambda amazon-kinesis-firehose

故事

我有运行产生 stdout/stderr 输出的 docker 容器的 ECS 任务。这些任务配置为使用 awslogs 驱动程序将输出发送到 CloudWatch。CW 日志组上有一个订阅过滤器,订阅者是将日志移动到 S3 存储桶的 Firehose 流。该流附加了一个 AWS Lambda 以批量处理 CW 事件。lambda 解析日志事件并将解析的数据发送到另一个系统进行索引。我想保留解析数据的顺序,但不知道如何实现。

我的第一种方法是将 CW 事件时间戳值包含到解析的数据中,然后在目标系统中对其进行排序。事实证明这是不够的,因为可能有许多具有相同时间戳的后续 CW 事件(在同一日志流中) - CW 时间戳值默认基于毫秒。

在 lambda 中处理批次的 CW 事件期间,它们在批次中的顺序是已知的,我的第二种方法是用订单号丰富解析数据中的时间戳 - 因此具有相同时间戳的事件将具有不同的订单号。这个解决方案很快就暴露了它的弱点 - 可能有多个处理 lambda 的实例在来自 Firehose 流的不同日志事件批次上并行工作。流的一个分片 - 处理 lambda 的一个实例。因此,不可能有一个简单的计数器来保存多个并行执行的 lambda 之间的日志事件顺序。

我发现的下一件事是 CW 日志事件 ID 是唯一的、基于数字的和递增的值。我还没有找到对这一事实的任何确认,所以这只是对 AWS Web 控制台中 CW UI 行为的观察。CW API 甚至使用 ID 作为后向和前向令牌,因此 ID 应该是可比较的实体。

问题

  • 我可以使用 ID 在外部系统中进行排序吗?恐怕日志 ID 的这种增加性质只是 CW API 的内部实现,将来可能会发生变化。
  • 我能否以某种方式在 ECS 任务中配置 awslogs 驱动程序以在 CloudWatch 时间戳中包含微秒(对于我的目的来说,这样的精度似乎足够了)?在它的文档中没有找到它