【问题标题】:Failing to write to DynamoDB using Lambda function with an S3 trigger使用带有 S3 触发器的 Lambda 函数无法写入 DynamoDB
【发布时间】:2023-03-09 22:23:02
【问题描述】:

我正在尝试编写一个 lambda 函数,每当将新图像写入 S3 存储桶时就会触发该函数。触发器已经使用正确的 S3 存储桶设置,所以我知道这不是问题。

lambda 函数本身具有角色 s3:GetObject 和 dynamodb.*(应该是 DynamoDB 写入的完全访问权限)。

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

这只是我尝试进行的一个简单练习,以便我可以继续进行更复杂的数据库写入。但截至目前,我没有将任何内容写入art 表,即使我正在向触发触发器的 S3 存储桶添加新对象。是否有可能未部署 lambda 函数?我直接在 Lambda 控制台的内联编辑器中编写并保存。

代码如下:

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

【问题讨论】:

  • 可以分享 cloudwatch 日志吗?顺便说一句,保存您的 lambda 函数就足以让它准备好工作:它们不是以经典方式部署,并且每次调用它时都会创建新实例。
  • 单击您的 Lambda,单击监控选项卡,然后单击“查看 CloudWatch 中的日志”按钮。查找并打开最新的日志流。这是您的日志被写入的地方。如果需要,请在您的函数中添加更多 console.log 语句以确定哪一行代码失败。
  • 我应该在 CloudWatch 日志中看到什么具体内容吗?我有一个开始、结束和报告日志,每个日志都具有相同的 requestID。我在桌子上放置物品的方法对你们来说是否正确?我很难准确理解如何指定要放置为主键的项目以及哪些项目应该是该键的属性,因此我尝试先放置主键。我会尝试在明天早上放置一些 console.log 语句,看看我能找到什么。

标签: amazon-web-services aws-lambda amazon-dynamodb aws-sdk


【解决方案1】:

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

使用 async 处理程序,您需要等待并返回,例如,您可以将此 sn-p 更改为:

const data = await docClient.put(params).promise();
return data;

或者您可以使用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.
    }
  });
};

【讨论】:

  • 谢谢。所以现在我已经摆脱了异步调用,该函数实际上是根据 CloudWatch 日志运行的。但是,由于以下异常而失败:ValidationException: One or more parameter values were invalid: Missing the key imageTitle in the item。但是我相信我在分配 imageTitle: imageName 时正在为键输入一个值?这不是你给主键赋值的方式吗?
  • 不-你需要使用{ Key: { imageTitle: imageName }, Item: { imageURL: url }, TableName : 'art' }
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 2021-12-28
  • 2023-01-02
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2021-01-23
  • 2018-10-03
相关资源
最近更新 更多