You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用永久凭证通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:27:19