无法将记录从 kinesis firehose 发送到私有 redshift

Not able to send records from kinesis firehose to private redshift

我有一个用例,其中我的 redshift 集群是私有的,并且仅支持与 VPC 的 VPN 连接。我需要从另一个 VPC 中的 kinesis firehose 发送数据。我发现我们需要进行 redshift public 或附加一个互联网网关来实现这一点,但我无法使用互联网网关。我只需要使用 VPN 从 kinesis firehose 连接到 redshift。我想不出任何方法来做到这一点。

如您所知,您无法在没有互联网访问权限的情况下将 VPC 中的私有 Redshift 集群用作 Firehose 的目标。 detailed here and here.

没有直接的解决方案

也就是说,我至少可以想到两个可能就足够的解决方法。

  1. 您可以将 Firehose 设为 S3。然后设置从私有 VPC 到 S3 的私有 link 访问权限,并设置事件以可接受的节奏将数据复制到 Redshift 集群中。我认为这可能是最好的选择。
  2. 可能 能够使用将记录提供给 Redshift 的 lambda 处理器设置 Firehose。我说“可能”的原因是因为 lambda 也需要在 VPC 内并且需要能够跟上 Firehose 流。这可能充满性能问题,并且可能代价高昂。而且 Redshift 并不是真正意味着将高写入事务作为数据仓库。这是最糟糕的选择。

Firehose 在 S3 中聚合数据,然后在 Redshift 中触发 COPY 命令。由于您没有从 Firehose 到 Redshift 的网络路径,因此失败。但是,Firehose 只能停止将数据放入 S3。

现在您只需要一种方法来触发 Redshift 来复制数据。有多种方法可以执行此操作,但最简单的方法是使用 Lambda(在您的 Redshift VPC 中)发出 COPY 命令。您需要决定 Lambda 何时应该 运行 - Firehose 使用两个参数来确定何时应该发布 COPY;自上次 COPY 以来的时间和尚未复制的数据大小。如果愿意,您可以模拟此行为,但最简单的方法是仅在某个固定时间间隔发出 COPY,例如每 5 分钟一次。

为此,您将 CloudWatch 设置为每 5 分钟触发一次 Lambda。

  1. Lambda 查看 S3 中的 Firehose 位置并列出所有文件
  2. 重命名(移动)所有这些文件,将它们放在一个新的唯一命名的文件中 S3“子文件夹”
  3. 向 Redshift 发出 COPY 命令以从该“子文件夹”获取数据
  4. 成功摄取后,这些文件可以再次移动,留在 上面的“子文件夹”或已删除

rename/move S3 中的文件的原因是为了确保 Lambda 的每个 运行 都在一组唯一的文件上运行,并且文件不会被多次摄取。