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);
}
}
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?
Just to clarify Chris Williams's answer combined with @Waleed93's second comment, what used to work with the AWS Javascript SDK v2 is:
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
});
For SDK v3, the constructor no longer accepts individual credential parameters but does take a "credentials" object as a parameter. What works is:
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
});
This change is nowhere to be found in the AWS SDK documentation, class reference, or Developer Guide for SDK Version 3. Thank you to Chris and @Waleed93 for figuring it out.
According to the documentation for the constructor these arguments are valid.
There is still an argument name for the Credential object with the name credentials. If you instantiate a AWS.Credentials object you can pass this into that argument.
The value of credentials should be an object containing your credentials passed into the config as below:
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});