当前位置: 首页 > 知识库问答 >
问题:

使用AWS Lambda将记录推送到AWS DynamoDB

吴涵育
2023-03-14

我正在尝试将一条记录从AWS Lambda函数推送到AWS DynamoDB。我可以使用AWSAPI成功地从我的pc上推送一条记录,但是当我将代码部署到AWS时,我就卡住了。

下面是可以从我的电脑成功推送记录的示例代码:

const AWS = require("aws-sdk");
AWS.config.update({
  region: "eu-west-1",
  endpoint: "https://dynamodb.eu-west-1.amazonaws.com"
});
const docClient = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: "hello-world-bot",
  Item: {
    timestamp: Date.now(),
    chat_id: 123,
    text: 'text',
  },
};

console.log("Adding a new item...");
docClient.put(params, function(err, data) {
    if (err) {
        console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Added item:", JSON.stringify(data, null, 2));
    }
});

以及DynamoDB中的结果:来自DynamoDB控制台的屏幕截图

下面是我试图部署到Lambda的代码:

const AWS = require("aws-sdk");
AWS.config.update({
  region: "eu-west-1",
  endpoint: "https://dynamodb.eu-west-1.amazonaws.com",
});
const docClient = new AWS.DynamoDB.DocumentClient();

module.exports.helloworld = (event) => {
  const params = {
    TableName: "hello-world-bot",
    Item: {
      timestamp: Date.now(),
      chat_id: 123,
      text: "text",
    },
  };

  console.log("Adding a new item...");
  docClient.put(params, function (err, data) {
    if (err) {
      console.error(
        "Unable to add item. Error JSON:",
        JSON.stringify(err, null, 2)
      );
    } else {
      console.log("Added item:", JSON.stringify(data, null, 2));
    }
  });
  return { statusCode: 200 };
};

问题是,当Lambda函数运行时,DynamoDB中没有任何记录。以下是我拉取Lambda外部API并尝试运行函数时CloudWatch的日志:

START RequestId: d9e171c2-a763-4df1-9ec3-06d79eb68a1e Version: $LATEST
2021-08-13T06:03:01.974Z    d9e171c2-a763-4df1-9ec3-06d79eb68a1e    INFO    Adding a new item...
END RequestId: d9e171c2-a763-4df1-9ec3-06d79eb68a1e
REPORT RequestId: d9e171c2-a763-4df1-9ec3-06d79eb68a1e  Duration: 45.04 ms  Billed Duration: 46 ms  Memory Size: 1024 MB    Max Memory Used: 88 MB  Init Duration: 524.54 ms

正如您所看到的,没有任何关于权限或其他方面的错误。以下是用户权限,其凭据用于Lambda中的此函数:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:BatchWriteItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:eu-west-1:120400915578:table/hello-world-bot"
        }
    ]
}

共有2个答案

鲜于德泽
2023-03-14

您的返回{statusCode:200}结束lambda调用,但不会等待put请求完成。事实上,它甚至可能不会等到它开始。

put回调返回主函数,或者使用promise。promise的例子:

module.exports.helloworld = async (event) => { // <- use async
  const params = {
    TableName: "hello-world-bot",
    Item: {
      timestamp: Date.now(),
      chat_id: 123,
      text: "text",
    },
  }

  console.log("Adding a new item...")
  // Create a promise and return it
  return docClient
    .put(params)
    .promise()
    .then(() => {
      console.log("success")
      return {statusCode: 200}
    })
    .catch(e => {
      console.log("error: ", e)
      return {statusCode: 500}
    })
}

此外,正如@jens在评论中指出的,不需要明确地设置dynamodbendpoint

都建树
2023-03-14

正如我在另一个答案的评论中指出的,他们的回报声明似乎并不完全正确。我更喜欢对lambda和AWS SDK开箱即用支持的promise使用异步等待语法。

这会将您的代码更改为如下所示:

const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient();

module.exports.helloworld = async (event) => {
  const params = {
    TableName: "hello-world-bot",
    Item: {
      timestamp: Date.now(),
      chat_id: 123,
      text: "text",
    },
  };

  console.log("Adding a new item...");
  try {
    await docClient.put(params).promise();
    return { statusCode: 200 };
  } catch (err) {
    console.error("Unable to add item. Error JSON:",
        JSON.stringify(err, null, 2));
    return { statusCode: 500 };
  }
};

PS:正如评论中所指出的,如果您使用的是默认endpoint,则不需要为DynamoDB设置endpoint。由于您以Lambda的形式运行函数,AWS_REGION环境变量将自动设置,因此您也无需自行配置(除非您希望访问另一个区域中的DynamoDB表)。

 类似资料:
  • 问题内容: 在当前版本的React Router(v3)中,我可以接受服务器响应并用于转到相应的响应页面。但是,这在v4中不可用,我不确定哪种适当的处理方式。 在此示例中,使用Redux,当用户提交表单时, components / app-product-form.js 调用。服务器返回成功后,该用户将被带到“购物车”页面。 如何从React Router v4的功能重定向到购物车页面? 问题答

  • 我想使用heroku pg:push命令将本地postgresql数据库推送到heroku。命令如下所示: 。 我的应用程序的名称是。我尝试了。输出是: 我很惊讶我没有在数据库中输入任何内容。但我仍然运行heroku pg:reset DATABASE来重置我的数据库。之后,我再次尝试了heroku pg:推送mysitedb数据库——app secure-gorge-4090,但输出仍然相同。

  • 问题内容: 我想使用Java将“推送通知”消息发送到特定的iPhone设备。 我不知道该怎么做。 我对此进行了谷歌搜索,他们建议使用“ PayLoad”类,但不要从任何jar文件中获取此类。 请有人指导我通过Java将推送通知消息发送到iPhone吗? 问题答案: 使用JavaPNS。例如:

  • 问题内容: 我想使用apache log4j将日志记录添加到正在开发的应用程序中。在这一点上,我想将所有级别为INFO和更低级别(TRACE,DEBUG)的日志消息重定向到stdout,并将所有其他日志消息从WARN及更高版本(ERROR,FATAL)重定向到stderr。例如: 那么我的log4j.properties文件应该是什么?这是如何看待这一时刻的: 上面配置的问题是logger.err

  • 英文原文:http://emberjs.com/guides/models/pushing-records-into-the-store/ 仓库可以认为是所有应用加载的记录的一个缓存池。如果应用中的控制器或者路由请求一个记录,当记录已经被缓存时,仓库会立即将其返回。否则仓库必须请求适配器去加载这个记录,这通常就意味着需要通过网络去服务器端去获取该记录。 为了避免一直等待着应用获取记录,可以事先将记

  • 问题内容: 我已经创建了自己的docker文件(该文件运行一个显示“ helloworld”的shell脚本)。图像是“ hellodocker”,标签是“ mytag”,我现在拥有: 如何将Docker映像推送到dockerhub?我用。这给出了“无此类ID”错误。我想念什么?提前致谢。 问题答案: 您要么在构建时就将其标记为标签,例如 或创建绑定到同一图像的新标签,即