0

工作流程是构建 AWS IAM 用户访问密钥对象。然后推送到全局数组。最后打印数组。问题是在 forEach 中调用子例程以获取用户访问密钥。访问键在回调中返回,然后推送到全局数组,但这些值永远不会返回到最终语句以打印全局数组。

任何帮助将非常感激。

下面是两个函数:

// Build IAM user profile, then make subroutine to get their access keys 
function analyseReport(iam, report, des, ac) {

    new csv(report, {
        header: true
    }).forEach(function(object) {

        accumulateSize++
        var iamObj = {};

        iamObj.account = ac;
        iamObj.account_name = des;
        iamObj.user = object.user;

        if (object.access_key_1_active == 'true') {

            iamObj.access_key_1 = 'null';
            iamObj.access_key_1_active = object.access_key_1_active;
            iamObj.access_key_1_last_rotated = object.access_key_1_last_rotated;
            iamObj.access_key_1_last_used_date = object.access_key_1_last_used_date;
            iamObj.access_key_1_last_used_service = object.access_key_1_last_used_service;
        }

        if (object.access_key_2_active == 'true') {

            iamObj.access_key_2 = 'null';
            iamObj.access_key_2_active = object.access_key_2_active;
            iamObj.access_key_2_last_rotated = object.access_key_2_last_rotated;
            iamObj.access_key_2_last_used_date = object.access_key_2_last_used_date;
            iamObj.access_key_2_last_used_service = object.access_key_2_last_used_service;
        }

        if (iamObj.access_key_1_active == 'true' || iamObj.access_key_2_active == 'true') {

            var params = {
                UserName: object.user
            };

            // Get access keys for user
            iam.listAccessKeys(params, function(err, data) {

                if (err) console.log(err, err.stack);
                else {
                    appendKeysCounter++;

                    // Append the access key to the user object, then push to global array
                    appendKeys(data, iamObj,function(returnValue){

                        userAry.push(returnValue);

                    });
                };
            });
        }
    });

    if (appendKeysCounter == 0) {

        console.log('Final report size : ', userAry.length);
        console.log('Final report : ');
        userAry.forEach(item => console.log(item));
    }
}


function appendKeys(data, iamObj, callback) {

    appendKeysCounter--;

    data.AccessKeyMetadata.forEach(function(keysObj) {

        if (keysObj.Status == 'Active') {

            if (isDate(iamObj.access_key_1_last_rotated)) {

                // Compare the creation date with the last rotated date
                if ((new Date(keysObj.CreateDate)).toISOString() === (new Date(iamObj.access_key_1_last_rotated)).toISOString()) {

                    iamObj.access_key_1 = keysObj.AccessKeyId;
                }
            }

            if (isDate(iamObj.access_key_2_last_rotated)) {

                // Compare the creation date with the last rotated date
                if ((new Date(keysObj.CreateDate)).toISOString() === (new Date(iamObj.access_key_2_last_rotated)).toISOString()) {

                    iamObj.access_key_2 = keysObj.AccessKeyId;
                }
            }

        }
    });

    callback(iamObj);
}
4

1 回答 1

0

更新

解决方案是在创建初始 iamObj 并推送到用户数组时添加带有空值的 iamObj.access_key_1 和 iamObj.access_key_2。然后获取用户的访问密钥并将它们推送到密钥数组。访问密钥请求被封装在一个 Promise 数组中。一旦它在 promise.all 部分返回,用户和键数组都已满,并准备好进行最后一步,即比较用户数组键创建日期和键数组键创建日期。如果存在匹配项,则使用访问密钥值更新 iamObj.access_key_1 或 iamObj.access_key_2 字段。最后将用户数组写入文件。

改进 - for each 循环可以替换为一旦找到匹配就中断的 for 循环,这将节省大量的处理时间。

这是代码 -

// Get each username, is their key active, when was the active key last used
function analyseReport(iam, report, des, ac) {

    // Mark each call out
    callCount--;

    new csv(report, {
        header: true
    }).forEach(function(object) {

        // accumulateSize++
        var iamObj = {};

        iamObj.account = ac;
        iamObj.account_name = des;
        iamObj.user = object.user;

        if (object.access_key_1_active == 'true') {

            iamObj.access_key_1 = 'null';
            iamObj.access_key_1_active = object.access_key_1_active;
            iamObj.access_key_1_last_rotated = object.access_key_1_last_rotated;
            iamObj.access_key_1_last_used_date = object.access_key_1_last_used_date;
            iamObj.access_key_1_last_used_service = object.access_key_1_last_used_service;
        }

        if (object.access_key_2_active == 'true') {

            iamObj.access_key_2 = 'null';
            iamObj.access_key_2_active = object.access_key_2_active;
            iamObj.access_key_2_last_rotated = object.access_key_2_last_rotated;
            iamObj.access_key_2_last_used_date = object.access_key_2_last_used_date;
            iamObj.access_key_2_last_used_service = object.access_key_2_last_used_service;
        }

        if (iamObj.access_key_1_active == 'true' || iamObj.access_key_2_active == 'true') {

            userAry.push(iamObj);

            // Get key data
            var params = {
                UserName: object.user
            };

            promiseAry.push(iam.listAccessKeys(params).promise().then(function(data) {

                data.AccessKeyMetadata.forEach(function(keysObj) {
                    keyAry.push({
                        userName: keysObj.UserName,
                        accessKeyId: keysObj.AccessKeyId,
                        status: keysObj.Status,
                        createDate: keysObj.CreateDate
                    });
                });

            }).catch((err) => {

            }));
        }
    });

    // Wait for all account calls to finish
    if (callCount == 0) {

        // Wait for all keys to return
        Promise.all(promiseAry).then(() => {
            // Logic - itterate user and key arrays
            // Where username maches, and keyAry active, and dates match
            // Save access key to user array

            userAry.forEach(function(userObj, index) {

                keyAry.forEach(keyObj => {

                    if (userObj.user == keyObj.userName &&
                        keyObj.status == 'Active') {

                        if (isDate(userObj.access_key_1_last_rotated)) {

                            if ((new Date(userObj.access_key_1_last_rotated)).toISOString() === (new Date(keyObj.createDate)).toISOString()) {

                                userAry[index].access_key_1 = keyObj.accessKeyId;
                            } // dates match

                        } // is a date

                        if (isDate(userObj.access_key_2_last_rotated)) {

                            if ((new Date(userObj.access_key_2_last_rotated)).toISOString() === (new Date(keyObj.createDate)).toISOString()) {

                                userAry[index].access_key_2 = keyObj.accessKeyId;
                            } // dates match

                        } // is a date

                    } //user and active
                }); //keyAry.forEach

            }); //userAry.forEach
            // userAry.forEach(item => console.log(item));
            writeToFile(userAry);
        }); //Promise.all

    }
于 2017-08-07T14:04:23.233 回答