Как обработать DynamoDBEvent в C # лямбда-функции? - PullRequest
0 голосов
/ 29 апреля 2018

Я создал функцию C # Lambda, которая запускается потоком DynamoDB. Это оправдано просто отлично. Однако StreamRecord значения NewImage не возвращает значений. Счетчик 0. Что я делаю не так? Я проверил всю документацию AWS, но это все больше и больше похоже на ошибку. Моя ниже лямбда-функция должна работать, и она должна возвращать как минимум 1 StreamRecord в моем примере. attributeMap.Count всегда возвращает 0, но должен возвращать 1.

    public void FunctionHandler(DynamoDBEvent dynamoDbEvent, ILambdaContext context)
    {
        Console.WriteLine($"Beginning to process {dynamoDbEvent.Records.Count} records...");

        foreach (var record in dynamoDbEvent.Records)
        {
            Console.WriteLine($"Event ID: {record.EventID}");
            Console.WriteLine($"Event Name: {record.EventName}");

            var attributeMap = record.Dynamodb.NewImage;
            if (attributeMap.Count > 0) // If item does not exist, attributeMap.Count will be 0
            {
                Console.WriteLine(attributeMap["AccountId"].S);
            }
        }

        Console.WriteLine("Stream processing complete.");
    }

1 Ответ

0 голосов
/ 29 апреля 2018

ОБНОВЛЕНИЕ: 4 октября 2018. Я больше не использую приложение администратора. Теперь я использую CloudFormation исключительно для создания и поддержки всего, включая конвейеры CI / CD с CodePipelines. Это включает в себя все серверные функции ламбы в .NET Core 2.1.

Я понял это. Самое неприятное, что в Документах AWS об этом ничего не говорится. Это была боль в заднице, чтобы узнать. Для тех, кому эта информация может понадобиться, она такова: вам нужно установить тип представления потока при создании потока DynamoDB для таблицы. Вот изображение для Консоли AWS:

enter image description here

Однако, поскольку я настраивал все таблицы через консоль администратора (в C # Core 2.0), вот как я настраиваю таблицу настройки, включая спецификацию потока и запрос на сопоставление источника событий с функцией лямбда:

        var request = new CreateTableRequest
        {
            TableName = TABLE_CREATE_ACCOUNT,
            AttributeDefinitions = new List<AttributeDefinition>()
            {
                new AttributeDefinition
                {
                    AttributeName = "CommandId",
                    AttributeType = ScalarAttributeType.S
                }
            },
            KeySchema = new List<KeySchemaElement>()
            {
                new KeySchemaElement
                {
                    AttributeName = "CommandId",
                    KeyType = KeyType.HASH
                }
            },
            ProvisionedThroughput = new ProvisionedThroughput
            {
                ReadCapacityUnits = 1,
                WriteCapacityUnits = 1
            },
            StreamSpecification = new StreamSpecification
            {
                StreamEnabled = true,
                StreamViewType = StreamViewType.NEW_IMAGE
            }
        };

        try
        {
            var response = _db.CreateTableAsync(request);
            var tableDescription = response.Result.TableDescription;
            Console.WriteLine("{1}: {0} ReadCapacityUnits: {2} WriteCapacityUnits: {3}",
                tableDescription.TableStatus,
                tableDescription.TableName,
                tableDescription.ProvisionedThroughput.ReadCapacityUnits,
                tableDescription.ProvisionedThroughput.WriteCapacityUnits);
            string status = tableDescription.TableStatus;
            Console.WriteLine(TABLE_CREATE_ACCOUNT + " - " + status);
            WaitUntilTableReady(TABLE_CREATE_ACCOUNT);

            // This connects the DynamoDB stream to a lambda function
            Console.WriteLine("Creating event source mapping between table stream '"+ TABLE_CREATE_ACCOUNT + "' and lambda 'ProcessCreateAccount'");
            var req = new CreateEventSourceMappingRequest
            {
                BatchSize = 100,
                Enabled = true,
                EventSourceArn = tableDescription.LatestStreamArn,
                FunctionName = "ProcessCreateAccount",
                StartingPosition = EventSourcePosition.LATEST
            };
            var reqResponse =_lambda.CreateEventSourceMappingAsync(req);
            Console.WriteLine("Event source mapping state: " + reqResponse.Result.State);
        }
        catch (AmazonDynamoDBException e)
        {
            Console.WriteLine("Error creating table '" + TABLE_CREATE_ACCOUNT + "'");
            Console.WriteLine("Amazon error code: {0}", string.IsNullOrEmpty(e.ErrorCode) ? "None" : e.ErrorCode);
            Console.WriteLine("Exception message: {0}", e.Message);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error creating table '" + TABLE_CREATE_ACCOUNT + "'");
            Console.WriteLine("Exception message: {0}", e.Message);
        }

Ключ

StreamViewType = StreamViewType.NEW_IMAGE

Вот и все.

...