Как получить настройки шифрования по умолчанию для корзины Amazon S3 через Javascript SDK - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы перечислить настройки шифрования по умолчанию (нет, AES-256, AWS-KMS) для всех моих корзин s3, используя AWS SDK для javascript. (2.305)

Сначала я выбираю все сегменты с помощью listBuckets, а затем перебираю все сегменты с помощью функции getBucketEncryption.

Моя проблема в том, что getBucketEncryption является асинхронным, и поэтому я использую обещания, чтобы дождаться обработки всех запросов. Поэтому я добавляю все обещания в список и жду их с Promise.all(). Наконец, когда я получаю все результаты, я не знаю, к какому контейнеру относятся результаты, потому что getBucketEncryption не возвращает имя сегмента с данными, и обещания могут быть выполнены в любом порядке.

Каким-то образом мне нужно обернуть обещание вокруг вызова s3.getBucketEncryption, где я могу передать имя сегмента, чтобы оно позже было у меня для оценки ... но как?

А вот и код:

console.log('Loading function');

const aws = require('aws-sdk');

const s3 = new aws.S3({ apiVersion: '2006-03-01', region: 'eu-west-1' });

function reflect(promise){
    return promise.then(
        function(v){ return {cryptSetting:v, status: "COMPLIANT" }},
        function(e){ return {error:e, status: "NON_COMPLIANT"}});
}

s3.listBuckets({},function(err,data){
    if (err){
        console.log(err, err.stack); // an error occurred
    } 
    else{

        var bucketList = JSON.parse(JSON.stringify(data.Buckets));

        var list = new Array();

        for(let i in bucketList){
            list.push(s3.getBucketEncryption({Bucket: bucketList[i].Name})
            .promise());      
        }   

        Promise.all(list.map(reflect)).then(function(values) {

            for(let i in values){
                // at this point I do not have the bucket name any more
                // because it's not included in the values array
                console.log("Bucketname missing here " + values[i].cryptSetting
                + ' ' + values[i].status);
            }
          });

     }  
});

Вывод выглядит так:

Loading function

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here undefined NON_COMPLIANT

Bucketname missing here undefined NON_COMPLIANT

Bucketname missing here [object Object] COMPLIANT

Bucketname missing here undefined NON_COMPLIANT

1 Ответ

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

Хорошие новости ..... это действительно просто.

Массив values гарантированно совпадает с массивом bucketList, независимо от порядка выполнения обещаний.

То есть bucketList[i] будет соответствовать values[i].

s3.listBuckets({}, function(err, data) {
    if (err) {
        console.log(err, err.stack); // an error occurred
    } else {
        var bucketList = JSON.parse(JSON.stringify(data.Buckets));
        var promises = bucketList.map(function(b) {
            return s3.getBucketEncryption({ 'Bucket':b.Name }).promise();
        });
        Promise.all(promises.map(reflect)).then(function(values) {
            for(let i in values) {
                // `values` is guaranteed to be congruous with `bucketList`.
                // ie. `bucketList[i]` corresponds with `values[i]`.
                console.log([bucketList[i].name, values[i].cryptSetting, values[i].status].join(' '));
            }
        });
    }  
});

Другим способом было бы:

  • продвинуться reflect на bucketList.map() стадию.
  • украшает (в закрытии bucketList.map(...)) каждый из values, доставленных reflect() со свойством .bucket.
s3.listBuckets({}, function(err, data) {
    if (err) {
        console.log(err, err.stack); // an error occurred
    } else {
        var bucketList = JSON.parse(JSON.stringify(data.Buckets));
        var promises = bucketList.map(function(b) {
            var promise = s3.getBucketEncryption({ 'Bucket':b.Name }).promise();
            return reflect(promise).then(function(value) {
                return Object.assign(value, { 'bucket':b });
            });
        });
        Promise.all(promises).then(function(values) {
            for(let i in values) {
                // each value now has a '.bucket' property.
                console.log([values[i].bucket.name, values[i].cryptSetting, values[i].status].join(' '));
            }
        });
    }
});
...