是否可以使用 .Net Core 2.2 在 AWS Lambda 上使用 Kinesis FireHose 执行 PutRecord?

Posted

技术标签:

【中文标题】是否可以使用 .Net Core 2.2 在 AWS Lambda 上使用 Kinesis FireHose 执行 PutRecord?【英文标题】:Is it possible to perform PutRecord with Kinesis FireHose on AWS Lambda using .Net Core 2.2? 【发布时间】:2020-05-22 12:35:38 【问题描述】:

之所以问这个问题是因为我没有看到任何官方文件提到从 AWS Lambda 函数到 FireHose 执行 PutRecord。我想在 Kinesis FireHose 上从 AWS Lambda 执行 PutRecord。我还为我尝试从中进行 PutRecord 的 AWS Lambda 函数提供了适当的 PutRecord 策略。当使用 .Net 2.2 从 AWS Lambda 执行 PutRecord 操作时,我收到以下错误

用户:arn:aws:sts::accountnumber:assumed-role/listener-role/lambda 无权执行:kinesis:PutRecord on resource:arn:aws:kinesis:us-west-1:accountnumber:assumed :stream/firehose-stream

我的政策如下


  "permissionsBoundary": ,
  "roleName": "listener-role",
  "policies": [
    
      "document": 
        "Version": "2012-10-17",
        "Statement": [
          ....,
          
            "Effect": "Allow",
            "Action": [
              "firehose:PutRecord",
              "firehose:PutRecordBatch"
            ],
            "Resource": [
              "*"
            ]
          
        ]
      ,
      "name": "policy",
      "type": "inline"
    
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]

.Net 被截断以在 Kinesis FireHose 上记录

_kinesisClient 是 AmazonKinesisClient

        MemoryStream recordStream = new MemoryStream();
        IFormatter formatter = new BinaryFormatter();
        formatter.Serialize(recordStream, data);
        var request = new PutRecordRequest
        
            PartitionKey = Guid.NewGuid().ToString(),
            Data = recordStream,
            StreamName = Environment.GetEnvironmentVariable("KinesisStream")
        ;
        await _kinesisClient.PutRecordAsync(request);

【问题讨论】:

【参考方案1】:

您正试图将数据放入 Kinesis 数据流。您的策略允许您将数据放入 Kinesis Firehose。由于 Kinesis 的不同风格,这可能会有些混乱。如果您确实尝试将数据放入 Kinesis 数据流,则应将策略操作更改为 kinesis:Put*

另一方面,如果您想将数据放入 Kinesis Firehose,请将您的 .NET 代码更改为类似这样(我不是 .NET 专家):

var putRecordRequest = new PutRecordRequest();
var deliveryStreamName = Environment.GetEnvironmentVariable("KinesisStream");

putRecordRequest.setDeliveryStreamName(deliveryStreamName);

var record = new Record().withData(ByteBuffer.wrap(data.getBytes()));

putRecordRequest.setRecord(record);

// Put record into the DeliveryStream
firehoseClient.putRecord(putRecordRequest);

【讨论】:

你指引我的方向是正确的。我使用了错误的客户端来记录。谢谢!【参考方案2】:

我使用错误的客户端在 Kinesis Firehose 上放置记录。 KinesisFireHose 客户端看起来像这样。

Nuget 包:AWSSDK.KinesisFirehose" 版本="3.3.103.28"

serviceCollection.AddScoped<IAmazonKinesisFirehose, AmazonKinesisFirehoseClient>();

使用依赖注入的 IAmazonKinesisFirehose

var data = "\"casenumber\": \"" + 123 + "\"";

// convert string to stream
var byteArray = Encoding.UTF8.GetBytes(data);

var putRecordRequest = new PutRecordRequest 
 DeliveryStreamName = Environment.GetEnvironmentVariable("KinesisFirehose"), // AWS console -> Data FIrehose -> "Firehose delivery streams" 
  Record = new Record 
   Data = new MemoryStream(byteArray)
  
;

// Put record into the DeliveryStream
Console.WriteLine($ "PutRecordAsync: data");

Console.WriteLine("Writing EmitScanDataToKinesisAsync");
await _fireHoseClient.PutRecordAsync(putRecordRequest);
Console.WriteLine("End EmitScanDataToKinesisAsync");

【讨论】:

很好,你解决了!您可能应该将环境变量“KinesisStream”重命名为“DeliveryStream”。这样可以更清楚地表明您在谈论 Firehose,而不是 Kinesis Data Stream。

以上是关于是否可以使用 .Net Core 2.2 在 AWS Lambda 上使用 Kinesis FireHose 执行 PutRecord?的主要内容,如果未能解决你的问题,请参考以下文章

CentOS7下使用Docker容器化.net Core 2.2

CentOS7下Docker与.net Core 2.2

在 ASP .Net Core 2.2 中添加 JWT 令牌后授权不起作用

如何在 ASP.NET Core 2.2 中使用 IValidateOptions 验证配置设置?

CentOS7下安装.NET Core SDK 2.2

获取 ASP.NET-Core 2.2 控制器中的控制器名称和方法名称