适用于 AWS 的 Elastic Serverless Forwarder
编辑适用于 AWS 的 Elastic Serverless Forwarder
编辑Elastic Serverless Forwarder 是一个 Amazon Web Services (AWS) Lambda 函数,用于将 AWS 环境中的日志发送到 Elastic。
Elastic Serverless Forwarder 适用于 Elastic Stack 7.17 及更高版本。
使用 Elastic Serverless Forwarder 可能会产生额外费用。要了解如何最大限度地减少额外费用,请参阅 避免意外成本。
概述
编辑Elastic Serverless Forwarder 可以将 AWS 数据转发到云托管的、自管理的 Elastic 环境,或 [预览] 此功能处于技术预览阶段,可能在将来的版本中发生更改或被移除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 的约束。 Logstash。它支持以下输入
- Amazon S3(通过 SQS 事件通知)
- Amazon Kinesis 数据流
- Amazon CloudWatch Logs 订阅筛选器
- Amazon SQS 消息有效负载
Elastic Serverless Forwarder 确保 至少一次传递 转发消息。
成功部署转发器后,Lambda 会自动创建一个 SQS *持续队列*,以确保不会丢失任何数据。默认情况下,转发器最多运行 15 分钟,因此 AWS 可能会在处理事件数据的过程中退出函数。转发器通过跟踪最后处理的偏移量来处理这种情况。当队列触发新的函数调用时,转发器将从上次函数运行停止的地方开始。
转发器使用 *重放队列*(也在部署期间自动创建)来处理任何与摄取相关的异常或失败场景。重放队列中的数据存储为单个事件。Lambda 会跟踪任何失败的事件,并将它们写入重放队列,然后可以通过将其作为附加的 SQS 触发器添加到 Lambda 来使用。
您可以使用 config.yaml 文件为每种输入和输出类型配置服务,包括 SQS 队列 ARN(Amazon 资源编号)和 Elasticsearch 或 Logstash 连接详细信息等信息。您可以在配置文件中创建多个输入部分,以将不同的输入映射到特定的日志类型。
无需在 config.yaml 中为持续队列和重放队列定义特定的输入。
转发器还支持直接写入索引、别名或自定义数据流。这使现有的 Elasticsearch 用户能够重复使用已经创建并连接到其他流程的索引模板、摄取管道或仪表板。
输入
编辑Amazon S3(通过 SQS 事件通知)
编辑转发器可以通过简单队列服务 (SQS) 通知(s3:ObjectCreated
)提取包含在 Amazon 简单存储服务 (S3) 存储桶中的日志,并将它们发送到 Elastic。SQS 队列充当转发器的触发器。当新的日志文件写入 S3 存储桶并满足用户定义的条件(包括前缀/后缀)时,会生成一个 SQS 通知,该通知会触发 Lambda 函数。
您可以为每种类型的日志设置单独的 SQS 队列(例如,aws.vpcflow
、aws.cloudtrail
、aws.waf
)。单个配置文件可以包含多个输入部分,指向与特定日志类型匹配的不同 SQS 队列。es_datastream_name
参数在配置文件中是可选的。转发器支持将各种 AWS 服务日志自动路由到相应的数据流,以便在 Elasticsearch 集群中进一步处理和存储。它支持 aws.cloudtrail
、aws.cloudwatch_logs
、aws.elb_logs
、aws.firewall_logs
、aws.vpcflow
和 aws.waf
日志的自动路由。
对于其他日志类型,您可以根据 Elasticsearch 数据流和集成的命名约定,在配置文件中选择设置 es_datastream_name
值。如果未指定 es_datastream_name
,并且日志无法与上述任何 AWS 服务匹配,则数据集将设置为 generic
,名称空间设置为 default
,指向数据流名称 logs-generic-default
。
有关为 S3 存储桶创建 SQS 事件通知的更多信息,请阅读 AWS 文档。
您必须为任何要用作触发器的 SQS 队列设置 910
秒的可见性超时。这比 Elastic Serverless Forwarder Lambda 超时时间长 10 秒。
Amazon Kinesis 数据流
编辑转发器可以提取包含在 Kinesis 数据流记录有效负载中的日志,并将它们发送到 Elastic。Kinesis 数据流充当转发器的触发器。当新的记录写入 Kinesis 数据流时,它会触发 Lambda 函数。
您可以为每种类型的日志设置单独的 Kinesis 数据流。es_datastream_name
参数在配置文件中是必需的。如果此值设置为 Elasticsearch 数据流,则必须使用配置参数正确定义日志类型。单个配置文件可以包含多个输入部分,指向与特定日志类型匹配的不同数据流。
Amazon CloudWatch Logs 订阅筛选器
编辑转发器可以提取包含在 CloudWatch Logs 事件的消息有效负载中的日志,并将它们发送到 Elastic。CloudWatch Logs 服务充当转发器的触发器。当新的事件写入 CloudWatch Logs 日志流时,它会触发 Lambda 函数。
您可以为每种类型的日志设置单独的 CloudWatch Logs 组。es_datastream_name
参数在配置文件中是必需的。如果此值设置为 Elasticsearch 数据流,则必须使用配置参数正确定义日志类型。单个配置文件可以包含多个输入部分,指向与特定日志类型匹配的不同 CloudWatch Logs 组。
Amazon SQS 消息有效负载
编辑转发器可以提取包含在 Amazon SQS 主体记录有效负载中的日志,并将它们发送到 Elastic。SQS 队列充当转发器的触发器。当新的记录写入 SQS 队列时,Lambda 函数将被触发。
您可以为每种类型的日志设置单独的 SQS 队列。Elasticsearch 输出的配置参数 es_datastream_name
是必需的。如果此值设置为 Elasticsearch 数据流,则必须使用配置参数正确定义日志类型。单个配置文件可以包含多个输入部分,指向与特定日志类型匹配的不同 SQS 队列。
至少一次传递
编辑Elastic Serverless Forwarder 通过使用持续队列和重放队列来确保至少一次传递转发消息。
持续队列
编辑Elastic Serverless Forwarder 最多可以运行 15 分钟。不同的输入可以触发 Elastic Serverless Forwarder,每次执行触发器的有效负载大小都不同。有效负载的大小会影响要转发的事件数量。配置设置也可能会影响事件的数量,例如 定义包含/排除筛选器、从 JSON 对象列表中扩展事件 和 管理多行消息。
当 15 分钟的最长时间不足以转发单个 Elastic Serverless Forwarder 执行产生的所有事件时,持续队列有助于确保至少一次传递。
对于这种情况,在 15 分钟超时结束时保留两分钟的宽限期,以处理尚未处理的任何剩余事件。在此宽限期开始时,事件转发将停止。剩余时间专门用于将包含剩余事件的原始消息副本发送到持续队列。这种机制消除了需要在输入级别处理部分处理的需求,而这并非总是可能的(例如,在 Amazon CloudWatch Logs 订阅筛选器 的情况下)或不可取,因为它迫使用户符合用作输入的 AWS 资源的特定配置。
持续队列中的每条消息都包含与最后处理的偏移量相关的元数据以及对原始输入的引用。
您可以删除特定输入作为 Elastic Serverless Forwarder 的触发器。但是,在从 config.yaml 中删除其定义之前,请确保在输入仍然是触发器时生成的全部事件都已完全处理,包括复制到持续队列中的事件。持续队列中消息的处理需要在 config.yml
中查找原始输入。
在极不可能的情况下,如果 Elastic Serverless Forwarder 超过了其最大分配的执行时间并被强制终止,则持续队列将无法正确填充要处理的剩余消息的副本。在这种情况下,所有消息或部分消息可能会丢失,具体取决于用作输入的特定 AWS 资源及其配置。
为持续队列创建了一个 AWS SQS 死信队列。
当持续队列触发 Elastic Serverless Forwarder 时,在极不可能的情况下,如果它超过了其最大分配的执行时间并被强制终止,则触发 Elastic Serverless Forwarder 执行的有效负载中的消息不会从持续队列中删除,并且会触发另一个 Elastic Serverless Forwarder 执行。持续队列配置为最多接收 3 次,然后将消息发送到 DLQ。
重放队列
编辑Elastic Serverless Forwarder 将事件转发到为特定输入定义的输出。要转发的事件分组到批次中,可以根据具体的输出进行配置。转发事件到输出时可能会发生故障。根据输出类型,故障的粒度可以是针对整个事件批次,也可以是针对批次中的单个事件。发生故障的原因有很多,包括但不限于网络连接问题或输出服务不可用或处于压力之下。
重放队列有助于在转发事件发生故障时确保至少一次传递。
对于这种情况,转发事件批次后,将失败事件批次中所有未转发事件的副本发送到重放队列。发送到重放队列的每条消息都只包含一个未成功转发的事件。
可以启用重放队列作为 Elastic Serverless Forwarder 的触发器,以便再次转发队列中的事件。
在启用或禁用重放队列作为 Elastic Serverless Forwarder 的触发器之前,请考虑转发失败的具体原因。在大多数情况下,您应该先解决导致失败的根本问题,然后再尝试再次转发队列中的事件。根据问题的性质和影响,在未解决问题的情况下再次转发事件可能会导致新的失败,并将事件送回重放队列。在某些情况下,例如输出服务压力过大,建议您禁用重放队列作为 Elastic Serverless Forwarder 的触发器,因为继续转发事件可能会加剧问题。
当 Elastic Serverless Forwarder 由重放队列触发并且所有事件都成功转发时,Elastic Serverless Forwarder 执行成功,并且触发器有效负载中的消息会自动从重放队列中删除。
但是,如果任何事件再次转发失败,则包含成功事件的所有触发器有效负载中的消息将被删除,并且会引发特定的预期异常。Elastic Serverless Forwarder 执行被标记为失败,任何失败的消息都会被送回重放队列。
重放队列中的消息包含带有对事件的原始输入和原始输出的引用的元数据。
您可以将特定输入作为 Elastic Serverless Forwarder 的触发器删除。但是,在从 config.yaml 中删除其定义之前,请确保在输入仍然是触发器时未能摄取的所有事件都已完全处理。重放队列中消息的处理需要在config.yml
中查找原始输入和输出。
为重放队列创建了一个 AWS SQS 死信队列 (DLQ)。
同一消息最多可以返回重放队列三次。达到配置的最大接收次数 3 次后,该消息将发送到 DLQ。同一消息可能返回重放队列,原因可能是它包含再次转发失败的事件(根据计划设计),或者在不太可能的情况下,由队列触发的 Elastic Serverless Forwarder 超过了其最大分配的执行时间并被强制终止。在这种情况下,消息不会丢失,最终会发送到 DQL。