'Credential is missing' 实例化 S3 时出错 Class 使用 AWS-SDK JS V3

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

在 aws-sdk javascript.

的较新 v3 中从 class S3 创建 S3 客户端时出现错误

我添加 aws 配置参数,包括当用户在服务级别(实例化 S3 class 时)通过身份验证时从 aws sts 获得的凭据(假设角色有权调用 getObject) ) 以及其他参数。请参阅下面的代码:

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);
 }
}

我检查了 aws-sdk-js-v3 存储库中的 class S3 代码,似乎不需要 'Credential' 构造函数配置参数。我做错了什么吗?

根据 constructor 的文档,这些参数是有效的。

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

为了澄清 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
});

对于 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
});

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

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

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});

我将根据自己的经验对此进行更多扩展。我正在研究 this guide from AWS “从浏览器查看 Amazon S3 存储桶中的照片”(为来宾用户——无需登录——提供与 s3 对象交互的能力通过认知身份池)。 AWS 指南中的资源适用于 SDK 的 V2 版本。因此,我必须进行大量挖掘才能为 V3 进行设置。

所以,简而言之,我正在做以下事情:

  • 为 javascript
  • 使用 V3 SDK
  • AWS Cognito Identity Pool 获取凭据(参见链接指南)
  • new S3({ ... credentials })
  • 中使用这些凭据
import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers";
import { S3, ListObjectsCommand } from "@aws-sdk/client-s3";

// get identity pool creds (in my case)
const credentials = fromCognitoIdentityPool({
  identityPoolId: "your-identity-pool-id",
  clientConfig: { region: "your-region" },
});

// initialize V3 SDK S3 class
const client = new S3({
  apiVersion: "2006-03-01",
  region: "your-region",
  // plug in credentials
  credentials,
});

...

这是我的具体用例。以下是我发现非常有用的资源。