Как создать лямбда-функцию для обновления новой записи при усилении?

Как создать лямбда-функцию для обновления новой записи при усилении проекта с помощью GraphQL?

У меня есть проект расширения с использованием api GraphQL в качестве api (также DynamoDB).

Мое приложение представляет собой простой список задач, просто для изучения, поэтому я сохраняю задачи в своей DynamoDB, это моя схема:

type Todo @model @auth(rules: [{ allow: owner }]) {
    id: ID!
    title: String!
    status: String
}

Когда я создаю новый Todo, я устанавливаю только заголовок, а не статус, я хочу обновить статус со значением по умолчанию, используя функцию лямбда-триггера (я знаю, что мне не нужно это делать, но я пытаюсь это сделать Чтобы узнать больше о лямбда-функциях, см. усиление).

Итак, я выполнил шаги из расширить документы, но теперь я не могу понять, что делать дальше (я не знаком с лямбда-функциями aws).

Что я хочу сделать примерно так:

for each new record
newRecord.status = 'To do'
newRecord.update()

person Lucas Andrade    schedule 20.04.2020    source источник


Ответы (1)


Когда вы впервые создаете элемент Todo, он сохраняется как элемент в таблице DynamodDB. Чтобы обновить элемент задачи, вам необходимо обновить элемент в таблице DynamoDB.

Когда вы обновляете элемент в DynamoDB, вам необходимо использовать AWS SDK, чтобы справиться с этим. Самый простой SDK - использовать Клиент документов AWS DynamoDB, если вы используете nodejs в лямбда-функции.

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region
AWS.config.update({region: 'REGION'}); //replace Region with the region you are using ('EU-WEST-1')

// Create DynamoDB document client
var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


// put the the following code in the exports.handler in your lambda function
var params = {
  TableName: 'Todo-SOMERANDOMSTRING-ENV',//The name of your dynamodb table
  Key: {
    'id' : 'asasd123-asdsa1-12sdasads-12', // the id of your todo item
  },
  UpdateExpression: 'set status = :s',
  ExpressionAttributeValues: {
    ':s' : 'To do' // what the new status should be
  }
};
// and run the update function
docClient.update(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

Изменить

Основываясь на вашем комментарии, я думаю, что вы можете быть в разделе DynamoDB Lambda Triggers (?), И ваша шаблонная лямбда-функция может выглядеть так:

exports.handler = function (event, context) {
  console.log(JSON.stringify(event, null, 2));
  event.Records.forEach((record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log('DynamoDB Record: %j', record.dynamodb);
  });
  context.done(null, 'Successfully processed DynamoDB record');
};

Я сам раньше не использовал этот тип триггера, поэтому я не совсем уверен, как структурированы данные в записи, но я думаю, что он может быть доступен следующим образом:

record.data.id
//or
record.Item.id

Вы можете узнать это, перейдя в лямбда-консоль, найдите и откройте свою лямбда-функцию, перейдите в «мониторинг», а затем откройте «Просмотр журналов в CloudWatch» в AWS и проверьте журналы CloudWatch после создания элемента.

Предполагая, что это record.Item.id, ваш лямбда-код может выглядеть следующим образом (непроверенный):

var AWS = require('aws-sdk');
AWS.config.update({region: 'REGION'});
var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = function (event, context) {
  console.log(JSON.stringify(event, null, 2));
     event.Records.forEach((record) => {
        var params = {
           TableName: 'YOUR-DB-TABLE-NAME',
           Key: {
              'id' : record.Item.id,
           },
           UpdateExpression: 'set status = :status',
           ExpressionAttributeValues: {
              ':status' : 'To do' // what the new status should be
           }
        };
        docClient.update(params, function(err, data) {
           if (err) {
              console.log("Error", err);
           } else {
              console.log("Success", data);
           }
        });
      });
   context.done(null, 'Successfully processed DynamoDB record');
 };

Я не думаю, что этот код полностью завершен, и вам, возможно, придется изменить то, как / когда работает функция context.done (потому что я думаю, что она будет запущена до того, как код завершит обновление элемента), но это может дать вам несколько в правильном направлении.

person Engam    schedule 21.04.2020
comment
Большое спасибо! Только одно, чтобы получить доступ к идентификатору моей новой записи, следует ли мне использовать event.Records.forEach((record) => ..., а затем искать действие INSERT, а затем объект? - person Lucas Andrade; 21.04.2020