使用永久凭证通过Node.js的@aws-sdk/client-s3 v3访问AWS S3桶遇问题
解决AWS SDK v3 S3Client强制使用指定IAM用户凭证的问题
问题原因
AWS SDK v3默认会按凭证链优先级加载凭证(环境变量 > 本地.aws/credentials/.aws/config > SSO会话 > IAM角色等),即便你在构造函数中传入了accessKeyId和secretAccessKey,如果本地存在SSO会话令牌这类更高优先级的凭证,SDK仍会优先使用,导致出现会话令牌过期错误。
解决方案
通过StaticCredentialsProvider强制指定使用用户输入的长期IAM凭证,跳过默认凭证链的加载逻辑:
步骤1:安装依赖(如果未安装)
npm install @aws-sdk/client-s3 @aws-sdk/credential-provider-static
步骤2:修改代码,使用StaticCredentialsProvider
const { S3Client, ListBucketsCommand } = require("@aws-sdk/client-s3"); const { StaticCredentialsProvider } = require("@aws-sdk/credential-provider-static"); // 从用户输入获取凭证(可替换为实际的用户输入逻辑) const userProvidedAccessKey = "用户输入的AccessKeyId"; const userProvidedSecretKey = "用户输入的SecretAccessKey"; // 实例化S3Client时强制指定凭证提供者 const s3Client = new S3Client({ region: "ap-south-1", // 强制使用静态凭证,不依赖本地配置或SSO会话 credentials: new StaticCredentialsProvider({ accessKeyId: userProvidedAccessKey, secretAccessKey: userProvidedSecretKey, }), // 可选:彻底禁用默认凭证链,避免意外加载本地凭证 credentialDefaultProvider: () => new StaticCredentialsProvider({ accessKeyId: userProvidedAccessKey, secretAccessKey: userProvidedSecretKey, }), }); // 示例操作:验证凭证是否生效 async function testS3Access() { try { const response = await s3Client.send(new ListBucketsCommand({})); console.log("成功访问S3,桶列表:", response.Buckets); } catch (err) { console.error("访问失败:", err.message); } } testS3Access();
额外注意事项
- 确保使用的是长期IAM用户凭证:临时凭证(如SSO、角色临时凭证)才需要会话令牌,长期IAM用户的凭证仅包含
AccessKeyId和SecretAccessKey,无需令牌。 - 检查环境变量:确保没有设置
AWS_SESSION_TOKEN、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类会覆盖代码中凭证的环境变量。 - 权限验证:确认你的IAM用户已被授予完整的S3权限(通过IAM策略,如
AmazonS3FullAccess),桶策略是附加在桶上的权限控制,不替代用户的IAM权限。
内容的提问来源于stack exchange,提问作者Saksham Gairola
相关产品推荐
相关产品推荐

