'Credential is missing' Error On Instantiating S3 Class Using AWS-SDK JS V3

Wal*_*d93 6 amazon-s3 amazon-web-services aws-sdk aws-sdk-js

I am getting en error when creating S3 client from class S3 in newer v3 of aws-sdk javascript.

I add aws config parameters including credentials obtained from aws sts when user gets authenticated (assuming a role with permission to call getObject) at service-level (when instantiating S3 class) along with other parameters. See my code below:

const { S3, ... } = require("@aws-sdk/client-s3");

someFunc();
function someFunc(authUserCredentials) {
 ...
 try {

   const { AccessKeyid, SecretKey, SessionToken } = authUserCredentials;
   const s3Client = new S3({
                      signatureVersion: 'v4',
                      accessKeyId: AccessKeyId,
                      secretAccessKey: SecretKey,
                      sessionToken: SessionToken,
                      region: 'us-east-1',
   });

   console.log(s3Client.config);
   ...

 }catch(e) {
     console.error(e);
 }
}
Run Code Online (Sandbox Code Playgroud)

I checked the class S3 code in aws-sdk-js-v3 repo, and there doesn't seem to be no 'Credential' constructor config argument required. Am I doing something wrong?

JJJ*_*idt 9

只是为了澄清 Chris Williams 的回答以及@Waleed93 的第二条评论,过去与 AWS Javascript SDK v2 一起使用的是:

import S3 from 'aws-sdk/clients/s3';

const AccessKeyId = xxxxx,
      SecretKey = yyyyyyyy,
      SessionToken = zzzzzzzzzz;

const s3Client = new S3({
    apiVersion: '2006-03-01',
    region: 'us-east-1',
    accessKeyId: AccessKeyId,
    secretAccessKey: SecretKey,
    sessionToken: SessionToken
});
Run Code Online (Sandbox Code Playgroud)

对于 SDK v3,构造函数不再接受单个凭证参数,而是将“凭证”对象作为参数。有效的是:

const { S3 } = require('@aws-sdk/client-s3');

const AccessKeyId = xxxxx,
      SecretKey = yyyyyyyy,
      SessionToken = zzzzzzzzzz;

const creds = {
    accessKeyId: AccessKeyId,
    secretAccessKey: SecretKey,
    sessionToken: SessionToken
};

const s3Client = new S3({
    apiVersion: '2006-03-01',
    region: 'us-east-1',
    credentials: creds
});
Run Code Online (Sandbox Code Playgroud)

在 AWS 开发工具包文档、类参考或开发工具包版本 3 的开发人员指南中找不到此更改。感谢 Chris 和 @Waleed93 解决这个问题。


Chr*_*ams 6

根据构造函数的文档,这些参数是有效的。

名称为 Credential 的 Credential 对象仍然有一个参数名称credentials。如果您实例化AWS.Credentials对象,则可以将其传递到该参数中。

  • 我的错,它只是一个对象。我添加了 `accessKeyId`、`secretAccessKey` 和 `sessionToken` 键值并且它有效。谢谢!您上面建议的是 sdk v2,而不是 v3 (3认同)

Rex*_*men 6

凭据的值应该是一个包含传递到配置中的凭据的对象,如下所示:

import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'

const CREDENTIAL = {
  accessKeyId: 'accesKeyIdString',
  secretAccessKey: 'secretAccessKeyIdString',
};

const REGION: 'aws region';
const s3Client = new S3Client({region: REGION, credentials: CREDENTIAL});
Run Code Online (Sandbox Code Playgroud)