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

AWS SDK V2升级V3后S3预签名URL访问报AccessDenied异常

AWS SDK V3生成S3 GetObject预签名URL出现AccessDenied问题排查

核心问题

从AWS SDK V2升级到V3后,生成的S3 GetObject预签名URL客户端访问时始终返回AccessDenied,但IAM角色权限(包含s3:Get*、s3:Put*、s3:List*)未变更,且已尝试给存储桶授予全量S3权限,问题仍存在。

排查方向与解决步骤

1. 验证Key参数的正确性

V3代码中通过parsedS3URI.pathname.substr(1)生成Key,需确认该值与V2版本生成的Key完全一致:

  • 打印parsedS3URI.pathname和最终的Key值,检查是否存在路径前缀/后缀错误(比如多了/、少了字符)或特殊字符编码差异。
  • 示例S3路径s3://ring-data-requests-dev/gdpr/exports/user-82032267/10001355/datarequests.zip对应的Key应为gdpr/exports/user-82032267/10001355/datarequests.zip,确认substr(1)是否正确移除了路径开头的/。

2. 处理X-Amz-Content-Sha256: UNSIGNED-PAYLOAD问题

AWS SDK V3默认对GetObject请求使用UNSIGNED-PAYLOAD,若存储桶存在强制要求签名Payload的规则(Bucket Policy或AWS Config),会导致访问被拒。可通过以下方式验证并修复:

  • 检查存储桶的Bucket Policy,确认是否存在带有Condition判断x-amz-content-sha256不等于特定值的拒绝规则。
  • 强制在预签名URL中使用计算后的Payload哈希(GetObject请求无请求体,哈希固定为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855),修改代码如下:
const getObjectParams: GetObjectCommandInput = { 
  Bucket: parsedS3URI.host, 
  Key: parsedS3URI.pathname.substr(1) 
};
const command = new GetObjectCommand(getObjectParams);
// 强制指定Payload哈希
return await getSignedUrl(s3Client, command, {
  expiresIn: config.udms.s3.signedURLTTL,
  payloadHash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
});

3. 确认S3客户端的区域配置

V3 SDK不会自动推断存储桶区域,需确保客户端初始化时显式指定了存储桶所在区域(示例URL中为us-east-1):

import { S3Client } from "@aws-sdk/client-s3";

const s3Client = new S3Client({
  region: "us-east-1",
  // 其他配置(如角色假定)
});

区域不匹配会导致签名错误,进而触发AccessDenied。

4. 验证IAM角色的临时凭证有效性

虽然权限未变更,但需确认生成预签名URL时使用的临时凭证:

  • 检查S3客户端是否正确假定了目标外部账户IAM角色,未误用本地默认凭证。
  • 确认临时凭证的有效期,避免生成URL时凭证已接近过期(即使URL有自己的expiresIn,凭证过期仍会导致访问失败)。

5. 直接测试GetObject API权限

使用相同的IAM角色直接调用S3 GetObject API(不生成预签名URL),验证是否能正常获取对象:

  • 若直接调用也失败,说明问题不在预签名URL生成逻辑,需排查存储桶的其他配置(如对象ACL、服务端加密配置)或IAM角色的信任关系。

内容的提问来源于stack exchange,提问作者coffeeMakerJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:55:54