如何创建一个 lambda 函数来更新放大的新记录?

Posted

技术标签:

【中文标题】如何创建一个 lambda 函数来更新放大的新记录?【英文标题】:How to create a lambda function to update a new record on amplify? 【发布时间】:2020-08-03 03:00:06 【问题描述】:

如何使用 GraphQL 创建 lambda 函数来更新 amplify 项目的新记录?

我有一个使用 api GraphQL 作为 api(也是 dynamoDB)的放大项目。

我的应用程序是一个简单的待办事项列表,只是为了学习,所以我将待办事项保存在我的 dynamoDB 上,这就是我的架构:

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

当我创建一个新的待办事项时,我只设置标题,而不是状态,我想使用 lambda 触发器函数用默认值更新状态(我知道我不必这样做,但我我正在尝试学习更多关于放大的 lambda 函数)。

所以我按照amplify docs 的步骤进行操作,但现在我不知道下一步是什么(我不熟悉 aws lambda 函数)。

我想做的事情是这样的:

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

【问题讨论】:

【参考方案1】:

当您首次创建 Todo 项目时,它会作为项目存储在 DynamodDB 表中。要更新待办事项,您需要更新 DynamoDB 表中的项目。

当您更新 DynamoDB 中的项目时,您需要使用 AWS 开发工具包来处理此问题。如果您在 lambda 函数中使用 nodejs,最简单的 sdk 是使用 AWS DynamoDB Document Client。

// 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 触发器部分 (?),您的样板 lambda 函数可能如下所示:

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

您可以通过转至 lambda 控制台找到并打开您的 lambda 函数,转至“监控”,然后在 AWS 中打开“查看 CloudWatch 中的日志”,并在创建项目后检查 CloudWatch 日志。

假设它是 record.Item.id,您的 lambda 代码可能如下所示(未经测试):

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”函数的工作方式/时间(因为我认为它会在代码完成更新项目之前运行),但它可能让您朝着正确的方向前进。

【讨论】:

非常感谢!只有一件事,要访问我的新记录的 id,我应该使用 event.Records.forEach((record) => ... 然后查找 INSERT 操作,然后查找对象吗?

以上是关于如何创建一个 lambda 函数来更新放大的新记录?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda Invoke 不执行 lambda 函数

如何使用放大框架/cli 配置 dynamodb-to-lambda 触发器

如何使用 lambda 将 s3 中的最新代码部署到 lambda 函数

放大不拉取远程 Lambda 更改

使用 Boto3 更新 Lambda 函数以使用新的层版本

放大获取 lambda 中的托管 URL 作为环境变量