AWS Lambda 函数在控制台上测试时有效,但在 CloudWatch 事件触发时无效
AWS Lambda Function works when tested on console, but not when CloudWatch event triggers it
我在 node 中编写了一个 Twitter 机器人,它转发一些从搜索返回的推文。我已将它与 Webpack 捆绑在一起并使用 AWS Lambda 进行部署。我已将 cloudWatch 事件设置为每小时触发一次该功能。
我已经记录了函数的开始和结束,以及每次函数 successfully/unsuccessfully 转推。
它在我 运行 在本地运行时有效。当我在 Lambda 管理控制台上测试它时,它起作用了。但是在我的 CloudWatch Logs 中,开始和结束日志之间没有长。有趣的是,如果我将事件触发速率降低到 <5 分钟,它会再次起作用。我很困惑。知道如何解决此问题吗?
这是测试日志。该函数按预期工作。
START RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Version: $LATEST
2019-01-23T18:18:42.111Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Start
2019-01-23T18:18:42.312Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.312Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 End
END RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510
REPORT RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Duration: 881.20 ms Billed Duration: 900 ms Memory Size: 128 MB Max Memory Used: 64 MB
这是我的代码。
const learnInPublicRetweet = async () => {
const query = '#SomeHashtag';
const params = {
q: query,
result_type: 'recent',
lang: 'en'
};
console.log('Start');
let data = await T.get('search/tweets', params);
const { statuses } = data.data;
statuses.forEach(async ({ id_str: id, user }) => {
if (user.id_str !== '1032750379597946880') {
try {
await T.post('statuses/retweet/:id', { id });
console.log(`Retweeted tweet with id ${id}`);
} catch (err) {
console.log('Error retweeting');
console.log(err.message);
}
}
});
console.log('End');
};
exports.retweet = learnInPublicRetweet;
这是我的 cloudwatch 日志
16:44:13 START RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Version: $LATEST
16:44:14 2019-01-23T16:44:14.159Z 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Start
16:44:14 2019-01-23T16:44:14.938Z 34df836d-c9b3-4b9a-9547-8f3be7ed5297 End
16:44:14 END RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297
您的代码中可能有几处错误。
全局变量缓存,阅读更多best practices
尝试更改它:async function learnInPublicRetweet() { ... }
您正在使用 forEach 循环,我确信它不适用于异步调用。它将触发所有异步调用并立即 return。如果遍历对象的可枚举属性,您将需要使用 for .. of
或 for .. in
。
我在 node 中编写了一个 Twitter 机器人,它转发一些从搜索返回的推文。我已将它与 Webpack 捆绑在一起并使用 AWS Lambda 进行部署。我已将 cloudWatch 事件设置为每小时触发一次该功能。 我已经记录了函数的开始和结束,以及每次函数 successfully/unsuccessfully 转推。
它在我 运行 在本地运行时有效。当我在 Lambda 管理控制台上测试它时,它起作用了。但是在我的 CloudWatch Logs 中,开始和结束日志之间没有长。有趣的是,如果我将事件触发速率降低到 <5 分钟,它会再次起作用。我很困惑。知道如何解决此问题吗?
这是测试日志。该函数按预期工作。
START RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Version: $LATEST
2019-01-23T18:18:42.111Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Start
2019-01-23T18:18:42.312Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.312Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Error retweeting
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z 8f2a4423-5aca-447e-9d24-a18b8c5ff510 End
END RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510
REPORT RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Duration: 881.20 ms Billed Duration: 900 ms Memory Size: 128 MB Max Memory Used: 64 MB
这是我的代码。
const learnInPublicRetweet = async () => {
const query = '#SomeHashtag';
const params = {
q: query,
result_type: 'recent',
lang: 'en'
};
console.log('Start');
let data = await T.get('search/tweets', params);
const { statuses } = data.data;
statuses.forEach(async ({ id_str: id, user }) => {
if (user.id_str !== '1032750379597946880') {
try {
await T.post('statuses/retweet/:id', { id });
console.log(`Retweeted tweet with id ${id}`);
} catch (err) {
console.log('Error retweeting');
console.log(err.message);
}
}
});
console.log('End');
};
exports.retweet = learnInPublicRetweet;
这是我的 cloudwatch 日志
16:44:13 START RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Version: $LATEST
16:44:14 2019-01-23T16:44:14.159Z 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Start
16:44:14 2019-01-23T16:44:14.938Z 34df836d-c9b3-4b9a-9547-8f3be7ed5297 End
16:44:14 END RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297
您的代码中可能有几处错误。
全局变量缓存,阅读更多best practices
尝试更改它:
async function learnInPublicRetweet() { ... }
您正在使用 forEach 循环,我确信它不适用于异步调用。它将触发所有异步调用并立即 return。如果遍历对象的可枚举属性,您将需要使用
for .. of
或for .. in
。