【问题标题】:'Credential is missing' Error On Instantiating S3 Class Using AWS-SDK JS V3使用 AWS-SDK JS V3 实例化 S3 类时出现“缺少凭据”错误
【发布时间】:2020-10-18 01:53:46
【问题描述】:

在较新 v3 的 aws-sdk javascript 中从 class S3 创建 S3 客户端时出现错误。

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

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 repo 中的class S3 代码,似乎不需要“凭据”构造函数配置参数。我做错了吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-sdk aws-sdk-js


    【解决方案1】:

    为了澄清 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 文档、类参考或 SDK 版本 3 开发人员指南中找不到此更改。感谢 Chris 和 @Waleed93 解决这个问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 对。但是如何在 v3 sdk 中创建 AWS.Credentials 对象?我看不到它的任何 api
      • 你可以在这里使用构造函数:docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…。你需要,我认为它可以通过require('aws-sdk/global'); 访问,但不是 100% 确定。
      • 我的错,它只是一个对象。我添加了accessKeyIdsecretAccessKeysessionToken 键的值,它可以工作。谢谢!您在上面提出的是 sdk v2,而不是 v3
      【解决方案3】:

      凭证的值应该是一个包含您的凭证的对象,如下所示:

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

      【讨论】:

        【解决方案4】:

        我将根据自己的经验对此进行更多扩展。我正在通过this guide from AWS 处理“从浏览器查看 Amazon S3 存储桶中的照片”(让来宾用户 - 无需登录 - 能够通过 cognito 身份池与 s3 对象进行交互)。 AWS 指南中的资源适用于开发工具包的 V2 版本。所以,我不得不做大量的挖掘工作来为 V3 设置它。

        所以,简而言之,我正在执行以下操作:

        • 使用 V3 SDK for javascript
        • AWS Cognito 身份池获取凭证(参见链接指南)
        • 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,
        });
        
        ...
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-02
          • 2020-05-12
          • 2021-07-04
          • 2019-02-24
          • 1970-01-01
          • 2019-07-08
          • 2020-10-21
          • 2021-08-18
          相关资源
          最近更新 更多