aws sdk для nodejs — получение учетных данных из объекта ChainableTemporaryCredentials

avatar
autobot
23 декабря 2020 в 02:22
1148
2
0

Я пытаюсь использовать AWS nodejs sdk ChainableTemporaryCredentials class, чтобы получить временные учетные данные для учетной записи клиента AWS. Вот мой фрагмент кода:

  
const credentials = new ChainableTemporaryCredentials({
  params: {
    RoleArn: "arn:aws:iam::123456789:role/Test-Customer-Role"
  },
  masterCredentials: new ChainableTemporaryCredentials({
    params: {
      RoleArn: "arn:aws:iam::123456789:role/Test-Automation-Role"
    }
  })
});

console.log("Credentials ", credentials.accessKeyId)   //it prints undefined

const client = new S3({ credentials });

s3.listBuckets(function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);           // successful response with s3 buckets list is printed
});

Мое требование состоит в том, чтобы получить временные переменные sts accessKeyId, secretAccessKey и sessionToken из объекта credentials выше и передать их другому модулю nodejs для дальнейших действий AWS. Однако я получаю undefined в качестве значения для всех свойств accessKeyId, secretAccessKey и sessionToken объекта учетных данных.

Я знаю, что объект учетных данных получает правильные значения, так как я могу перечислить сегменты s3, используя эти учетные данные.

Как получить временные учетные данные, сгенерированные классом ChainableTemporaryCredentials?

Спасибо.

Источник

Ответы (2)

avatar
autobot
29 декабря 2020 в 00:25
1

Я заработал, заключив код учетных данных в Promise следующим образом.

let credentials
AWS.config.credentials = new ChainableTemporaryCredentials({
  params: {
    RoleArn: "arn:aws:iam::123456789:role/Test-Customer-Role"
  },
  masterCredentials: new ChainableTemporaryCredentials({
    params: {
      RoleArn: "arn:aws:iam::123456789:role/Test-Automation-Role"
    }
  })
});

        let promise = new Promise((resolve, reject) => {
          config.getCredentials(async (err) => {
            if (err) {
              console.error("Unable to load aws credentials", err.message);
              reject(err);
            } else {
              credentials = {
                accessKeyId: config.credentials.accessKeyId,
                secretAccessKey: config.credentials.secretAccessKey,
                sessionToken: config.credentials.sessionToken,
              };
              resolve(credentials);
            }
          });
        });

        credentials = await promise;
        console.log("Credentials ", credentials);
avatar
dehamzah
10 мая 2021 в 10:09
2

или вы можете сделать это так, не используя Promise вручную.

async function getAWSCredentials() {
  const credentials = new ChainableTemporaryCredentials({
    params: {
      RoleArn: "arn:aws:iam::123456789:role/Test-Customer-Role",
    },
    masterCredentials: new ChainableTemporaryCredentials({
      params: {
        RoleArn: "arn:aws:iam::123456789:role/Test-Automation-Role",
      },
    }),
  });

  return credentials.getPromise();
}