【发布时间】:2019-02-19 04:04:20
【问题描述】:
我正在尝试将我从不同服务呈现的两个 JSON 对象合并为一个。我得到了想要的输出,但输出进入日志而不是显示在响应中。
使用 Async/Await 更新了 Lambda 代码
const AWS = require('aws-sdk');
exports.handler =async(event, context, callback)=> {
const S3 = new AWS.S3({region: "ap-south-1",apiVersion: '2006-03-01'});
const cloudwatch = new AWS.CloudWatch({region: "ap-south-1",apiVersion: '2010-08-01'});
const params= {};
var itemsProcessed = 0;
try {
const instancesData = await S3.listBuckets(params).promise();
var size = Object.keys(instancesData.Buckets).length;
var MName = [];
// instancesData.Buckets.forEach(function(x){
// BName.push(x.Name);
// });
for (let i = 0; i < size;i++) {
var Json1 = instancesData.Buckets[i];
var BuckName = instancesData.Buckets[i].Name;
// itemsProcessed++;
var params1 = {
EndTime: 1536128999, /* required */
MetricDataQueries: [ /* required */
{
Id: 'm17', /* required */
MetricStat: {
Metric: { /* required */
Dimensions: [
// {
// Name: 'BucketName', /* required */
// Value: x /* required */
// },
{
Name: 'BucketName', /* required */
Value: BuckName /* required */
},
{
Name: 'StorageType', /* required */
Value: 'StandardStorage' /* required */
}
/* more items */
],
MetricName: 'BucketSizeBytes',
Namespace: 'AWS/S3'
},
Period: 86400, /* required */
Stat: 'Sum', /* required */
Unit: 'Bytes'
},
ReturnData: true
},
/* more items */
],
StartTime: 1536085800, /* required */
};
var Json2 = await cloudwatch.getMetricData(params1).promise();
var obj = Object.assign(Json1, Json2);
MName.push(obj);
}
callback(null,MName);
}
catch (err) {
callback(err.message);
}
};
这是为我工作的。它将所有组合的 json 存储在一个数组中,我将在我的回调函数中使用该数组。
任何帮助表示赞赏 谢谢
【问题讨论】:
-
这是一个标准的异步 JavaScript 问题。您将不得不学习如何使用 Promises 或 async/await,以便您的 Lambda 函数在其所有 S3 和 CloudWatch 调用完成之前不会完成。值得一读aws.amazon.com/blogs/compute/…和irvinlim.com/blog/async-await-on-aws-lambda
-
我不确定您所说的“响应部分”与“日志部分”是什么意思。这些东西是不存在的。有日志,就有结果。当您调用 console.log() 时,CloudWatch Logs 中会显示一条日志。当您的 Lambda 函数完成时,它可以/应该产生结果。我不知道您希望该结果是什么,但现在它是字符串“success”,它可能发生在错误的时间(在所有异步 AWS 开发工具包调用完成之前)。
-
如果您只想将存储桶及其合并指标记录到 CloudWatch Logs,请继续使用 console.log()。如果您确实想将该数据作为 Lambda 函数的结果返回,则将这些对象累积到一个数组中,并将其作为 Lambda 函数的结果。无论哪种方式,您都需要解决当前的问题,即在所有 SDK 调用完成之前进行结果回调。请阅读之前的链接。
-
嗨,您现在使用 setTimeout() 的解决方案并不理想。您在猜测代码需要多长时间才能完成,这很脆弱,而且没有必要。它要么花费你超过必要的成本(如果处理提前完成),要么无法提供正确的结果(如果处理完成得太晚)。我将添加一个更可靠的解决方案作为答案。了解有关异步 JavaScript 的更多信息非常重要。
-
版主注意:请不要破坏您的帖子。一旦您发布问题,它们就属于该网站及其用户。即使它不再对您有用,它可能仍然对将来的某人有益。如果您的帖子中泄露了任何机密信息,请使用虚拟数据对其进行编辑,并标记要编辑的历史记录。
标签: node.js amazon-web-services aws-lambda