使用Lambda函数和S3触发器未能写入DynamoDB

KSa*_*mra 0 amazon-web-services amazon-dynamodb aws-sdk aws-lambda

我正在尝试编写一个lambda函数,该函数会在将新映像写入S3存储桶时触发。触发器已经使用正确的S3存储桶进行了设置,因此我知道这不是问题。

lambda函数本身具有s3:GetObject和dynamodb。*角色(对于DynamoDB写操作应具有完全访问权限)。

这里的目标是简单地写一个我已经创建的名为'art'的表,并插入一个我试图从中获取的主键值(imageTitle)var imageName。然后,我想为该键分配一个属性,即存储在中的该图像的url var url

这只是我要尝试的简单练习,因此我可以继续进行更复杂的数据库写入。但是到目前为止,art即使我向S3存储桶中添加了触发触发器的新对象,也没有将任何内容写入表中。lambda函数是否可能未部署?我直接在Lambda Console的内联编辑器中编写了它并保存了它。

这是代码:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    //var sourceBucket = event.Records[0].s3.bucket.name;
    var sourceKey = event.Records[0].s3.object.key;
    var imageName = sourceKey.stringify;

    //generate imageURL
    var url = "https://s3.amazonaws.com/myapp-20181030214040-deployment/public/" + imageName;

    var params = {
        TableName : 'art',
        Item: {
            imageTitle: imageName,
            imageURL: url
        }
    };
    docClient.put(params, function(err, data) {
       if (err) console.log(err);
       else console.log(data);
    });
};
Run Code Online (Sandbox Code Playgroud)

tho*_*ace 5

这里的问题是您正在使用异步lambda,但未返回任何可等待的内容。这意味着您的lambda将在docClient.put发送操作之前终止。

使用异步处理程序,您需要等待并返回,例如,您可以将此代码段更改为:

const data = await docClient.put(params).promise();
return data;
Run Code Online (Sandbox Code Playgroud)

或者相反,您可以使用此callback方法(请注意,处理程序的签名已不再包含async):

exports.handler = (event, context, callback) => {
  // ... the rest of the code as was ...
  docClient.put(params, function(err, data) {
    if (err) {
      console.log(err);
      callback(err); // return 'lambda invoke failed because of the error' - will cause s3 to retry three times.
    } else {
      console.log(data);
      callback(null, data); // return 'nothing failed'; n.b. the s3 trigger ignores whatever you return.
    }
  });
};
Run Code Online (Sandbox Code Playgroud)