

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

# Amazon QLDB 流式传输日记账数据
<a name="streams"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

Amazon QLDB 使用不可变的事务日志（称为*日记账*）进行数据存储。日记账会跟踪已提交数据的每一次更改，并保存完整、可验证的更改历史记录。

您可以在 QLDB 中创建一个*流*，其捕获提交到您日记账的每个文档修订版本，并将此数据近实时传送到 [Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams)。QLDB 流是从分类账的日记账到 Kinesis Data Streams 资源的连续数据流。

然后，您使用 Kinesis 流平台或 *Kinesis Client Library* 来使用流、处理数据记录和分析数据内容。QLDB 流通过三种类型的记录将您的数据写入 Kinesis Data Streams：*控件*、*区块摘要*和*修订详情*。有关更多信息，请参阅[QLDB 在 Kinesis 中流记录](streams.records.md)。

**Topics**
+ [常见使用案例](#streams.use-cases)
+ [消耗您的流](#streams.consuming)
+ [交付保证](#streams.delivery)
+ [传送延迟注意事项](#streams.delivery-latency)
+ [数据流入门](#streams.getting-started)
+ [在 QLDB 中创建和管理流](streams.create.md)
+ [在 QLDB 中使用流进行开发](streams.sdk.md)
+ [QLDB 在 Kinesis 中流记录](streams.records.md)
+ [QLDB 中的流权限](streams.perms.md)
+ [QLDB 中日记账流的常见错误](streams.errors.md)

## 常见使用案例
<a name="streams.use-cases"></a>

流式传输使您能够将 QLDB 作为单一、可验证的真实来源，并将日记账数据与其他服务集成。以下是 QLDB 日记账流支持的一些常见用例：
+ **事件驱动架构** - 使用解耦组件以事件驱动的架构风格构建应用程序。例如，银行可以使用 AWS Lambda 功能来实现通知系统，当客户的账户余额降至阈值以下时，该系统会提醒客户。在这样的系统中，账户余额保存在 QLDB 分类账中，任何余额变化都记录在日记账中。该 AWS Lambda 函数可以在消耗提交到日志并发送到 Kinesis 数据流的余额更新事件时触发通知逻辑。
+ **实时分析** - 构建 Kinesis 使用者应用程序，对事件数据进行实时分析。借助此功能，您可以近乎实时地获得见解，并对不断变化的业务环境做出快速响应。例如，电子商务网站可以分析产品销售数据，并在销售达到限制时立即停止打折产品的广告。
+ **历史分析** — 通过重播历史事件数据，利用 Amazon QLDB 面向日记账的架构。您可以选择从过去任何时间点开始 QLDB 流，在该流中，自那时以来的所有修订都将传输到 Kinesis Data Streams。使用此功能，您可以构建 Kinesis 使用者应用程序，对历史数据运行分析作业。例如，电子商务网站可以根据需要运行分析，从而生成以前未捕获的过去销售指标。
+ **复制到专用数据库 —** 使用 QLDB 日记账流将 QLDB 分类账连接到其他专门构建的数据存储。例如，使用 Kinesis 流数据平台与亚马逊 OpenSearch 服务集成，后者可以为 QLDB 文档提供全文搜索功能。您还可以构建自定义 Kinesis 使用者应用程序，将您的日记账数据复制到其他提供不同实体化视图的专用数据库。例如，将关系数据复制到 Amazon Aurora，或者将基于图表的数据复制到 Amazon Neptune。

## 消耗您的流
<a name="streams.consuming"></a>

使用 Kinesis Data Streams 持续使用、处理和分析大量数据记录。除了 Kinesis Data Streams 之外，Kinesis 流数据平台还包括[亚马逊数据 Firehose 和适用于 Apach](https://docs.aws.amazon.com/firehose/latest/dev/) [e Flink 的亚马逊托](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/)管服务。您可以使用此平台将数据记录直接发送到亚马逊服务、Amazon Redshift、Amazon S3 或 Splunk 等 OpenSearch 服务。有关更多信息，请参阅 *Amazon Kinesis 数据流开发人员指南* 中的 [Amazon Kinesis Data Streams 消费者](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-consumers.html)。

您还可以使用 Kinesis 客户端库（KCL）构建流使用者应用程序，从而以自定义方式处理数据记录。KCL 提供低级 Kinesis Data Streams API 之上的有用抽象来简化编码。要了解有关 KCL 的详细信息，请参阅 *Amazon Kinesis Data Streams 开发人员指南*的[使用 Kinesis 客户端库](https://docs.aws.amazon.com/streams/latest/dev/shared-throughput-kcl-consumers.html)。

## 交付保证
<a name="streams.delivery"></a>

QLDB 直播提供了*at-least-once*传输保证。由 QLDB 流生成的每条[数据记录](streams.records.md)至少会传输到 Kinesis Data Streams 一次。相同的记录可以多次出现在 Kinesis 数据流中。因此，如果您的使用案例需要，您必须在消费应用程序层中实现去重逻辑。

也没有订购保证。在某些情况下，可能会在 Kinesis 数据流中乱序生成 QLDB 区块和修订。有关更多信息，请参阅[处理重复和 out-of-order记录](streams.records.md#streams.records.ordering)。

## 传送延迟注意事项
<a name="streams.delivery-latency"></a>

QLDB流通常以接近实时的方式将更新传递到 Kinesis Data Streams。但是，在将新提交的 QLDB 数据发送到 Kinesis 数据流之前，以下情况可能会造成其他的延迟：
+ Kinesis 可以限制从 QLDB 流式传输的数据，具体取决于您的 Kinesis Data Streams 配置如何。例如，如果您有多个 QLDB 流写入单个 Kinesis 数据流，而 QLDB 的请求速率超过 Kinesis 流资源的容量，则可能发生这种情况。在使用按需预配时，如果吞吐量在不到 15 分钟内增长到超过前一个峰值的两倍以上，Kinesis 中也可能发生节流。

  您可以通过监控 Kinesis 指标 `WriteProvisionedThroughputExceeded` 来衡量超过的吞吐量。有关更多信息和可能的解决方案，请参阅[如何排查 Kinesis Data Streams 中的节流错误问题？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-stream-throttling-errors/)。
+ 使用 QLDB 流，您可以创建一个不确定的流，其*开始日期和时间*为过去且没有*结束日期和时间*。根据设计，只有在成功交付指定开始日期和时间的所有先前数据之后，QLDB 才开始向 Kinesis Data Streams 发送新提交的数据。如果您在这种情况下感觉到额外的延迟，您可能需要等待先前的数据被传递，或者您可以从较晚的开始日期和时间开始流。

## 数据流入门
<a name="streams.getting-started"></a>

以下简要概述了开始将日记账数据流式传输到 Kinesis Data Streams 所需的步骤：

1. 创建 Kinesis Data Streams 资源。有关说明，请参阅 *Amazon Kinesis Data Streams 开发者指南*中的[创建和更新数据流](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-streams.html)。

1. 创建一个 IAM 角色，允许 QLDB 承担对Kinesis 数据流进行写入操作的权限。有关说明，请参阅 [QLDB 中的流权限](streams.perms.md)。

1. 创建 QLDB 日记账流。有关说明，请参阅 [在 QLDB 中创建和管理流](streams.create.md)。

1. 如上一节[消耗您的流](#streams.consuming)所述，使用 Kinesis 数据流。有关演示如何使用 Kinesis 客户端库或的代码示例 AWS Lambda，请参阅。[在 QLDB 中使用流进行开发](streams.sdk.md)

# 在 QLDB 中创建和管理流
<a name="streams.create"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

Amazon QLDB 提供 API 操作，用于创建和管理从您的分类账到 Amazon Kinesis Data Streams 的日记账数据流。QLDB 流捕获提交到日记账的每个文档修订，然后将其发送到 Kinesis 数据流。

您可以使用 AWS 管理控制台、S AWS DK 或 AWS Command Line Interface (AWS CLI) 来创建日记流。此外，您还可以使用 [AWS CloudFormation](https://aws.amazon.com/cloudformation) 模板来创建流。有关更多信息，请参阅《*AWS CloudFormation 用户指南*》中的[AWS::QLDB::Stream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html)资源。

**Topics**
+ [流参数](#streams.create.params)
+ [流 ARN](#streams.create.arn)
+ [AWS 管理控制台](#streams.create.con)
+ [流状态](#streams.create.states)
+ [处理受损流](#streams.create.impaired)

## 流参数
<a name="streams.create.params"></a>

要创建 QLDB 日记账流，您必须提供以下配置参数：

**分类账**  
您想将其日记账数据流式传输到 Kinesis Data Streams 的 QLDB 分类账。

**流名称**  
要分配给 QLDB 日记账流的名称。用户定义的名称有助于识别和指示流的用途。  
您的流名称在给定分类账的其他*活动的* 流中必须是唯一的。流名称与分类账名称具有相同的命名约束，如 [Amazon QLDB 资源中的限额和限制](limits.md#limits.naming) 中所定义。  
除了流名称外，QLDB 还会为您创建的每个 QLDB 流分配一个*流 ID*。在给定分类账的所有流中，流 ID 是唯一的，无论其状态如何。

**开始日期和时间**  
开始流式传输日记账数据的开始日期和时间。此值可以是过去的任何日期和时间，但是不能是将来的任何日期和时间。

**结束日期和时间**  
（可选）指定流结束的日期和时间。  
如果您创建了一个没有结束时间的无限期流，您必须手动取消它以结束流。您还可以取消一个尚未达到指定结束日期和时间的活动有限流。

**目标 Kinesis 数据流**  
您的数据流写入数据记录的 Kinesis Data Streams 目标资源。要了解如何创建 Kinesis 数据流，请参阅*Amazon Kinesis Data Streams 开发者指南* 中的 [创建和更新数据流](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-streams.html)。  
+ 不支持跨账户和跨区域流。指定的Kinesis数据流必须与您的账本位于相同的​​ AWS 区域 和分类账中。
+ **默认情况下，Kinesis Data Streams 中的*记录聚合*处于启用状态。**此选项使 QLDB 能够在单个 Kinesis 数据流记录中发布多个数据记录，从而增加每个 API 调用发送的记录数量。

  记录聚合对记录处理具有重要影响，并且**需要在流使用者**中取消聚合。要了解更多信息，请参阅 *《Amazon Kinesis Data Streams 开发人员指南》* 中的 [KPL 主要概念](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html#kinesis-kpl-concepts-aggretation)以及[使用者取消聚合](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-consumer-deaggregation.html)。

**IAM 角色**  
允许 QLDB 承担您的 Kinesis 数据流的写入权限的 IAM 角色。您可以使用 QLDB 控制台自动创建此角色，也可以在 IAM 中手动创建该角色。要了解如何手动创建，请参阅[流权限](streams.perms.md)。  
要在请求日记账流时将角色传递给 QLDB，您必须具有对 IAM 角色资源执行 `iam:PassRole` 操作的权限。

## 流 ARN
<a name="streams.create.arn"></a>

每个 QLDB 日记账流都是分类账的子资源，由 Amazon 资源名称（ARN）进行唯一标识。以下是名为 `IiPT4brpZCqCq3f4MTHbYy` 分类账​​而且流 ID 为 `exampleLedger` ​​的 QLDB 流的示例 ARN。

```
arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy
```

以下部分介绍如何使用 AWS 管理控制台创建和取消 QLDB 流式传输。

## AWS 管理控制台
<a name="streams.create.con"></a>

按照以下步骤，使用 QLDB 控制台创建或取消 QLDB 流。

**创建流（控制台）**

1. [登录并打开亚马逊 QLDB 控制台，网址为 /qldb。 AWS 管理控制台 https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **Streams（流）**。

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

1. 在 **创建 QLDB 流**页面，输入以下设置：
   + **流名称** - 要分配给 QLDB 日记账流的名称。
   + **分类账** — 要流式传输其日记账数据的分类账。
   + **开始日期和时间**：开始流式传输日记账数据的开始时间戳（UTC）。此时间戳默认为当前日期和时间。时间不能在将来中，并且必须早于**结束日期和时间**。
   + **结束日期和时间**-（可选）指定流结束时间的互斥的时间戳（UTC）。如果不定义此参数，则流将无限期运行，直到您取消它。
   + **目标流** — 您的数据流向其写入数据记录的 Kinesis Data Streams 目标资源。采用以下 ARN 格式。

     ```
     arn:aws:kinesis:aws-region:account-id:stream/kinesis-stream-name
     ```

     以下是示例。

     ```
     arn:aws:kinesis:us-east-1:123456789012:stream/stream-for-qldb
     ```

     不支持跨账户和跨区域流。指定的 Kinesis 数据流必须与您的账本处于相同 AWS 区域 和账户中。
   + **在 Kinesis Data Streams 中启用记录聚合**-（默认启用）允许 QLDB 在单个 Kinesis Data Streams 记录中发布多个数据记录，从而增加每个 API 调用发送的记录数量。
   + **服务访问权限** — 授予 QLDB 对您的 Kinesis 数据流的写入权限的 IAM 角色。

     *要在请求日记账流时将角色传递给 QLDB，您必须具有对 IAM 角色资源执行 `iam:PassRole` 操作的权限。*
     + **创建和使用新的服务角色** - 让控制台为您创建一个具有指定 Kinesis 数据流所需权限的新角色。
     + **使用现有的服务角色**-要了解如何在 IAM 中手动创建此角色，请参阅[流权限](streams.perms.md)。
   + **标签** –（可选）通过以键值对的形式附加标签来向角色添加元数据。您可以向流中添加标签来帮助组织和标识这些它们。有关更多信息，请参阅[为 Amazon QLDB 资源贴标签](tagging.md)。

     选择**添加标签**，然后根据需要输入任何键值对。

1. 根据需要进行设置后，选择 **创建 QLDB 流**。

   如果您的请求提交成功，控制台将返回主**流**页面，并列出您的 QLDB 流及其当前状态。

1. 在您的流处于活动状态之后，使用 Kinesis 来使用一个[使用者应用程序](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-consumers.html)处理您的流数据。

   打开 Kinesis Data Streams 控制台 [https://console.aws.amazon.com/kinesis/](https://console.aws.amazon.com/kinesis/)，网址为。

有关流中数据记录格式的信息，请参阅 [QLDB 在 Kinesis 中流记录](streams.records.md)。

要了解如何处理导致错误的流，请参阅[处理受损流](#streams.create.impaired)。

**取消流（控制台）**

取消 QLDB 流后，您将无法重启该流。要恢复向 Kinesis Data Streams 传输数据，您可以创建一个新的 QLDB 流。

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **Streams（流）**。

1. 在 QLDB 流列表中，选择要取消的当前流流。

1. 选择 **取消流**。请在提供的框中输入 **cancel stream** ​​以确认。

有关将 QLDB API 与 SDK 配合 AWS 使用来创建和管理日记流的信息，请参阅。 AWS CLI [在 QLDB 中使用流进行开发](streams.sdk.md)

## 流状态
<a name="streams.create.states"></a>

QLDB 流可能处于以下状态之一：
+ `ACTIVE`— 当前正在流式传输或等待流式传输数据（对于没有结束时间的无限期流）。
+ `COMPLETED`— 已成功完成指定时间范围内所有日记账区块的流式传输。这是最终状态。

  
+ `CANCELED`— 在指定的结束时间之前由用户请求结束，并且不再主动流式传输数据。这是最终状态。
+ `IMPAIRED`— 由于出现需要您采取措施的错误，无法向 Kinesis 写入记录。这是一种可恢复的非终止状态。

  如果您在一小时内解决了错误，则流会自动进入 `ACTIVE` 状态。如果错误在一小时后仍未解决，则流会自动进入 `FAILED` 状态。
+ `FAILED`— 由于出错，无法向 Kinesis 写入记录，并且处于无法恢复的终止状态。

下图说明了 QLDB 流资源如何在状态之间转换。

![\[状态图显示了 QLDB 流资源如何在活动、已取消、已完成、受损和失败状态之间转换。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/stream-states.png)


### 终端流到期
<a name="streams.create.states.expiration"></a>

处于终端状态（`CANCELED`、`COMPLETED`、和`FAILED`）的流资源的保留期为 7 天。此限制到期后，它们会自动被硬删除。

删除终端流后，您将无法再使用 QLDB 控制台或 QLDB API 来描述或列出流资源。

## 处理受损流
<a name="streams.create.impaired"></a>

如果您的流遇到错误，它会先移至 `IMPAIRED` 状态。QLDB 会继续 `IMPAIRED`重 试流长达一小时。

如果您在一小时内解决了错误，则流会自动进入 `ACTIVE` 状态。如果错误在一小时后仍未解决，则流会自动进入 `FAILED` 状态。

受损或失败的流可能由以下错误原因之一：
+ `KINESIS_STREAM_NOT_FOUND`— 目标 Kinesis Data Streams 资源不存在。验证您在 QLDB 流请求中提供的 Kinesis 数据流是否正确。然后，前往 Kinesis 并创建您指定的数据流。
+ `IAM_PERMISSION_REVOKED`— QLDB 没有足够的权限将数据记录写入您指定的 Kinesis 数据流。请确认您是否为指定的 Kinesis 数据流定义了一个策略，该策略授予 QLDB 服务（`qldb.amazonaws.com`）对以下操作的权限：
  + `kinesis:PutRecord`
  + `kinesis:PutRecords`
  + `kinesis:DescribeStream`
  + `kinesis:ListShards`

### 监控受损流
<a name="streams.create.impaired.monitor"></a>

如果流受损，QLDB 控制台会显示一条横幅，显示有关该流及其遇到的错误的详细信息。您还可以使用 `DescribeJournalKinesisStream` API 操作来获取流的状态和潜在的错误原因。

此外，您还可以使用 Amazon CloudWatch 创建用于监控直播`IsImpaired`指标的警报。有关使用监控 QLDB 指标 CloudWatch的信息，请参阅。[Amazon QLDB 指标与维度](monitoring-cloudwatch.md#qldb-metrics-dimensions)

# 在 QLDB 中使用流进行开发
<a name="streams.sdk"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

本节总结了您可以与 AWS 软件开发工具包一起使用的 API 操作，或者在 Amazon QLDB 中创建和管理日记流。 AWS CLI 它还描述了演示这些操作并使用 Kinesis 客户端库（KCL）或 AWS Lambda 实现流使用者的示例应用程序。

可以使用 KCL 为 Amazon Kinesis Data Streams 构建用户应用程序。KCL 提供低级 Kinesis Data Streams API 之上的有用抽象来简化编码。要了解有关 KCL 的详细信息，请参阅 *Amazon Kinesis Data Streams 开发人员指南*的[使用 Kinesis 客户端库](https://docs.aws.amazon.com/streams/latest/dev/shared-throughput-kcl-consumers.html)。

**Contents**
+ [QLDB 日记流 APIs](#streams.sdk.api)
+ [示例应用程序](#streams.sdk.samples)
  + [基本操作（Java）](#streams.sdk.samples.basic)
  + [与 OpenSearch 服务集成 (Python)](#streams.sdk.samples.elastic)
  + [与 Amazon SNS 和 Amazon SNS 和 Amazon SSS（Python）集成](#streams.sdk.samples.sns)

## QLDB 日记流 APIs
<a name="streams.sdk.api"></a>

QLDB API 提供以下日记账流操作以供应用程序使用：
+ `StreamJournalToKinesis`— 为给定的 QLDB 分类账创建日记账流。流捕获提交到分类账的日记账的每个文档修订，并将数据传送到指定的 Amazon Kinesis Data Streams 资源。
  + **默认情况下，Kinesis Data Streams 中的*记录聚合*处于启用状态。**此选项使 QLDB 能够在单个 Kinesis 数据流记录中发布多个数据记录，从而增加每个 API 调用发送的记录数量。

    记录聚合对记录处理具有重要影响，并且**需要在流使用者**中取消聚合。要了解更多信息，请参阅 *《Amazon Kinesis Data Streams 开发人员指南》* 中的 [KPL 主要概念](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html#kinesis-kpl-concepts-aggretation)以及[使用者取消聚合](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-consumer-deaggregation.html)。
+ `DescribeJournalKinesisStream` — 返回有关给定 QLDB 日记账流的详细信息。输出包括 ARN、流名称、当前状态、创建时间和原始流创建请求的参数。
+ `ListJournalKinesisStreamsForLedger`— 返回给定分类账的所有 QLDB 日记账流描述符的列表。每个流描述符的输出都包含返回的`DescribeJournalKinesisStream`相同细节。
+ `CancelJournalKinesisStream`— 结束给定的 QLDB 日记账流。在取消流式传输前，当前状态必须为`ACTIVE`。

  停止历程后，您无法重新启动历程。要恢复向 Kinesis Data Streams 传输数据，您可以创建一个新的 QLDB 流。

有关这些 API 操作的完整介绍，请参阅 [Amazon QLDB API 参考](api-reference.md)。

有关使用创建和管理日记流的信息 AWS CLI，请参阅《[AWS CLI 命令参考](https://docs.aws.amazon.com/cli/latest/reference/qldb/index.html)》。

## 示例应用程序
<a name="streams.sdk.samples"></a>

QLDB 提供了演示使用日记账流进行各种操作的示例应用程序。这些应用程序在[AWS 示例 GitHub 网站上](https://github.com/aws-samples/?q=qldb)是开源的。

**Topics**
+ [基本操作（Java）](#streams.sdk.samples.basic)
+ [与 OpenSearch 服务集成 (Python)](#streams.sdk.samples.elastic)
+ [与 Amazon SNS 和 Amazon SNS 和 Amazon SSS（Python）集成](#streams.sdk.samples.sns)

### 基本操作（Java）
<a name="streams.sdk.samples.basic"></a>

[有关演示 QLDB 日记流基本操作的 Java 代码示例，请参阅 GitHub 存储库 aws-samples/-java。amazon-qldb-dmv-sample](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/tree/master/src/main/java/software/amazon/qldb/tutorial/streams)有关如何下载和安装此示例应用程序的说明，请参阅 [安装 Amazon QLDB Java 示例应用程序](sample-app.java.md)。

**注意**  
安装应用程序后，不要继续执行 Java 教程的*步骤 1* 来创建分类账。此流媒体示例应用程序将为您创建 `vehicle-registration`分 类账。

此示例应用程序打包了来自 [Java 教程](getting-started.java.tutorial.md) 及其依赖项的完整源代码，包括以下模块：
+ [适用于 Java 的 AWS SDK](https://aws.amazon.com/sdk-for-java)— 创建和删除 QLDB 和 Kinesis Data Streams 资源，包括分类账、QLDB 日记账流和 Kinesis 数据流。
+ [适用于 Java 的 Amazon QLDB 驱动程序](getting-started.java.md)— 使用 PartiQL 语句在分类账上运行数据事务，包括创建表和插入文档。
+ [Kinesis 客户端库](https://docs.aws.amazon.com/streams/latest/dev/developing-consumers-with-kcl.html)：使用和处理 Kinesis 数据流中的数据。

**运行代码**

该[StreamJournal](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/streams/StreamJournal.java)类包含演示以下操作的教程代码：

1. 创建名为的分类账`vehicle-registration`，创建表，然后在其中加载示例数据。
**注意**  
在运行此代码之前，请确保您还没有名为 `vehicle-registration` 的活动分类账。

1. 创建 Kinesis 数据流、一个允许 QLDB 担任 Kinesis 数据流写入权限的 IAM 角色和 QLDB 日记账流。

1. 使用 KCL 启动流读取器，该读取器处理 Kinesis 数据流并记录每条 QLDB 数据记录。

1. 使用流数据来验证 `vehicle-registration` 示例分类账的哈希链。

1. 通过停止流读取器、取消 QLDB 日记账流、删除分类账和删除 Kinesis 数据流来清理所有资源。

要运行`StreamJournal`教程代码，请从项目根目录中输入以下 Gradle 命令。

```
./gradlew run -Dtutorial=streams.StreamJournal
```

### 与 OpenSearch 服务集成 (Python)
<a name="streams.sdk.samples.elastic"></a>

[有关演示如何将 QLDB 流与 OpenSearch 亚马逊服务集成的 Python 示例应用程序，请参阅 GitHub 存储库 aws-samples/-。amazon-qldb-streaming-amazon opensearch-service-sample-python](https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python)此应用程序使用 AWS Lambda 函数来实现 Kinesis Data Streams 使用者。

在命令行输入以下 `git` 命令以克隆存储库。

```
git clone https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python.git
```

要运行示例应用程序，请参阅上的[自述文件](https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python/blob/master/README.md) GitHub 以获取说明。

### 与 Amazon SNS 和 Amazon SNS 和 Amazon SSS（Python）集成
<a name="streams.sdk.samples.sns"></a>

[有关演示如何将 QLDB 流与亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 集成的 Python 示例应用程序，请参阅存储库 aws-samples/-。 GitHub amazon-qldb-streams-dmv sample-lambda-python](https://github.com/aws-samples/amazon-qldb-streams-dmv-sample-lambda-python)

此应用程序使用 AWS Lambda 函数来实现 Kinesis Data Streams 使用者。它向 Amazon SNS 主题发送消息，该主题已订阅 Amazon Simple Queue Service（Amazon SQS）队列。

在命令行输入以下 `git` 命令以克隆存储库。

```
git clone https://github.com/aws-samples/amazon-qldb-streams-dmv-sample-lambda-python.git
```

要运行示例应用程序，请参阅上的[自述文件](https://github.com/aws-samples/amazon-qldb-streams-dmv-sample-lambda-python/blob/master/README.md) GitHub 以获取说明。

# QLDB 在 Kinesis 中流记录
<a name="streams.records"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

*Amazon QLDB 流向给定的 Amazon Kinesis Data Streams *资源*写入三种类型的数据记录：控件、*区块摘要*和修订详情*。所有三种记录类型均以 [Amazon Ion 格式](ion.md)的*二进制表示*形式写入。

控制记录显示您的 QLDB 流的开始和完成。每当有修订提交到您的日记账时，QLDB 流都会写入所有相关的日记账块数据，包括块摘要和修订详细信息记录。

这三种记录类型是多态的。它们都由一条通用的顶级记录组成，其中包含 QLDB 流 ARN、记录类型和记录有效载荷。此顶级记录采用以下格式。

```
{
  qldbStreamArn: string,
  recordType: string,
  payload: {
    //control | block summary | revision details record
  }
}
```

`recordType` 字段可能具有三个值：
+ `CONTROL`
+ `BLOCK_SUMMARY`
+ `REVISION_DETAILS`

以下各节描述每个单独有效载荷记录的格式和内容。

**注意**  
QLDB 以 Amazon Ion 的二进制表示形式将所有流记录写入 Kinesis Data Streams。在 Ion 的文本表示形式中提供了以下示例，以可读格式说明记录内容。

**Topics**
+ [控制层面](#streams.records.control)
+ [屏蔽摘要记录](#streams.records.block)
+ [修订详细信息记录](#streams.records.revision)
+ [处理重复和 out-of-order记录](#streams.records.ordering)

## 控制层面
<a name="streams.records.control"></a>

QLDB 流*写入*控制记录以指示其开始和完成事件。以下是每个​​ `controlRecordType` 的控制记录示例，包含样本数据：
+ `CREATED`— QLDB 流写入 Kinesis 的第一条记录，表示您新创建的流处于活动状态。

  ```
  {
    qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
    recordType:"CONTROL",
    payload:{
      controlRecordType:"CREATED"
    }
  }
  ```
+ `COMPLETED`— QLDB 流写入 Kinesis 的最后一条记录，表示您的流已到达指定的结束日期和时间。如果您取消流，则不会写入此记录。

  ```
  {
    qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
    recordType:"CONTROL",
    payload:{
      controlRecordType:"COMPLETED"
    }
  }
  ```

## 屏蔽摘要记录
<a name="streams.records.block"></a>

*区块摘要*记录表示提交您的文档修订的日记账区块。[区块](journal-contents.md)是在事务过程中提交到您的 QLDB 日记账的对象。

区块摘要记录的有效载荷包含提交块的块地址、时间戳和其他元数据。它还包括块中修订的摘要属性以及提交这些修订的 PartiQL 语句。以下是包含示例数据的区块摘要记录的示例。

**注意**  
此区块摘要示例仅供参考。显示的哈希值并非实际计算的哈希值。

```
{
  qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
  recordType:"BLOCK_SUMMARY",
  payload:{
    blockAddress:{
      strandId:"ElYL30RGoqrFCbbaQn3K6m",
      sequenceNo:60807
    },
    transactionId:"9RWohCo7My4GGkxRETAJ6M",
    blockTimestamp:2019-09-18T17:00:14.601000001Z,
    blockHash:{{6Pk9KDYJd38ci09oaHxx0D2grtgh4QBBqbDS6i9quX8=}},
    entriesHash:{{r5YoH6+NXDXxgoRzPREGAWJfn73KlZE0eTfbTxZWUDU=}},
    previousBlockHash:{{K3ti0Agk7DEponywKcQCPRYVHb5RuyxdmQFTfrloptA=}},
    entriesHashList:[
      {{pbzvz6ofJC7mD2jvgfyrY/VtR01zIZHoWy8T1VcxlGo=}},
      {{k2brC23DLMercmiOWHiURaGwHu0mQtLzdNPuviE2rcs=}},
      {{hvw1EV8k4oOkIO36kblO/+UUSFUQqCanKuDGr0aP9nQ=}},
      {{ZrLbkyzDcpJ9KWsZMZqRuKUkG/czLIJ4US+K5E31b+Q=}}
    ],
    transactionInfo:{
      statements:[
        {
          statement:"SELECT * FROM Person WHERE GovId = ?",
          startTime:2019-09-18T17:00:14.587Z,
          statementDigest:{{p4Dn0DiuYD3Xm9UQQ75YLwmoMbSfJmopOmTfMnXs26M=}}
        },
        {
          statement:"INSERT INTO Person ?",
          startTime:2019-09-18T17:00:14.594Z,
          statementDigest:{{klMLkLfa5VJqk6JUPtHkQpOsDdG4HmuUaq/VaApQflU=}}
        },
        {
          statement:"INSERT INTO VehicleRegistration ?",
          startTime:2019-09-18T17:00:14.598Z,
          statementDigest:{{B0gO9BWVNrzRYFoe7t+GVLpJ6uZcLKf5t/chkfRhspI=}}
        }
      ],
      documents:{
        '7z2OpEBgVCvCtwvx4a2JGn':{
          tableName:"Person",
          tableId:"LSkFkQvkIOjCmpTZpkfpn9",
          statements:[1]
        },
        'K0FpsSLpydLDr7hi6KUzqk':{
          tableName:"VehicleRegistration",
          tableId:"Ad3A07z0ZffC7Gpso7BXyO",
          statements:[2]
        }
      }
    },
    revisionSummaries:[
      {
        hash:{{uDthuiqSy4FwjZssyCiyFd90XoPSlIwomHBdF/OrmkE=}},
        documentId:"7z2OpEBgVCvCtwvx4a2JGn"
      },
      {
        hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}},
        documentId:"K0FpsSLpydLDr7hi6KUzqk"
      }
    ]
  }
}
```

在 `revisionSummaries` 字段，某些修订可能没有 `documentId`。这是仅供内部使用的系统修订版，不包含用户数据。QLDB 流将这些修订包含在各自的区块摘要记录中，因为这些修订的哈希值是日记完整哈希链的一部分。加密验证需要完整的哈希链。

只有具有文档 ID 的修订才会在单独的修订详细信息记录中发布，如下节所述。

## 修订详细信息记录
<a name="streams.records.revision"></a>

*修订详细信息*记录表示提交到您的日记的文档修订。有效载荷包含修订的[提交视图](working.metadata.md)中的所有属性，以及相关的表名称和表ID。以下是带有示例数据的修订记录的示例。

```
{
  qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
  recordType:"REVISION_DETAILS",
  payload:{
    tableInfo:{
      tableName:"VehicleRegistration",
      tableId:"Ad3A07z0ZffC7Gpso7BXyO"
    },
    revision:{
      blockAddress:{
        strandId:"ElYL30RGoqrFCbbaQn3K6m",
        sequenceNo:60807
      },
      hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}},
      data:{
        VIN:"1N4AL11D75C109151",
        LicensePlateNumber:"LEWISR261LL",
        State:"WA",
        City:"Seattle",
        PendingPenaltyTicketAmount:90.25,
        ValidFromDate:2017-08-21,
        ValidToDate:2020-05-11,
        Owners:{
          PrimaryOwner:{PersonId:"7z2OpEBgVCvCtwvx4a2JGn"},
          SecondaryOwners:[]
        }
      },
      metadata:{
        id:"K0FpsSLpydLDr7hi6KUzqk",
        version:0,
        txTime:2019-09-18T17:00:14.602Z,
        txId:"9RWohCo7My4GGkxRETAJ6M"
      }
    }
  }
}
```

## 处理重复和 out-of-order记录
<a name="streams.records.ordering"></a>

QLDB 直播可以向 Kinesis Data Streams 发布副本 out-of-order和记录。因此，使用者应用程序可能需要实现自己的逻辑来识别和处理此类场景。区块摘要和修订详细信息记录包括可用于此目的的字段。结合下游服务的特征，这些字段既可以表示记录的唯一身份，也可以表示严格的记录顺序。

例如，假设一个将 QLDB 与索引集成的流，以提供 OpenSearch 对文档的全文搜索功能。在此用例中，您需要避免索引文档的陈旧 (out-of-order) 修订版。要强制执行排序和重复数据删除，您可以使用中的文档 ID 和外部版本字段 OpenSearch，以及修订详细信息记录中的文档 ID 和版本字段。

[有关将 QLDB 与 OpenSearch Amazon Service 集成的示例应用程序中的重复数据删除逻辑示例， GitHub 请参阅存储库 aws-samples/-。amazon-qldb-streaming-amazon opensearch-service-sample-python](https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python)

# QLDB 中的流权限
<a name="streams.perms"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在创建 Amazon QLDB 流之前，您必须向 QLDB 提供对您指定的 Amazon Kinesis Data Streams 资源的写入权限。如果您正在使用客户托管的​​ AWS KMS key 来对 Kinesis 流进行服务器端加密，您还必须授予 QLDB 使用您指定的对称加密密钥的权限。Kinesis Data Streams 不支持[非对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)。

要向您的 QLDB 流提供必要的权限，您可以让 QLDB 扮演具有相应权限策略的 IAM 服务角色。服务角色是由一项服务担任、代表您执行操作的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。IAM 管理员可以在 IAM 中创建、修改和删除服务角色。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**注意**  
要在请求日记账流时将角色传递给 QLDB，您必须具有对 IAM 角色资源执行 `iam:PassRole` 操作的权限。这是对 QLDB 流子资源的 `qldb:StreamJournalToKinesis` 权限的补充。  
要了解如何使用 IAM 控制对 QLDB 的访问权限，请参阅 [Amazon MQ 如何与 IAM 协同工作](security_iam_service-with-iam.md)。有关 QLDB 策略示例，请参阅[Amazon QLDB 基于身份的策略示例](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-stream-to-kinesis)。

在此示例中，您创建了一个角色，允许 QLDB 代表您向 Kinesis 数据流写入数据记录。有关更多信息，请参阅《IAM 用户指南》中的 [创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)**。

如果您是首次在中 AWS 账户 流式传输 QLDB 日记，则必须先通过执行以下操作创建具有相应策略的 IAM 角色。或者，您可以[使用 QLDB 控制台](streams.create.md#streams.create.con)自动为您创建角色。否则，您可以选择之前创建的角色。

**Topics**
+ [创建权限策略](#streams.perms.create-policy)
+ [创建 IAM 角色](#streams.perms.create-role)

## 创建权限策略
<a name="streams.perms.create-policy"></a>

完成以下步骤，为 QLDB 流创建权限策略。此示例显示了 Kinesis Data Streams 策略，该策略授予 QLDB 向指定的 Kinesis 数据流写入数据记录的权限。如果适用，示例还显示了一个密钥策略，允许 QLDB 使用您指定的对称加密 KMS 密钥。

有关更多信息，请参阅 *《Amazon Kinesis Data Streams 开发人员指南》* 中的 [使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问](https://docs.aws.amazon.com/streams/latest/dev/controlling-access.html) 和 [授权使用用户生成的 KMS 密钥](https://docs.aws.amazon.com/streams/latest/dev/permissions-user-key-KMS.html) 要了解有关 AWS KMS 密钥策略的更多信息，请参阅*AWS Key Management Service 开发人员指南 AWS KMS*[中的使用密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

**注意**  
您的 Kinesis 数据流和 KMS 密钥必须 AWS 区域 与您的 QLDB 账本位于同一账号中。

**使用 JSON 策略编辑器创建策略**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在左侧的导航栏中，选择 **Policies（策略）**。

   如果这是您首次选择 **Policies**，则会显示 **Welcome to Managed Policies** 页面。选择**开始使用**。

1. 在页面的顶部，选择 **Create Policy（创建策略）**。

1. 请选择 **JSON** 选项卡。

1. 输入 JSON 策略文档。
   + 如果您正在使用客户托管的 KMS 密钥对 Kinesis 流进行服务器端加密，请使用以下示例策略文档。要使用此政策，请用您自己的信息替换*us-east-1*示例*1234abcd-12ab-34cd-56ef-1234567890ab*中的*kinesis-stream-name*、、和。*123456789012*

     ```
     {
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Sid": "QLDBStreamKinesisPermissions",
                 "Action": [ "kinesis:PutRecord*", "kinesis:DescribeStream", "kinesis:ListShards" ],
                 "Effect": "Allow",
                 "Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/kinesis-stream-name"
             },
             {
                 "Sid": "QLDBStreamKMSPermission",
                 "Action": [ "kms:GenerateDataKey" ],
                 "Effect": "Allow",
                 "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
             }
         ]
     }
     ```
   + 否则，下面是示例策略文档。要使用此政策，请用您自己的信息替换*us-east-1*示例*kinesis-stream-name*中的*123456789012*、和。

     ```
     {
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Sid": "QLDBStreamKinesisPermissions",
                 "Action": [ "kinesis:PutRecord*", "kinesis:DescribeStream", "kinesis:ListShards" ],
                 "Effect": "Allow",
                 "Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/kinesis-stream-name"
             }
         ]
     }
     ```

1. 选择**Review policy（查看策略）**。
**注意**  
您可以随时在**可视化编辑器**和 **JSON** 选项卡之间切换。不过，如果您进行更改或在**可视化编辑器**选项卡中选择 **Review policy（查看策略）**，IAM 可能会调整您的策略结构以针对可视化编辑器进行优化。有关更多信息，请参阅《IAM 用户指南》**中的[调整策略结构](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure)。

1. 在 **Review policy（查看策略）**页面上，为创建的策略输入 **Name（名称）**和 **Description（说明）**（可选）。查看策略**摘要**以查看您的策略授予的权限。然后，选择**创建策略**以保存您的工作。

## 创建 IAM 角色
<a name="streams.perms.create-role"></a>

为您的 QLDB 流创建权限策略后，您可以创建一个 IAM 角色并将您的策略附加到该角色上。

**创建用于 QLDB 的服务角色（IAM 控制台）**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **AWS 服务**。

1. 对于**服务或使用案例**，请选择 **QLDB**，然后选择 **QLDB** 使用案例。

1. 选择**下一步**。

1. 选中您之前创建的策略旁边的方框。

1. （可选）设置[权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。这是一项高级特征，可用于服务角色，但不可用于服务相关角色。

   1. 打开**设置权限边界**部分，然后选择**使用权限边界控制最大角色权限**。

      IAM 包含您账户中的 AWS 托管策略和客户托管策略列表。

   1. 选择要用于权限边界的策略。

1. 选择**下一步**。

1. 输入有助于识别角色的作用的角色名称或者角色名称后缀。
**重要**  
命名角色时，请注意以下事项：  
角色名称在您内部必须是唯一的 AWS 账户，并且不能因大小写而变得唯一。  
例如，不要同时创建名为 **PRODROLE** 和 **prodrole** 的角色。当角色名称在策略中使用或者作为 ARN 的一部分时，角色名称区分大小写，但是当角色名称在控制台中向客户显示时（例如，在登录期间），角色名称不区分大小写。
创建角色后，您无法编辑该角色的名称，因为其他实体可能会引用该角色。

1. （可选）对于**描述**，输入角色的描述。

1. （可选）要编辑角色的使用案例和权限，请在**步骤 1：选择可信实体**或**步骤 2：添加权限**部分中选择**编辑**。

1. （可选）为了帮助识别、组织或搜索角色，请以键值对形式添加标签。有关在 IAM 中使用标签的更多信息，请参阅 *IAM 用户指南*中的[AWS Identity and Access Management 资源标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

1. 检查该角色，然后选择**创建角色**。

以下的 JSON 文档是一个信任策略的示例，该策略允许 QLDB 假定一个附有特定权限的 IAM 角色。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "qldb.amazonaws.com"
            },
            "Action": [ "sts:AssumeRole" ],
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:qldb:us-east-1:123456789012:stream/myExampleLedger/*"
                },
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                }
            }
        }
    ]
}
```

**注意**  
以下示例演示如何使用 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范*混淆代理*问题。使用此信任策略，QLDB 只能为分类账 `123456789012` 账户 `myExampleLedger` 中的任何 QLDB 流扮演角色。  
有关更多信息，请参阅[防止跨服务混淆代理](cross-service-confused-deputy-prevention.md)。

创建 IAM 角色后，返回 QLDB 控制台并刷新“**创建 QLDB 流**”页面，以便它可以找到您的新角色。

# QLDB 中日记账流的常见错误
<a name="streams.errors"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

本节介绍了 Amazon QLDB 为日记账流请求引发的运行时系统错误。

以下是该服务返回的常见异常列表。每个异常都包括特定的错误消息，然后是简短的描述和可能的解决方案建议。<a name="streams.errors.varlist"></a>

**AccessDeniedException**  
消息：用户：*userARN*无权PassRole 在资源上执行：iam：*roleARN*  
您无权将 IAM 角色传递给 QLDB 服务。QLDB 要求所有日记账流请求都有一个角色，并且您必须具有将该角色传递给 QLDB 的权限。该角色为 QLDB 提供了在您指定的 Amazon Kinesis Data Streams 资源中的写入权限。  
核实您定义了一个 IAM policy，该策略授予对您指定的 QLDB 服务（`qldb.amazonaws.com`）的 IAM 角色资源执行 `PassRole` API 操作的权限。有关策略示例，请参阅[Amazon QLDB 基于身份的策略示例](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-stream-to-kinesis)。

**IllegalArgumentException**  
消息：QLDB 在验证 Kinesis Data Streams 时遇到错误：来自 Kinesis 的响应：*errorCode**errorMessage*  
造成此错误的一个可能原因是所提供的 Kinesis 数据流资源不存在。或者，QLDB 没有足够的权限将数据记录写入您指定的 Kinesis 数据流。  
验证您在流请求中提供的 Kinesis 数据流是否正确。有关更多信息，请参阅*《Amazon Kinesis Data Streams 开发人员指南》*中的 [创建和更新数据流](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-streams.html)。  
此外，请确认您是否为指定的 Kinesis 数据流定义了一个策略，该策略授予 QLDB 服务（`qldb.amazonaws.com`）对以下操作的权限。有关更多信息，请参阅 [流权限](streams.perms.md)。  
+ `kinesis:PutRecord`
+ `kinesis:PutRecords`
+ `kinesis:DescribeStream`
+ `kinesis:ListShards`

**IllegalArgumentException**  
消息：在验证 Kinesis 配置时，来自 Kinesis 数据流的意外响应。来自 Kinesis 的回应：*errorCode**errorMessage*  
尝试将数据记录写入所提供的 Kinesis 数据流失败，并显示提供的 Kinesis 错误响应。有关更多信息，请参阅*《Amazon Kinesis Data Streams 开发人员指南》*中的 [Amazon Kinesis Data Streams 生产人员故障排除](https://docs.aws.amazon.com/streams/latest/dev/troubleshooting-producers.html)。

**IllegalArgumentException**  
消息：开始日期不得早于结束日期。  
`InclusiveStartTime` 和 `ExclusiveEndTime` 必须采用 [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) 日期和时间格式以及通用协调时间（UTC）。

**IllegalArgumentException**  
消息：开始日期不能是未来的日期。  
`InclusiveStartTime` 和 `ExclusiveEndTime` 都必须采用 `ISO 8601` 日期和时间格式以及 UTC。

**LimitExceededException**  
消息：已超出 Kinesis 数据流同时运行 5 个日记账流的限制  
QLDB 强制使用五个并发日记账流的默认限制。