Лямбда-выход идет в логи, а не отображается в ответ? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь объединить два объекта JSON, которые я предоставлял из разных сервисов, в один. Я получаю желаемую информацию, но она отображается в журналах, а не в ответе.

Обновлен лямбда-код с использованием Async / Await

       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 в массиве, и я буду использовать этот массив в моей функции обратного вызова.

Любая помощь приветствуется Спасибо

1 Ответ

0 голосов
/ 15 сентября 2018

Функции AWS SDK, как правило, асинхронные, поэтому важно понимать, как программировать асинхронный JavaScript с помощью Promises и async / await.

Вот один из способов сделать это немного более линейными, надеюсь, немного легче следовать.

const AWS = require('aws-sdk');
const _ = require('lodash');

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 metrics = async (bucketName) => {
  const params = {
    EndTime: 1536128999,
    MetricDataQueries: [{
      Id: 'm17',
      MetricStat: {
        Metric: {
          Dimensions: [
            {
              Name: 'BucketName',
              Value: bucketName,
            },
            {
              Name: 'StorageType',
              Value: 'StandardStorage',
            },
          ],
          MetricName: 'BucketSizeBytes',
          Namespace: 'AWS/S3',
        },
        Period: 86400,
        Stat: 'Sum',
        Unit: 'Bytes',
      },
      ReturnData: true,
    }],
    StartTime: 1536085800,
  };

  return cloudwatch.getMetricData(params).promise();
};

exports.handler = async (event) => {
  try {
    // List all bucket data
    const bucketData = await S3.listBuckets({}).promise();

    // Use map to transform bucket data to just the bucket names
    const bucketNames = _.map(bucketData.Buckets, bucket => bucket.Name);

    // Get metrics for each bucket by name
    const bucketMetrics = await Promise.all(_.map(bucketNames, bucket => metrics(bucket)));

    // Use map to transform bucket metrics to just the bucket sizes
    const bucketSizes = bucketMetrics.map(m => m.MetricDataResults[0].Values[0] || 0);

    // Use zipWith to combine the bucket names and corresponding bucket sizes
    return _.zipWith(bucketNames, bucketSizes, (bn, bs) => ({ bucket: bn, size: bs }));
  } catch (err) {
    console.log(err.message);
    throw err;
  }
};

Результат этого кода выглядит следующим образом:

[
  {
    "bucket": "mybucket-of-images",
    "size": 1209721781
  },
  {
    "bucket": "backup-project",
    "size": 2048
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...