同一AWS账号下Lambda调用S3 PutObject接口出现签名不匹配错误求助
S3 PutObject签名不匹配问题排查点
以下是你可能遗漏的配置和代码问题,按优先级排序:
- 二进制数据编码错误:你当前对FFMPEG输出的二进制MP3数据使用
Encoding.UTF8.GetBytes()做转换,这个方法仅适用于文本内容,会直接破坏非文本的二进制数据,导致服务端计算的Payload哈希和你传输的内容不一致,触发签名错误。修正方案:如果data已经是FFMPEG输出的原始byte数组,直接将InputStream赋值为new MemoryStream(data)即可,不需要额外做编码转换;如果data是字符串类型,说明你在管道接收FFMPEG输出的时候就错误的把二进制转成了字符串,需要修改输出接收逻辑直接存为byte数组。 DisablePayloadSigning与手动设置ContentLength冲突:你同时开启了DisablePayloadSigning = true和手动设置putRequest.Headers.ContentLength,部分区域的S3端点对该组合的签名校验逻辑存在兼容问题。可以二选一测试:要么删除DisablePayloadSigning = true配置让SDK自动计算Payload签名,要么删除手动设置ContentLength的代码让SDK自动从InputStream读取长度。- S3客户端区域与桶区域不匹配:确认你初始化
_s3Client时指定的RegionEndpoint和目标桶的实际所属区域完全一致,区域不匹配时即使凭证正确也会出现签名校验失败的问题。 - Key值特殊字符问题:如果你的Object Key包含空格、中文、
+、/等特殊字符,需要确认SDK是否自动对Key做了URL编码,未正确编码的Key会导致签名计算错误,可手动对Key做URL编码后再传入测试。 - 内存流起始位置问题:在调用
PutObjectAsync前主动重置流的起始位置,避免流指针不在开头导致传输内容不完整:putRequest.InputStream.Position = 0; - 公共ACL冲突测试:你当前配置了
CannedACL = S3CannedACL.PublicRead,如果目标桶开启了「公共访问阻止」配置,上传时携带公共ACL也可能触发异常,可先删除该ACL配置测试是否能上传成功,再单独调试访问权限配置。
内容的提问来源于stack exchange,提问作者PRMan
相关产品推荐
相关产品推荐

