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});
I'm going to expand on this a bit more with my own experiences. I was working through this guide from AWS for "Viewing Photos in an Amazon S3 Bucket from a Browser" (giving guest users -- no login --, the ability to interact with s3 objects through a cognito identity pool). The resources in the AWS guide are for the V2 version of the SDK. So, I had to do a lot of digging to set it up for V3.
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,
});
...
This was my specific use case. Here are the resources I found really helpful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With