Как сообщить учетные данные объекту ManagedUpload? - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь использовать ManagedUpload из aws -sdk. Мой код:

var buffer = fs.readFileSync(filePath);

var paramsCreate = {
  Bucket: bucketName,
  Key: 'myfile.ogv',
  Body: buffer
};

let perc = 0;
var upload = new AWS.S3.ManagedUpload({
  partSize: 5 * 1024 * 1024, queueSize: 4,
  params: paramsCreate
}).on('httpUploadProgress',function(progress) {
  let newPerc = Math.round(progress.loaded / progress.total * 100);
  if (newPerc != perc) {
     perc = newPerc;
     console.log(perc + '% sent');
  }
});

let up = upload.promise();

up.then(data=>{
    console.log('Finished');
    console.log(data);
}).catch(err=>console.log('Err: ', err));

с этим кодом я (очевидно) получил следующую ошибку:

Error: connect EHOSTUNREACH 169.254.169.254:80
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
  message: 'Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1',
  errno: -113,
  code: 'CredentialsError',
  syscall: 'connect',
  address: '169.254.169.254',
  port: 80,
  time: 2020-05-08T23:29:33.528Z,
  originalError: {
    message: 'Could not load credentials from any providers',
    errno: -113,
    code: 'CredentialsError',
    syscall: 'connect',
    address: '169.254.169.254',
    port: 80,
    time: 2020-05-08T23:29:33.527Z,
    originalError: {
      message: 'EC2 Metadata roleName request returned error',
      errno: -113,
      code: 'EHOSTUNREACH',
      syscall: 'connect',
      address: '169.254.169.254',
      port: 80,
      time: 2020-05-08T23:29:33.526Z,
      originalError: [Object]
    }
  }
}

Я сказал, очевидно, потому что я нигде не сообщил учетные данные. Но на странице документации ManagedUpload ( здесь ) об этом даже не упоминается.

Как сообщить учетные данные aws lib для использования с ManagedUpload?

Изменить:

Для обычных (не составных) переводов , и общий доступ к S3. Я сообщаю учетные данные следующим образом:

import dotenv from 'dotenv';

import AWS, { AWSError } from 'aws-sdk';
import {
  CreateBucketOutput,
  PutObjectOutput,
  GetBucketCorsOutput,
  GetObjectOutput,
  DeleteObjectOutput
} from 'aws-sdk/clients/s3';


dotenv.config();

let s3Options = {
    accessKeyId: process.env.CEPH_ACCESS_KEY,
    secretAccessKey: process.env.CEPH_SECRET_KEY,
    endpoint: process.env.CEPH_ENDPOINT,
    s3BucketEndpoint: false,
    s3ForcePathStyle: true
};

function s3Instance() {
  return new AWS.S3(s3Options);
}

и вот пример использования этого экземпляра:

export function sendObject(
  nameBucket,
  nameObject,
  data,
  metadata
) {
  metadata = metadata || {};
  const params = {
    Bucket: nameBucket,
    Key: nameObject,
    Body: data,
    Metadata: metadata
  };

  let perc = 0;
  return new Promise((resolve, reject) => {
    s3Instance()
    .putObject(params, (err, res) => {
      if (err) reject(err); else resolve(res);
    }).on('httpUploadProgress',function(progress) {
      let newPerc = Math.round(progress.loaded / progress.total * 100);
      if (newPerc != perc) {
         perc = newPerc;
         console.log(perc + '% sent');
      }
    });
  });
}

1 Ответ

0 голосов
/ 09 мая 2020

Мне действительно чего-то не хватало. ManagedUpload имеет параметр параметра службы. Вы можете передать ему экземпляр S3. Поэтому я просто изменил функцию обновления на:

var upload = new AWS.S3.ManagedUpload({
  partSize: 5 * 1024 * 1024, queueSize: 4,
  service: s3Instance,
  params: paramsCreate
}).on('httpUploadProgress',function(progress) {
  let newPerc = Math.round(progress.loaded / progress.total * 100);
  if (newPerc != perc) {
     perc = newPerc;
     console.log(perc + '% sent');
  }
});

, и она сработала.

...