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 应该是可比较的实体。
问题
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |