'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,
});
...
这是我的具体用例。以下是我发现非常有用的资源。
在 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,
});
...
这是我的具体用例。以下是我发现非常有用的资源。