При попытке получить подписанный URL для getObject
я получаю следующую ошибку из библиотеки aws-sdk
:
<proj-dir>\node_modules\aws-sdk\lib\util.js:983
return str && str.indexOf('arn:') === 0 && str.split(':').length >= 6;
^
TypeError: str.indexOf is not a function
at Object.validateARN [as validate] (<proj-dir>\node_modules\aws-sdk\lib\util.js:983:25)
at features.constructor.hasBucketInParams [as isAccessPointApplicable] (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:180:2
3)
at features.constructor.setupRequestListeners (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:126:14)
at features.constructor.addAllRequestListeners (<proj-dir>\node_modules\aws-sdk\lib\service.js:276:10)
at features.constructor.makeRequest (<proj-dir>\node_modules\aws-sdk\lib\service.js:203:10)
at features.constructor.getSignedUrl (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:1026:24)
at Object.<anonymous> (<proj-dir>\s3-test.js:101:8)
at Module._compile (internal/modules/cjs/loader.js:955:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
at Module.load (internal/modules/cjs/loader.js:811:32)
Другие вызовы S3 (например, listBuckets
) работают нормально. Вот мой тестовый файл:
const S3 = require('./utils/s3Util');
const C = require('./utils/constants');
const _ = require('lodash');
// other code...
S3.svc.getSignedUrl('getObject', { Bucket: C.S3_BUCKET, Key: 'TestFrequencyCount.java', Expires: 60 }).promise()
.then(retVal => {
console.log("Return value:", retVal);
}).catch(err => {
console.log("Error::", err);
});
Файл s3Util.js
:
const C = require('./constants');
const AWS = require('aws-sdk');
const keys = require("../config/aws-config.json");
// AWS.config.update(keys);
const s3 = new AWS.S3({...keys, apiVersion: C.S3_API_VER, signatureVersion: 'v4' });
module.exports = Object.freeze({
svc: s3,
});
Я использовал aws-sdk
версия 2.610.0, затем обновил его до 2.621.0, но проблема остается.
Даже попытался изменить способ загрузки учетных данных учетной записи AWS (я буду использовать пользователя IAM после выяснения обстоятельств) на основе комбинации этой заметки из AWS документации SDK:
Примечание. Необходимо убедиться, что у вас есть stati c или ранее разрешенные учетные данные, если вы вызываете этот метод синхронно (без обратного вызова), иначе он может неправильно подписать запрос. Если вы не можете гарантировать это (вы используете асинхронный поставщик учетных данных, т. Е. Роли IAM в EC2), вы всегда должны вызывать этот метод с асинхронным обратным вызовом.
и решение, указанное в Node.js и aws ошибка учетных данных - json (в которой предлагалось не использовать AWS.config.loadFromPath(path)
, а вместо этого загружать параметры напрямую через AWS.config.update(...)
), но безрезультатно.
В десепарации я пробовал версия обратного вызова также, но, как и ожидалось, она дала тот же результат:
S3.svc.getSignedUrl('getObject', { Bucket: C.S3_BUCKET, Key: 'TestFrequencyCount.java', Expires: 60 }, (err, retVal) => {
if (err) {
console.log("Error::", err);
} else {
console.log("Return value:", retVal);
}
});