Можно ли выполнить PutRecord с Kinesis FireHose на AWS Lambda, используя. Net Core 2.2? - PullRequest
0 голосов
/ 06 февраля 2020

Причина, по которой я спрашиваю об этом, потому что я не вижу никаких официальных документов, в которых упоминается выполнение PutRecord из AWS лямбда-функции в FireHose. Я хочу выполнить PutRecord из AWS лямбды на Kinesis FireHose. Я также дал соответствующую политику PutRecord для AWS лямбда-функции, из которой я пытаюсь выполнить PutRecord. Я получаю следующую ошибку при выполнении действия PutRecord из AWS Lambda с использованием. Net 2.2

Пользователь: arn: aws: sts :: accountnumber: предполагаемая роль / роль слушателя / лямбда не авторизован для выполнения: kinesis: PutRecord на ресурсе: arn: aws: kinesis: us-west-1: номер счета: предполагается: 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"
  ]
}

enter image description here

. 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);

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Вы пытаетесь поместить данные в поток данных Kinesis. Ваша политика позволяет помещать данные в пожарный шланг Kinesis. Это может несколько запутать из-за различных вкусов Kinesis. Если вы действительно пытаетесь поместить данные в поток данных Kinesis , вам следует изменить действие политики на «kinesis: Put *».

С другой стороны, если вы хотите поместить данные в Kinesis Firehose измените свой код. NET на что-то вроде этого (я не эксперт. NET):

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

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

// Put record into the DeliveryStream
firehoseClient.putRecord(putRecordRequest);
0 голосов
/ 06 февраля 2020

Я использовал не тот клиент для записи записи на Kinesis Firehose. Клиент KinesisFireHose выглядит примерно так.

Пакет Nuget: AWSSDK.KinesisFirehose "Version =" 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");
...