我正在尝试将一条记录从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"
}
]
}
您的返回{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
正如我在另一个答案的评论中指出的,他们的回报声明似乎并不完全正确。我更喜欢对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”错误。我想念什么?提前致谢。 问题答案: 您要么在构建时就将其标记为标签,例如 或创建绑定到同一图像的新标签,即