问:什么是 Amazon Kinesis Data Streams?

借助 Amazon Kinesis Data Streams,您可以构建用于处理或分析流数据的自定义应用程序,以满足特定需求。您可将来自成千上万个来源的点击流、应用程序日志和社交媒体等数据持续添加到 Amazon Kinesis 数据流。在数秒内,您的 Amazon Kinesis 应用程序便可以从数据流读取和处理数据。

问:Amazon Kinesis Data Streams 可代我管理哪些内容?

Amazon Kinesis Data Streams 管理在数据吞吐量层面流处理您的数据所需的基础设施、存储、网络和配置。您无需为数据流担心硬件、软件或其他服务的配置、部署和持续维护。此外,Amazon Kinesis Data Streams 还可以跨三个可用区同步复制数据,实现高可用性和数据持久性。

问:Amazon Kinesis Data Streams 有什么作用?

Amazon Kinesis Data Streams 对于从数据创建器快速移出数据,然后进行持续处理非常有用。原因在于,在传输数据到数据存储、运行实时指标和分析或得出更复杂的数据流进行进一步处理之前,它会转换数据。以下是使用 Amazon Kinesis Data Streams 的典型情景:

  • 加速日志和数据传送获取:您无需等待批量处理数据,而是让数据创建器在生成数据后立即输入 Amazon Kinesis 数据流,防止因数据创建器出现故障导致的数据损失。例如,系统和应用程序日志可以持续添加到数据流并可在数秒内进行处理。
  • 实时指标和报告:您可以实时从 Amazon Kinesis 数据流数据提取指标并生成报告。例如,您的 Amazon Kinesis 应用程序可以处理系统和应用程序日志的指标和报告,因为数据不断流入而不是等待收到批量数据。
  • 实时数据分析:通过 Amazon Kinesis Data Streams,您可以运行实时流数据分析。例如,您可以将点击流添加到 Amazon Kinesis 数据流,并让您的 Amazon Kinesis 应用程序实时运行分析,从而在数分钟内从数据中获得重要见解,而无需数小时或数天时间。
  • 复杂的数据流处理:您可以创建 Amazon Kinesis 应用程序和数据流的 Directed Acyclic Graphs (DAG)。在这一情景中,一个或多个 Amazon Kinesis 应用程序可将数据添加到一个 Amazon Kinesis 数据流进行进一步处理,以便于进行流处理器的后续阶段。

问:如何使用 Amazon Kinesis Data Streams?

注册 Amazon Web Services 后,可按以下步骤使用 Amazon Kinesis Data Streams:

问:Amazon Kinesis Data Streams 有哪些限制?

通过增加数据流内的分区数量,Amazon Kinesis 数据流的吞吐量能够无限扩展。然而,您在使用 Amazon Kinesis Data Streams 时需要注意某些限制:

  • 默认情况下,添加到数据流的记录可在添加后的最长 24 小时内进行访问。您可以通过启用延长数据保留期限来将该限值提升到长达 7 天。
  • 记录内的数据块的最大尺寸(Base64 编码之前的数据有效载荷)是 1 兆字节 (MB)。
  • 每个分片最高可支持每秒 1000 个 PUT 输入记录。

有关其他 API 等级限制的更多信息,请参阅 Amazon Kinesis Data Streams 限制

问:Amazon Kinesis Data Streams 与 Amazon SOS 有何区别?

Amazon Kinesis Data Streams 允许实时处理大数据流。它提供了记录排序,以及以使用与多个 Amazon Kinesis 应用程序相同的顺序读取和/或重播数据记录的能力。Amazon Kinesis 客户端库 (KCL) 能够将给定分区键的所有记录提供给同一记录处理器,从而能够更加轻松地构建从同一 Amazon Kinesis 数据流读取数据的多个应用程序 (例如,执行计数、累积和筛选)。

Amazon Simple Queue Service (Amazon SQS) 提供了可靠且高度可扩展的托管队列,用于存储在计算机之间传输的消息。Amazon SQS 让您能够在分布式应用程序组件之间轻松移动数据,并帮助构建可以单独处理消息的应用程序(带消息级确认/失败语义),如自动工作流。

问:应该何时使用 Amazon Kinesis Data Streams,何时使用 Amazon SQS?

我们建议将 Amazon Kinesis Data Streams 用于具有类似以下要求的使用案例:

  • 将相关记录路由到同一记录处理器(如同流处理 MapReduce)。例如,当给定键的所有记录被传输到同一记录处理器时,计数和累积更加简单。
  • 记录的排序。例如,您希望将日志数据从应用程序主机传输到处理/归档主机,同时保持日志报表的顺序。
  • 多个应用并发使用同一数据流的能力。例如,您拥有的一个应用程序会更新实时仪表板,另一个应用程序会归档数据到 Amazon Redshift。您希望这两个应用程序并行独立地使用同一数据流的数据。
  • 在数小时后以同一顺序使用记录的能力。例如,您拥有一个记账应用程序,同时审计应用程序在开单应用程序数小时后运行。由于 Amazon Kinesis Data Streams 最多存储数据 7 天,因此您可在记账应用程序运行后的最长 7 天内运行审计应用程序。

我们建议将 Amazon SQS 用于具有类似以下要求的使用案例:

  • 消息收发语义(如消息级别确认/失败)和可见性超时。例如,您拥有一个工作项目队列,同时希望单独跟踪每个项目的成功完成情况。Amazon SQS 跟踪确认/失败,因此应用程序无需保留持续的检查点/光标。在配置的可见性超时后,Amazon SQS 将删除已确认消息并重新提交失败的消息。
  • 单个消息延迟。例如,您拥有一个作业队列,同时需要计划带延迟的单个作业。通过 Amazon SQS,您可为单个消息配置为具有最多 15 分钟的延迟。
  • 动态增加读取时间的并发性/吞吐量。例如,您拥有一个工作队列,同时希望添加更多读者,直到储备清除。通过 Amazon Kinesis Data Streams,您可以扩展到足够数量的分区 (但请注意,您需要提前配置足够的分区)。
  • 充分利用 Amazon SQS 的透明扩展功能。例如,由于业务的偶尔负载尖峰或自然增长,您将缓存请求和负载变化。由于每个缓存的请求可以单独处理,因此 Amazon SQS 可以透明扩展以处理负载,无需提供任何配置说明。


问:什么是分区?

分区是 Amazon Kinesis 数据流的基本吞吐量单位。一个分片提供 1MB/秒数据输入和 2MB/秒输入输出容量。一个分片最高可支持每秒 1 000 个 PUT 记录。创建数据流时,您将指定所需的分区数量。例如,您可以创建具有两个分区的数据流。这一数据流具有 2MB/秒数据输入和 4MB/秒数据输出的吞吐量,并每秒允许最多 2000 个 PUT 记录。您可以监控 Amazon Kinesis Data Streams 中的分区级别指标,并随着您的数据吞吐量的变化,通过对流重新分区,从您的数据流中动态添加或删除分区。

问:什么是记录?

记录是存储在 Amazon Kinesis 数据流中的数据单元。记录由序列号分区键和数据 Blob 组成。数据 Blob 是您的数据创建器添加到数据流的重要数据。数据块的最大尺寸(Base64 编码前的数据有效载荷)是 1 兆字节 (MB)。

问:什么是分区键?

分区键用于隔离记录并路由到不同的数据流分区。分区键由您的数据创建器在添加数据到 Amazon Kinesis 数据流时指定。例如,假定您的数据流具有两个分区 (分区 1 和分区 2)。您可以将数据创建器配置为使用两个分区键(键 A 和键 B),以将所有带键 A 的记录输入分片 1,同时将所有带键 B 的记录输入分片 2。

问:什么是序列号?

序列号是每个记录的唯一标识符。序列号由 Amazon Kinesis 在数据创建器调用 PutRecordPutRecords 操作以添加数据到 Amazon Kinesis 数据流时分配。同一分区键的序列号通常会随时间变化而变大;PutRecord 请求之间的时间段越长,序列号变得越大。


问:如何创建 Amazon Kinesis 数据流?

注册 Amazon Web Services 后,您可以通过 Amazon Kinesis 管理控制台CreateStream 操作创建 Amazon Kinesis 数据流。

问:如何决定 Amazon Kinesis 数据流的吞吐量?

Amazon Kinesis 数据流的吞吐量由数据流内的分区数量决定。请遵照以下步骤估计您的数据流需要的初始分区数量。注意:通过重新分区功能,您可以动态调整分区的数量。

  1. 预计写入数据流的记录的平均大小为千字节 (KB),四舍五入为 1 KB。(average_data_size_in_KB)
  2. 预计每秒写入数据流的记录数量。(number_of_records_per_second)
  3. 决定并行和独立于数据流使用数据的 Amazon Kinesis 应用程序的数量。(number_of_consumers)
  4. 计算传入写入带宽 (KB) (incoming_write_bandwidth_in_KB),这相当于 average_data_size_in_KB 乘以 number_of_records_per_seconds
  5. 计算传出读取带宽 (KB) (outgoing_read_bandwidth_in_KB),这相当于 incoming_write_bandwidth_in_KB 乘以 number_of_consumers

然后,您可以使用以下公式计算数据流需要的初始分区数量 (number_of_shards):

number_of_shards = max (incoming_write_bandwidth_in_KB/1000, outgoing_read_bandwidth_in_KB/2000)

问:可为 Amazon Kinesis 数据流请求的最小吞吐量是多少?

Amazon Kinesis 数据流的吞吐量按分区单位扩展。单个分区是数据流的最小吞吐量,提供 1MB/秒数据输入和 2MB/秒数据输出。

问:可为 Amazon Kinesis 数据流请求的最大吞吐量是多少?

Amazon Kinesis 数据流的吞吐量可无限扩展。默认情况下,每个账户可为每个地区配置 10 个分区。您可以使用 Amazon Kinesis Data Streams 限制表单为单个地区请求超过 10 个分区。

问:记录大小如何影响 Amazon Kinesis 数据流的吞吐量?

分片提供 1MB/秒数据输入速率,同时支持最高每秒 1000 个 PUT 记录。因此,如果记录大小不到 1KB,则分片的实际输入速率将小于 1MB/秒,受每秒最大 PUT 记录的限制。


:如何向 Amazon Kinesis 数据流添加数据?

您可以通过 PutRecord PutRecords 操作、Amazon Kinesis Producer Library (KPL)Amazon Kinesis Agent 将数据添加到 Amazon Kinesis 数据流。

问:PutRecord PutRecords 之间的区别为何?

PutRecord 操作允许 API 调用内的单个数据记录,而 PutRecords 操作允许 API 调用内的多个数据记录。更多有关 PutRecordPutRecords 操作的信息,请参加 PutRecord  PutRecords

问:什么是 Amazon Kinesis Producer Library (KPL)?

Amazon Kinesis Producer Library (KPL) 是易于使用且高度可配置的程序库,可以帮助您把数据放到 Amazon Kinesis 数据流中。KPL 呈现了简单的异步可靠界面,使您能够快速实现高创建器吞吐量而客户资源最少。

问:我可以使用什么编程语言或平台访问 Amazon Kinesis API?

Amazon Kinesis API 在 Amazon Web Services SDK 中可用。有关 Amazon Web Services SDK 的编程语言或平台的列表,请参阅用于 Amazon Web Services 的工具

问:Amazon Kinesis Producer Library (KPL) 采用什么编程语言?

Amazon Kinesis Producer Library (KPL) 的核心采用 C++ 模块构建,并且可以编译为使用最新 C++ 编译器在任何平台上工作。该库目前采用 Java 界面。我们期待添加对其他编程语言的支持。

问:什么是 Amazon Kinesis Agent?

Amazon Kinesis Agent 是一款预构建的 Java 应用程序,可提供简单的方法来收集数据并将其发送到 Amazon Kinesis 数据流。您可以在基于 Linux 的服务器环境 (如 Web 服务器、日志服务器和数据库服务器) 上安装此代理。代理监控特定文件并持续发送数据到数据流。有关更多信息,请参阅使用代理执行写入操作

问:Amazon Kinesis Agent 支持哪些平台?

目前,Amazon Kinesis Agent 支持 Amazon Linux 或 Red Hat Enterprise Linux。

问:在哪里能够获得 Amazon Kinesis Agent?

您可以使用下面的命令及链接下载和安装 Amazon Kinesis Agent:

在 Amazon Linux 上:sudo yum install –y aws-kinesis-agent

在 Red Hat Enterprise Linux 上:sudo yum install –y https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm

通过 GitHub:awlabs/amazon-kinesis-agent

问:如何使用 Amazon Kinesis Agent?

在服务器上安装 Amazon Kinesis Agent 后,您可以对其进行配置以监控磁盘上的特定文件,然后持续地将新数据发送到 Amazon Kinesis 数据流。有关更多信息,请参阅 Writing with Agents

问:如果数据创建器向数据流添加数时超出 Amazon Kinesis 数据流的容量限制,该怎么办?

Amazon Kinesis 数据流的容量限制由流内的分区数量来定义。数据吞吐量或 PUT 记录的数量可能会超过限制。超过容量限制后,输入数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这由临时的数据流输入数据速率增加导致,则数据创建器将重试并最终完成请求。如果这由持续的数据流输入数据速率增加导致,则应增加数据流内的分区数量,从而为输入数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都能让您了解数据流输入数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。

问:在 PutRecordPutRecords 调用期间,哪些数据计入 Amazon Kinesis 数据流的数据吞吐量?

您的数据 Blob分区键和数据流名称是 PutRecordPutRecords 调用的必要参数。您的数据 Blob (Base64 编码之前) 和分区键的大小将依照 Amazon Kinesis 数据流的数据吞吐量计数,这由数据流内的分区数量确定。


:什么是 Amazon Kinesis 应用程序?

Amazon Kinesis 应用程序是读取和处理来自 Amazon Kinesis 数据流的数据使用器。您可以使用 Kinesis API 客户端库 (KCL) 构建 Amazon Kinesis 应用程序。

问:什么是 Amazon Kinesis 客户端库 (KCL)?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL) 是一个预构建库,可帮助您轻松构建 Amazon Kinesis 应用程序,用以读取和处理来自 Amazon Kinesis 数据流的数据。KCL 可以处理各种复杂的问题,如适应数据流的数量变化、均衡流数据负载、协调分布式服务以及以容错方式处理数据。KCL 支持您在构建应用程序时专注于业务逻辑。

问:什么是 Amazon Kinesis 连接件库?

Amazon Kinesis 连接器库是一个预构建库,可帮助您轻松完成 Amazon Kinesis Data Streams 与其他 AWS 服务和第三方工具的集成。使用 Amazon Kinesis 连接件库需要适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL)。该库的最新版本为 Amazon DynamoDBAmazon RedshiftAmazon S3Elasticsearch 提供了连接件。该库还包括各种类型的示例连接件,并有 Apache Ant 来构建运行示例的文件。

问:什么是 Amazon Kinesis Storm Spout?

Amazon Kinesis Storm Spout 是一个预构建库,可帮助您轻松完成 Amazon Kinesis Data Streams 与 Apache Storm 的集成。最新版本的 Amazon Kinesis Storm Spout 从 Amazon Kinesis 数据流获取数据,再作为元组发出。您将此 spout 添加到 Storm 拓扑中,以将 Amazon Kinesis Data Streams 作为一种可靠、可扩展、流捕获、存储以及重播服务来使用。

问:Amazon Kinesis 客户端库 (KCL)、Amazon Kinesis 连接件库和 Amazon Kinesis Storm Spout 可用于什么编程语言?

Amazon Kinesis 客户端库 (KCL) 当前提供 JavaPythonRubyNode.js.NET 等版本。Amazon Kinesis 连接件库Amazon Kinesis Storm Spout 当前在 Java 中可用。我们期待添加对其他编程语言的支持。

问:我是否必须为我的 Amazon Kinesis 应用程序使用 Amazon Kinesis 客户端库 (KCL)?

否,您还可以使用 Amazon Kinesis API 构建 Amazon Kinesis 应用程序。然而,我们建议使用适用于 Java | Python | Ruby | Node.js | .NET的 Amazon Kinesis 客户端库 (KCL)(如果适用),因为它会执行与分布式流处理关联的繁重任务,可帮助您更加高效地开发 Amazon Kinesis 应用程序。

问:Amazon Kinesis 客户端库 (KCL) 如何与 Amazon Kinesis 应用程序交互?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL) 是 Amazon Kinesis Data Streams 和 Amazon Kinesis 应用程序之间的中间程序。KCL 使用 IRecordProcessor 接口来与应用程序通信。您的应用程序实施此接口,同时 KCL 使用此接口中的方法调用您的应用程序代码。

有关使用 KCL 构建 Amazon Kinesis 应用程序的更多信息,请参阅使用 Amazon Kinesis 客户端库为 Amazon Kinesis 开发消费者应用程序

:什么是 Amazon Kinesis 客户端库 (KCL) 生成的工作人员和记录处理器?

Amazon Kinesis 应用程序可以有多个应用程序实例,同时进程是映射到每个应用程序实例的处理单元。记录处理器是处理来自 Amazon Kinesis 数据流分区数据的处理单元。一个进程映射到一个或多个记录处理器。一个记录处理器映射到一个分片,并从该分片处理记录

启动时,应用程序调用适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL) 以实例化工作程序。这一调用将为应用程序提供带配置信息的 KCL,如数据流名称和 AWS 凭证。这一调用还会传输对 IRecordProcessorFactory 实施的引用。KCL 使用此工厂来按需创建新的记录处理器,以处理来自数据流的数据。KCL 使用 IRecordProcessor 接口与这些记录处理器通信。

问:Amazon Kinesis 客户端库 (KCL) 如何保持跟踪 Amazon Kinesis 应用程序处理的数据记录?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL) 自动为每个 Amazon Kinesis 应用程序创建一个 Amazon DynamoDB 表,从而跟踪和维护状态信息,如重新分片事件和序列号检查点。DynamoDB 表与应用程序共享同一名称,因此您需要确保应用程序名称不与同一地区的任何现有 DynamoDB 表冲突。

假定所有与同一应用程序名称关联的工作线程在同一 Amazon Kinesis 数据流上配合工作。如果您运行同一应用程序代码的其他实例,但使用不同的应用程序名称,则 KCL 会将第二个实例视为在同一数据流运行的完全独立的应用程序。

请注意,除了与 Amazon Kinesis Data Streams 关联的成本之外,还将对账户收取与 Amazon DynamoDB 表关联的费用。

有关 KCL 如何跟踪 Amazon Kinesis 应用程序状态的更多信息,请参阅跟踪 Amazon Kinesis 应用程序状态

问:我如何使用 Amazon Kinesis 客户端库 (KCL) 自动扩展 Amazon Kinesis 应用程序的处理容量?

您可为 Amazon Kinesis 应用程序 创建多个实例,并让这些应用程序实例运行在作为 Auto Scaling 组一部分的一组 Amazon EC2 实例。尽管处理需求增长,但是运行您应用程序实例的 Amazon EC2 实例将自动实例化。适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis 客户端库 (KCL) 将为此新实例生成进程,并从超载的现有实例自动移动记录处理器到此新实例。

问:当 Amazon Kinesis 数据流中存在数据时,GetRecords 调用为何返回空结果?

一个可能的原因是,当前分片迭代器指定的位置没有任何记录。即使您使用 TRIM_HORIZON 作为分区迭代器类型也可能出现这种情况。Amazon Kinesis 数据流代表着持续的数据流。您应在一个循环中调用 GetRecords 操作,相关记录将在分区迭代器数据记录存储到位时返回。

问:GetRecords 操作中返回的 ApproximateArrivalTimestamp 是什么?

每条记录都包含一个称作 ApproximateArrivalTimestamp 的值。 Amazon Kinesis 在成功收到并存储记录后设置该值。该时间戳精确到毫秒,但不保证时间戳准确。例如,分区中或跨数据流的记录的时间戳可能是乱序的。

问:如果 Amazon Kinesis 应用程序从数据流读取数据时超出 Amazon Kinesis 数据流的容量限制该怎么办?

Amazon Kinesis 数据流的容量限制由流内的分区数量来定义。数据吞吐量或读取数据调用的数量会超过限制。超过容量限制时,读取数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这由临时的数据流输出数据速率增加导致,则 Amazon Kinesis 应用程序将重试并最终完成请求。如果这由持续的数据流输出数据速率增加导致,则应增加数据流内的分区数量,从而为读取数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都可让您了解数据流输出数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。


问:如何更改 Amazon Kinesis 数据流的吞吐量?

有两种方法可以更改数据流的吞吐量。您可以使用 UpdateShardCount API 或 AWS 管理控制台来扩展数据流中的分区数量,也可以通过调整数据流中的分区数量 (重新分区) 来更改 Amazon Kinesis 数据流的吞吐量。

问:使用 UpdateShardCount 或 AWS 管理控制台更改 Amazon Kinesis 数据流的吞吐量需要多长时间?

一般的扩展请求只需几分钟时间即可完成,较大的扩展请求需要的时间要长于较小的请求。

问:UpdateShardCount 上限是多少?

有关 UpdateShardCount 上限的信息,请参阅 Amazon Kinesis Data Streams Service API Reference

问:使用 UpdateShardCount 或通过重新分区更改 Amazon Kinesis 数据流的吞吐量后,Amazon Kinesis Data Streams 是否仍然可用?

是。在使用 UpdateShardCount 或通过重新分区更改数据流吞吐量期间,您可以继续向 Amazon Kinesis 数据流添加数据和从中读取数据。

问:什么是重新分区?

重新分区是通过对一系列分区进行拆分或合并来扩展数据流的过程。在分区拆分中,单个分区被分为两个分区,这将增加数据流的吞吐量。在分区合并中,两个分区被合并到单个分区,这将减少数据流的吞吐量。有关更多信息,请参阅 Amazon Kinesis Data Streams 开发人员指南中的对数据流进行重新分区

问:使用重新分区更改 Amazon Kinesis 数据流的吞吐量需要间隔多久,每次需要多长时间?

分片拆分或分片合并等重新分片操作需要几秒钟。您一次仅能执行一个重新分片操作。因此,对于仅有一个分区的 Amazon Kinesis 数据流,拆分分区可在数秒内使吞吐量翻番。对于具有 1000 个分区的数据流,拆分 1000 个分区以便吞吐量翻番需要 30000 秒 (8.3 小时)。当需要额外吞吐量时,我们建议您提前增加数据流的吞吐量。

问:如何更改 Amazon Kinesis 数据流的数据保留期限?

默认情况下,Amazon Kinesis 会将您的数据存储长达 24 小时。您可以通过启用延长数据保留期限来将数据保留期限值提升到长达 7 天。

有关更改数据保留期限的更多信息,请参阅更改数据保留期限

问:如何监控 Amazon Kinesis 数据流的运行和性能?

Amazon Kinesis Data Streams 管理控制台会显示关键运营和性能指标,如 Amazon Kinesis 数据流的数据输入和输出的吞吐量。Amazon Kinesis Data Streams 还与 Amazon CloudWatch 集成,以便您可以为数据流及其中的分区收集、查看和分析 CloudWatch 指标。有关 Amazon Kinesis Data Streams 指标的更多信息,请参阅利用 Amazon CloudWatch 监控 Amazon Kinesis Data Streams 服务

请注意,所有流级别的指标都是免费的。所有已启用的分片级别的指标均根据 Amazon CloudWatch 定价进行收费。

问:如何管理和控制对 Amazon Kinesis 数据流的访问权限?

Amazon Kinesis Data Streams 与 AWS Identity and Access Management (IAM) 服务集成,后者让您能够安全控制对 AWS 产品和用户资源的访问权限。例如,您可以创建仅允许特定用户或组向 Amazon Kinesis 数据流添加数据的策略。有关数据流访问管理和控制的更多信息,请参阅使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问

问:如何记录针对 Amazon Kinesis 数据流的 API 调用,以便用于安全分析和运行故障排除?

Amazon Kinesis 可与 Amazon CloudTrail 服务集成,后者可为您的账户记录 AWS API 调用并给您提供日志文件。有关 API 调用日志的更多信息和支持的 Amazon Kinesis API 操作的列表,请参阅使用 Amazon CloudTrail 记录 Amazon Kinesis API 调用

问:如何高效管理 Amazon Kinesis 数据流以及这些数据流的相关成本?

使用 Amazon Kinesis Data Streams,您能够标记 Amazon Kinesis 数据流,从而更加轻松地管理资源和成本。标签是以键-值对表示的用户定义的标记,帮助组织 AWS 资源。例如,您可以使用成本中心标记流,从而基于成本中心分类和跟踪 Amazon Kinesis Data Streams。有关 Amazon Kinesis Data Streams 标签的更多信息,请参阅标记您的 Amazon Kinesis Data Streams

问:如何描述使用分区上限的方式?

您可以使用 DescribeLimits API 来了解如何对账户使用分区上限。DescribeLimits API 将返回分区上限以及您的账户中开启的分区数。如果您需要提高分区上限,请申请提升上限


问:使用 Kinesis Data Streams 时,数据的安全性如何?

Kinesis 在默认情况下是安全的。仅账户和数据流所有者才有权访问自己创建的 Kinesis 资源。Kinesis 支持用户身份验证,以控制对数据的访问。您可以使用 AWS IAM 策略选择性地向用户和用户组授予权限。您可以使用 HTTPS 协议通过 SSL 终端节点安全地向 Kinesis 放入数据和从中获取数据。如果您需要额外的安全性,可使用服务器端加密和 AWS KMS 主密钥对存储在数据流中的数据进行加密。AWS KMS 允许您使用 AWS 生成的 KMS 主密钥进行加密,或者您也可以选择将自己的主密钥添加到 AWS KMS。最后,您还可以使用自己的加密库在客户端上加密要放入 Kinesis 的数据。

问:我可以在不使用公用 IP 的情况下,从 Amazon Virtual Private Cloud (VPC) 对 Kinesis Data Streams API 进行私有访问吗?

可以,您可以通过创建 VPC 终端节点来实现从 Amazon Virtual Private Cloud (VPC) 对 Kinesis Data Streams API 进行私有访问。借助 VPC 终端节点,VPC 和 Kinesis Data Streams 之间的路由可由 AWS 网络处理,而无需使用 Internet 网关、NAT 网关或 VPN 连接。Kinesis Data Streams 所使用的最新一代 VPC 终端节点由 AWS PrivateLink 提供支持。AWS PrivateLink 是一种通过使用 VPC 中带有私有 IP 的弹性网络接口 (ENI) 来支持各 AWS 产品之间的私有连接的技术。要了解关于 PrivateLink 的更多信息,请访问 PrivateLink 文档


问:能否加密输入 Kinesis 数据流的数据?

能。您可以通过两种方式加密输入 Kinesis 数据流的数据。您可以使用服务器端加密 (一项完全托管的功能),该功能会在您向数据流输入数据和从中提取数据时自动对数据进行加密和解密。或者,您也可以通过在客户端上进行加密和解密,向数据流写入加密数据。

问:为何应使用服务器端加密而非客户端加密?

出于以下任一原因,客户通常会选择服务器端加密而非客户端加密:

  • 很难执行客户端加密
  • 他们希望在客户端加密之上再增加一层安全保障
  • 很难实施客户端密钥管理方案

问:什么是服务器端加密?

适用于 Kinesis Data Streams 的服务器端加密会使用用户指定的 AWS KMS 主密钥 (CMK) 在数据写入数据流存储层之前自动加密,并在数据从存储中检索后进行解密。加密使得写入操作无法执行且无法读取负载和分区键,除非向数据流写入或从中读取数据的用户有权使用所选密钥在数据流上进行加密。因此,使用服务器端加密更易达到内部针对监管数据的安全性和合规性要求。

借助服务器端加密,客户端应用程序 (创建器和使用器) 无需获知加密,也无需管理 CMK 或加密操作,并且 Kinesis Data Streams 服务内的静态和动态数据都会得到加密。服务器端加密功能使用的所有 CMK 均由 AWS KMS 提供。AWS KMS 让您可以轻松使用适用于 Kinesis 的 AWS 托管型 CMK (一种“一键式”加密方法)、AWS KMS 为您生成的 CMK 或您为进行加密而导入的 CMK。

问:是否有服务器端加密入门指南?

有。用户文档中提供了入门指南。

问:服务器端加密是否会干扰应用程序与 Kinesis Data Streams 的交互方式?

可能会。这取决于您用于加密的密钥和监管密钥访问的权限。

  • 如果您使用适用于 Kinesis 的 AWS 托管型 CMK (密钥别名 = aws/kinesis),则借助此密钥启用或禁用加密不会影响您的应用程序。
  • 如果您使用其他主密钥 (如自定义的 AWS KMS 主密钥或您导入 AWS KMS 服务的主密钥),且数据流的创建器和使用器无权使用加密所用的 AWS KMS CMK,那么 PUT 和 GET 请求将会失败。要使用服务器端加密,您必须先配置 AWS KMS 密钥策略以允许加密和解密消息。要了解相关示例和有关 AWS KMS 权限的更多信息,请参阅 AWS 密钥管理服务开发人员指南中的“AWS KMS API 权限:操作和资源参考”或 Kinesis Data Streams 服务器端加密用户文档中的权限指南。

问:使用服务器端加密是否会额外产生相关费用?

会。但如果您使用的是适用于 Kinesis 的 AWS 托管型 CMK,并且 KMS API 使用费没有超出免费套餐,则使用服务器端加密免费。下面按资源介绍了费用:

密钥:

  • 适用于 Kinesis 的 AWS 托管型 CMK (别名 = “aws/kinesis”) 是免费的。
  • 用户生成的 KMS 密钥会产生 KMS 密钥费。了解更多

KMS API 使用情况:

  • AWS 会对每个 CMK (包括定制 CMK) 收取 API 使用费用。轮换数据键时,Kinesis Data Streams 大约每 5 分钟调用一次 KMS。在 30 天的月份中,由 Kinesis 数据流发起的 KMS API 调用的总成本应该不超过几美元。请注意,此费用将因您在数据创建器和使用器上使用的用户证书数量而异,因为每个用户证书需要对 AWS KMS 进行唯一的 API 调用。当您使用 IAM 角色进行身份验证时,每个 assume-role-call 都将生成唯一的用户证书,并且您可能希望缓存由 assume-role-call 返回的用户证书,从而节省 KMS 成本。

问:哪些 AWS 地区提供适用于 Kinesis Data Streams 的服务器端加密?

Kinesis Data Streams 服务器端加密已在 AWS GovCloud 地区和中国 (北京) 地区外的所有公共地区推出。

问:如何从数据流中启动、更新或移除服务器端加密?

所有这些操作均可通过 AWS 管理控制台或使用 AWS 开发工具包完成。要了解更多信息,请参阅 Kinesis Data Streams 服务器端加密入门指南

问:服务器端加密使用何种加密算法?

Kinesis Data Streams 使用 AES-GCM 256 算法进行加密。

问:如果加密了已写入数据 (纯文本或密文格式) 的数据流,那么在更新加密时,是否会加密或解密该数据流中的所有数据?

不会,应用新加密只会加密 (或解密) 写入该数据流的新数据。

问:适用于 Kinesis Data Streams 的服务器端加密会加密哪些内容?

服务器端加密会加密消息的负载以及数据流创建器应用程序指定的分区键。

问:服务器端加密是一项特定于分片的功能还是特定于数据流的功能?

服务器端加密是一项特定于数据流的功能。

问:能否更改用于加密特定数据流的 CMK?

能。使用 AWS 控制台或 AWS 开发工具包即可选择将新的主密钥应用到特定数据流。

问:您能否向我演示数据的加密生命周期,从启用服务器端加密将其发送至 Kinesis 数据流到进行检索?

下面将向您演示 Kinesis Data Streams 如何使用 AWS KMS CMK 在消息存储到 PUT 路径之前进行加密以及在 GET 路径中检索后进行解密。如果启用了服务器端加密,那么当您在数据流上调用 putRecord(s) 或 getRecords 时,Kinesis 和 AWS KMS 会执行以下操作 (包括解密)。

  1. 客户的 Kinesis 创建器应用程序 (客户端) 使用 SSL 通过 HTTPS 将数据发送至 Kinesis。
  2. Kinesis 接收数据并将其存储在 RAM 中,同时加密记录的负载和分区键。
  3. Kinesis 请求纯文本输入密钥材料 (IKM),并使用客户所选的 KMS 主密钥加密该 IKM 的副本。
  4. AWS KMS 创建 IKM,使用主密钥对其进行加密,然后将纯文本 IKM 和加密 IKM 一起发送至 Kinesis。
  5. Kinesis 使用纯文本 IKM 获取每个记录独有的数据密钥。
  6. Kinesis 使用这些数据密钥加密负载和分区键并从内存中移除纯文本密钥。
  7. Kinesis 将加密 IKM 附加到加密数据。
  8. 纯文本 IKM 缓存在内存中以供重复使用,直到 5 分钟之后过期。
  9. Kinesis 将加密消息传递至后端存储,以便静态存储并可通过调用 getRecords 进行提取。

在您调用 getRecords 时,Kinesis 和 AWS KMS 会执行以下操作 (包括解密)。

  1. 进行 getRecords 调用时,Kinesis 的前端会从后端服务中检索加密记录。
  2. Kinesis 使用客户的请求生成的令牌向 KMS 发出请求。AWS KMS 予以授权。
  3. Kinesis 解密随记录存储的加密 IKM。
  4. Kinesis 通过解密的 IKM 为每个记录重新创建数据密钥。
  5. 如果获得授权,Kinesis 会解密负载并从内存中移除纯文本数据密钥。
  6. Kinesis 通过 SSL 和 HTTPS 将负载传递至请求记录的 Kinesis 使用器 (客户端)。

 


问:AWS 免费套餐中是否提供 Amazon Kinesis Data Streams?

不,Amazon Kinesis Data Streams 当前不在 AWS 免费套餐中提供。AWS 免费套餐支持免费试用的一组 AWS 服务。有关 AWS 免费套餐的更多信息,请参阅 AWS 免费套餐

问:Amazon Kinesis Data Streams 如何收费?

Amazon Kinesis Data Streams 使用简单的按需付费定价结构。这里不存在预付费用或最低费用,您仅需为使用的资源付费。Amazon Kinesis Data Streams 的费用有两个核心维度和一个可选维度:

  • 每小时分区费用由您的 Amazon Kinesis 数据流内的分区数量决定。
  • PUT Payload Unit 收费根据数据创建器添加到您的数据流的 25KB 负载单元的数量决定。
  • 可选的延长数据保留期限的费用由您的数据流产生的分段时数决定。 

有关 Amazon Kinesis Data Streams 费用的更多信息,请参阅 Amazon Kinesis Data Streams 定价

问:用 PutRecords 操作取代 PutRecord 操作,PUT Payload Unit 费用是否会发生变化?

PUT Payload Unit 费用根据添加到您的 Amazon Kinesis 数据流的 25KB 负载单元的数量决定。无论使用 PutRecords 操作还是PutRecord 操作,PUT Payload Unit 费用都不变。

问:处于“CLOSED”状态的分区收费吗?

重新分区后,分区可能会处于“CLOSED”状态。处于“CLOSED”状态的分区不收费。

问:除了 Amazon Kinesis Data Streams 费用之外,使用 Amazon Kinesis Data Streams 是否还存在任何其他费用?

如果您使用 Amazon EC2 运行 Amazon Kinesis 应用程序,则将对 Amazon EC2 资源收取费用,Amazon Kinesis Data Streams 费用除外。

Amazon Kinesis 客户端库 (KCL) 使用 Amazon DynamoDB 表跟踪记录处理的状态信息。如果您为您的 Amazon Kinesis 应用程序使用 KCL,则将对 Amazon DynamoDB 资源收取费用,Amazon Kinesis Data Streams 费用除外。

如果您启用增强的分区级别指标,则除了 Amazon Kinesis Data Streams 费用以外,还需要支付与已启用的分区级别指标相关的 Amazon CloudWatch 费用。

请注意,以上三个示例常见但并不详尽。