2017-08-03 25 views
0

を返すサブルーチンを取得するワークフローは、AWS IAMユーザアクセスキーオブジェクトを作成することです。次に、グローバル配列にプッシュします。最後に配列を印刷します。問題は、forEach内でサブルーチンが呼び出され、ユーザーのアクセスキーを取得することです。アクセスキーはコールバックで返された後、グローバル配列にプッシュされますが、グローバル配列を出力するための値は決して最後のステートメントに戻りません。戻り値

ご協力いただければ幸いです。溶液は初期iamObjを作成するとき、ヌル値でiamObj.access_key_1とiamObj.access_key_2を追加して、ユーザアレイにプッシュすることであった

// 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); 
} 

答えて

0

更新

:ここ

は2つの機能です。その後、ユーザーのアクセスキーを取得し、キー配列にプッシュします。アクセスキーリクエストは、プロミスアレイにカプセル化されています。 promise.allセクションに戻ると、ユーザー配列とキー配列の両方がいっぱいになり、ユーザー配列キーの作成日とキー配列キーの作成日を比較する最後のステップが完了します。一致が存在する場合は、iamObj.access_key_1またはiamObj.access_key_2フィールドをアクセスキー値で更新します。最後に、ユーザー配列をfileに書き込みます。

詳細 - 各ループのforループは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 

    }