AWS S3预签名URL添加x-amz-meta元数据上传返回403错误如何解决?
问题诱因
- S3预签名URL生成时,会将所有需要在请求中携带的
x-amz-前缀头(包括x-amz-meta-开头的自定义元数据头)纳入签名计算范围。生成预签名URL时没有提前把对应的x-amz-meta-title头加入签名参数,实际请求时额外携带了该头,会直接导致签名校验不通过,触发403错误。 - 非
x-amz-前缀的自定义头默认不会被纳入S3的签名校验范围,所以添加这类头不会触发签名校验失败。 - 少数场景下也可能是生成预签名URL所用的IAM身份没有携带对应元数据的操作权限,或者中间代理/CDN修改了
x-amz-meta-头的内容、格式,导致校验失败。
解决方法
- 生成预签名URL阶段,就把所有需要携带的
x-amz-meta-头全部添加到签名参数中,头的名称、取值必须和实际上传请求中携带的完全一致。以Java AWS SDK为例,生成PUT预签名URL时调用PutObjectRequest的putCustomRequestHeader方法提前写入x-amz-meta-title和对应值,再生成签名URL即可。 - 检查生成预签名URL所用IAM角色/用户的权限策略,确保
s3:PutObject权限没有设置限制元数据的约束条件。 - 排查上传链路中的反向代理、CDN配置,确认不会过滤、修改
x-amz-前缀的请求头。
内容的提问来源于stack exchange,提问作者enthusiast
相关产品推荐
相关产品推荐

