代码之家  ›  专栏  ›  技术社区  ›  Private

Lambda输出将被记录而不是显示在响应中?

  •  -2
  • Private  · 技术社区  · 6 年前

    使用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);
        }    
    
    };
    

    感谢您的帮助 谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   jarmod    6 年前

    通常,awsdk函数是异步的,因此了解如何使用Promises和async/await编写异步JavaScript非常重要。

    这里有一种方法,它更线性,希望更容易遵循。

    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
      }
    ]