

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 向 Firehose 发送 CloudWatch 日志
<a name="writing-with-cloudwatch-logs"></a>

CloudWatch 可以使用 CloudWatch 订阅过滤器将日志事件发送到 Firehose。有关更多信息，请参阅[使用 Amazon Data Firehose 的订阅筛选条件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#FirehoseExample)。

CloudWatch 日志事件以压缩的 gzip 格式发送到 Firehose。如果您想将解压缩后的日志事件传送到 Firehose 目标，可以使用 Firehose 中的解压缩功能自动解压缩日志。 CloudWatch 

**重要**  
目前，Firehose 不支持将 CloudWatch 日志传送到亚马逊 OpenSearch 服务目标，因为亚马逊 CloudWatch 将多个日志事件合并到一个 Firehose 记录中，而亚马逊 OpenSearch 服务无法在一条记录中接受多个日志事件。作为替代方案，您可以考虑[在 CloudWatch 日志中使用亚马逊 OpenSearch 服务的订阅筛选条件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_OpenSearch_Stream.html)。

# 解压缩 CloudWatch 日志
<a name="writing-with-cloudwatch-logs-decompression"></a>

[如果您使用 Firehose 传送 CloudWatch 日志，并希望将解压缩后的数据传输到 Firehose 直播目标，请使用 Firehose [数据格式转换](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)（Parquet、ORC）或动态分区。](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html)您必须为 Firehose 流启用解压功能。

您可以使用 AWS 管理控制台、 AWS Command Line Interface 或 AWS SDKs启用解压功能。

**注意**  
如果您在直播上启用解压缩功能，请将该流专门用于 CloudWatch 日志订阅过滤器，而不是用于Vended Logs。如果您在用于同时采集日志和已售 CloudWatch 日志的流上启用解压缩功能，则向Firehose提取Vended Logs将失败。此解压缩功能仅适用于 CloudWatch 日志。

# 解压日志后提取消息 CloudWatch
<a name="Message_extraction"></a>

启用解压缩时，您可以选择同时启用消息提取。使用消息提取时，Firehose 会从解压缩的 CloudWatch 日志记录中筛选出所有元数据，例如所有者、日志组、日志流和其他元数据，并仅提供消息字段内的内容。如果您要将数据传输到 Splunk 目的地，则必须开启消息提取功能，Splunk 才能解析数据。以下是解压缩后的输出示例，无论是否具有消息提取。

图 1：没有消息提取的解压缩后的输出示例：

```
{
 "owner": "111111111111",
 "logGroup": "CloudTrail/logs",
 "logStream": "111111111111_CloudTrail/logs_us-east-1",
 "subscriptionFilters": [
 "Destination"
 ],
 "messageType": "DATA_MESSAGE",
 "logEvents": [
 {
 "id": "31953106606966983378809025079804211143289615424298221568",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root1\"}"
 },
 {
 "id": "31953106606966983378809025079804211143289615424298221569",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root2\"}"
 },
 {
 "id": "31953106606966983378809025079804211143289615424298221570",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root3\"}"
 }
 ]
}
```

图 2：有消息提取的解压缩后的输出示例：

```
{"eventVersion":"1.03","userIdentity":{"type":"Root1"}
{"eventVersion":"1.03","userIdentity":{"type":"Root2"}
{"eventVersion":"1.03","userIdentity":{"type":"Root3"}
```

# 通过控制台对新的 Firehose 流启用解压缩功能
<a name="writing-with-cloudwatch-logs-decompression-enabling-console"></a>

**要对新的 Firehose 直播启用解压功能，请使用 AWS 管理控制台**

1. [登录 AWS 管理控制台 并在 /kinesis 上打开 Kinesis 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/kinesis)

1. 在导航窗格中选择 **Amazon Data Firehose**。

1. 选择**创建 Firehose 流**。

1. 在**选择源和目的地**下  
****源****  
您的 Firehose 流的源。请选择下列源之一：  
   + **Direct PUT**：选择此选项可创建 Firehose 流，供生产者应用程序直接写入。有关与 Firehose 中的 Direct PUT 集成的 AWS 服务、代理以及开源服务的列表，请参阅[此](create-name.md)部分。
   + **Kinesis 流**：选择此选项，以配置使用 Kinesis 数据流作为数据来源的 Firehose 流。然后，您可以使用 Firehose 从现有 Kinesis 数据流轻松读取数据，并将其加载到目的地。有关更多信息，请参阅 [Writing to Firehose Using Kinesis Data Streams](https://docs.aws.amazon.com/firehose/latest/dev/writing-with-kinesis-streams.html)  
****目标位置****  
Firehose 流的目的地。选择下列选项之一：  
   + Amazon S3
   + Splunk

1. 在 **Firehose 流名称**下，输入您的流名称。

1. （可选）在**转换记录**下：
   + 在 “**从 Amazon CloudWatch Logs 解压源记录” 部分中，选择**开启解**压缩**。
   + 如果要在解压缩后使用消息提取，则请选择**开启消息提取**。

# 在现有 Firehose 流上启用解压缩功能
<a name="enabling-decompression-existing-stream-console"></a>

本节提供了关于在现有 Firehose 流中启用解压缩的说明。它涵盖了两种场景——禁用 Lambda 处理的流和已经启用 Lambda 处理的流。以下各节概述了每种情况的 step-by-step程序，包括创建或修改 Lambda 函数、更新 Firehose 设置以及监控 CloudWatch 指标，以确保成功实施内置 Firehose 解压缩功能。

## 禁用 Lambda 处理时启用解压缩
<a name="enabling-decomp-exist-stream-lam-disable"></a>

要在禁用 Lambda 处理的情况下对现有 Firehose 流启用解压缩，必须先启用 Lambda 处理。此条件仅对现有流有效。以下步骤说明如何对未启用 Lambda 处理的现有流启用解压缩。

1. 创建一个 Lambda 函数。您可以创建虚拟记录通道，也可以使用此[蓝图](https://github.com/aws-samples/aws-kinesis-firehose-resources/tree/main/blueprints/kinesis-firehose-cloudwatch-logs-processor)创建新的 Lambda 函数。

1. 更新您当前的 Firehose 流以启用 Lambda 处理并使用您创建的 Lambda 函数进行处理。

1. 使用新的 Lambda 函数更新流后，请返回 Firehose 控制台并启用解压缩功能。

1. 禁用您在步骤 1 中启用的 Lambda 处理。现在，您可以删除已在步骤 1 中创建的函数。

## 启用 Lambda 处理时启用解压缩
<a name="enabling-decomp-exist-stream-lam-enable"></a>

如果您已经有带有 Lambda 函数的 Firehose 流，要执行解压缩，可以将其替换为 Firehose 解压缩功能。在继续操作之前，请查看您的 Lambda 函数代码，以确认它仅执行解压缩或消息提取。您的 Lambda 函数的输出应与[图 1 或图 2](Message_extraction.md) 中显示的示例类似。如果输出看起来相似，则您可以使用以下步骤替换 Lambda 函数。

1. 将您当前的 Lambda 函数替换为此[蓝图](https://github.com/aws-samples/aws-kinesis-firehose-resources/tree/main/blueprints/kinesis-firehose-cloudwatch-logs-processor)。新的蓝图 Lambda 函数会自动检测传入的数据是被压缩还是解压缩。它只有在输入数据被压缩时才会执行解压缩。

1. 使用内置的 Firehose 选项开启解压缩功能，以进行解压缩。

1. 如果您的 Firehose 直播尚未启用，请启用该 CloudWatch 指标。监控指标 `CloudWatchProcessorLambda_IncomingCompressedData` 并等待至该指标变为零。这将确认发送到您的 Lambda 函数的所有输入数据均已解压缩，并且不再需要 Lambda 函数。

1. 移除 Lambda 数据转换，因为您不再需要此项来解压缩您的流。

# 在 Firehose 流中禁用解压缩
<a name="writing-with-cloudwatch-logs-decompression-disabling-console"></a>

****

要禁用对数据流的解压缩，请使用 AWS 管理控制台

1. [登录 AWS 管理控制台 并在 /kinesis 上打开 Kinesis 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/kinesis)

1. 在导航窗格中选择 **Amazon Data Firehose**。

1. 选择您要编辑的 Firehose 流。

1. 在 **Firehose 流详细信息**页面上，选择**配置**选项卡。

1. 在**转换记录**部分，选择**编辑**。

1. 在 “**从 Amazon CloudWatch Logs 解压源记录**” 下，清除 “**开启解压缩**”，然后选择 “**保存**更改”。

# 对 Firehose 中的解压缩进行问题排查
<a name="decomp-faq"></a>

下表显示了 Firehose 如何处理数据解压缩和处理期间的错误，包括将记录传输到 S3 错误存储桶、日志记录错误和发出指标。其中还解释了未经授权的数据放置操作返回的错误消息。


| 问题 | 解决方案 | 
| --- | --- | 
| 如果在解压缩过程中出现错误，源数据会发生什么？ |  如果 Amazon Data Firehose 无法解压缩记录，则记录将按原样（以压缩格式）传输到您在 Firehose 流创建期间指定的 S3 错误存储桶。除了记录外，传输的对象还包括错误代码和错误消息，这些对象将传输到名为 `decompression-failed` 的 S3 存储桶前缀。记录解压缩失败后，Firehose 将继续处理其他记录。  | 
| 成功解压缩后，如果处理管道出现错误，源数据会发生什么？ |  如果 Amazon Data Firehose 在解压后的处理步骤（例如，动态分区和数据格式转换）中出错，则记录将以压缩格式传输到您在创建 Firehose 流时指定的 S3 错误存储桶。除了记录外，传输的对象还包括错误代码和错误消息。  | 
| 如果出现错误或异常，要如何通知您？ |  如果在解压缩过程中出现错误或异常，如果您配置 CloudWatch 日志，Firehose 会将错误消息 CloudWatch 记录到日志中。此外，Firehose 还会向您可以 CloudWatch 监控的指标发送指标。您还可以选择根据 Firehose 发出的指标来创建警报。  | 
| 当put操作不是来自 CloudWatch 日志时会发生什么？ | 如果客户不是puts来自 CloudWatch Logs，则会返回以下错误消息：<pre>Put to Firehose failed for AccountId: <accountID>, FirehoseName:  <firehosename> because the request is not originating from allowed source types.</pre> | 
| Firehose 为解压缩功能发出了哪些指标？ | Firehose 发出每条记录的解压缩指标。您应该选择周期（1 分钟）、统计数据（总和）、日期范围，以获取 DecompressedRecords 失败或成功或 DecompressedBytes 失败或成功的次数。有关更多信息，请参阅 [CloudWatch 日志解压缩指标](monitoring-with-cloudwatch-metrics.md#decompression-metrics-cw)。 | 