【发布时间】:2020-04-07 09:28:22
【问题描述】:
我有一项服务在运行 AWS-S3 的同一实例上运行,在这种情况下,我在将文件推送到 S3 存储桶时无需提供凭据。
这是我的代码,但它显示了这个错误:
message: 'Access Denied',
code: 'AccessDenied',
region: null,
time: 2019-12-13T22:30:56.325Z,
requestId: '3F6AA6FAC6787B36',
extendedRequestId:'yQ4y6uthaTDBr6SuoXbI0g0cLWY40SWleATXrBijKrAbhcmsWTYAL+wCBlZpPM/6ytRc8qbIJP4=',
cfId: undefined,
statusCode: 403,
retryable: false,
retryDelay: 44.582589819600926
代码如下:
public async writeFileToS3(datasetFile: any): Promise<boolean> {
try {
this.s3Bucket = new S3({ region: 'us-east-1' });
const readFile = this.util.promisify(this.fileWriter.readFile);
const unlinkFile = this.util.promisify(this.fileWriter.unlink);
const s3BucketName = this.appConfig.get<string>(
'infra.fileWriter.bucket'
);
const data = await readFile(datasetFile.path);
const params = {
Bucket: s3BucketName,
Key: datasetFile.originalname,
Body: data,
ACL: 'public-read'
};
return await new Promise<boolean>((resolve, reject) => {
this.s3Bucket.upload(params, function(err: any) {
unlinkFile(datasetFile.path);
if (err) {
console.log('await call: ' + err);
reject(err);
} else {
resolve(true);
}
});
});
} catch (err) {
console.log(err);
throw new OperationError('Error writing file to S3');
}
注意:AWS 配置良好,因为我有另一个使用 Python 与 S3 交互的服务,它工作正常,但该服务使用 aws-sdk 进行 Javascript。
【问题讨论】:
-
AWS SDK 函数可以像这样被承诺:
upload(params).promise(). -
@jarmod .. 我想这不是问题,问题是告诉 S3 不要使用凭据。
-
对,这只是一个仅供参考。您只需要深入了解您提供错误凭据的原因,或者 S3 存储桶的策略可能拒绝您访问的原因。顺便说一句,您有一些不理想的奇怪命名约定 - 例如,
this.s3Bucket可能是 SDK 客户端 S3 对象,而不是存储桶。通常,此代码如下所示:const AWS = require('aws-sdk'); const s3 = new AWS.S3(); await s3.upload(params).promise(). -
@basel.ai 是什么让您认为“将文件推送到 S3 存储桶时无需提供凭据”?
-
@JohnRotenstein 因为简单地说,它就是为此而配置的!正如我在问题中提到的那样,我有另一个用 python 编写的服务并且我没有传递任何凭据,但问题在于 nodejs 的 aws-sdk,我需要告诉它不要查找凭据。
标签: node.js typescript amazon-web-services amazon-s3