Alpakka KinesisSink:无法将消息推送到Stream

时间:2018-01-03 16:51:32

标签: akka-stream alpakka

我正在尝试使用alpakka kinesis connector向Kinesis Stream发送消息,但我没有成功。我尝试了下面的代码,但我的流中没有任何内容。

implicit val sys = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val kinesisAsync: AmazonKinesisAsync = AmazonKinesisAsyncClientBuilder.defaultClient()


val debug = Flow[PutRecordsRequestEntry].map { reqEntry =>
    println(reqEntry)
    reqEntry
}

val entry = new PutRecordsRequestEntry()
    .withData(ByteBuffer.wrap("Hello World".getBytes))
    .withPartitionKey(Random.nextInt.toString)

Source.tick(1.second, 1.second, entry).to(KinesisSink("myStreamName", KinesisFlowSettings.defaultInstance)).run()

// 2) Source.tick(1.second, 1.second,entry).via(debug).to(KinesisSink("myStreamName", inesisFlowSettings.defaultInstance)).run()
  • 使用Sink.foreach(println)代替KinesisSink每1秒打印PutRecordsRequestEntry =>预期
  • 使用KinesisSink,条目仅生成一次。

我做错了什么?

我正在使用KinesisSource检查我的流并且正在阅读(使用其他流测试)

AWS Kinesis的监控仪表板也不会显示任何PUT请求。

注1:我尝试启用alpakka的调试日志,但没有效果

<logger name="akka.stream.alpakka.kinesis" level="DEBUG"/>

在我的logback.xml +根级调试

2 个答案:

答案 0 :(得分:3)

下面要考虑的一些故障排除步骤 - 我希望他们有所帮助。

我怀疑您可能缺少Kinesis客户端的凭据和/或区域配置。

Kinesis Firehose

Kinesis制作人库(Alpakka似乎正在使用的)与Kinesis Firehose不兼容。如果您正在尝试写信给Firehose,那么这不会起作用。

应用程序记录

您可能希望为Kinesis Producer Library启用日志记录,而不仅仅是在Alpakka本身。相关文档可在此处获取:

Configuring the Kinesis Producer Library

Configuration Defaults for Kinesis Producer Library

AWS Side Logging

AWS CloudTrail自​​动为Kinesis流开箱即用,默认情况下AWS将为您保留90天的CloudTrail日志。

https://docs.aws.amazon.com/streams/latest/dev/logging-using-cloudtrail.html

您可以使用CloudTrail日志查看您的应用程序代表您向Kinesis发出的API调用。请求出现时通常会有适度的延迟 - 但是由于IAM权限不足或AWS资源配置存在其他问题,这会让您知道请求是否失败。

检查SDK身份验证

Kinesis客户端将使用DefaultAWSCredentialsProviderChain凭据提供程序向AWS发出请求。

您需要确保提供具有IAM权限的有效AWS凭证,以便向Kinesis提出这些请求。如果您的代码在AWS上运行,则提供应用程序凭据的首选方法是使用IAM Roles(在实例启动时指定)。

在代码中构建客户端时,还需要指定AWS区域。使用application.properties进行配置,或者如果您的应用程序是位于单个区域的CloudFormation堆栈的一部分 - 使用instance metadata服务在您的代码在AWS上运行时检索当前区域。 / p>

答案 1 :(得分:1)

问题是对流上的操作的访问被拒绝/许可。

我必须添加用于记录的akka​​ actor配置

akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
  stdout-loglevel = "DEBUG"
  logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
  logger-startup-timeout = "30s"
}

查看调试行,我实际上是在每个阶段的调试和步骤中运行。

在IAM角色中需要“PutRecord s ”权限