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

将文件从S3桶Test1复制到Test2桶RCA-test1子目录时签名错误排查

解决AWS S3复制文件到指定子目录时的签名错误问题

问题根源

你修改代码时错误地将目标子目录路径拼接到了目标桶名称参数中,而AWS S3的桶名不允许包含斜杠/,这直接导致签名计算不匹配,抛出The request signature we calculated does not match the signature you provided错误。

CopyObjectAsync方法的参数规则是:

  • 第1个参数:源桶名
  • 第2个参数:源对象Key
  • 第3个参数:目标桶名(纯桶名,不能带路径)
  • 第4个参数:目标对象Key(需要包含子目录路径)

修正后的代码

先优化原代码的冗余问题(不要在循环里重复创建S3客户端),再修正目标路径的拼接方式:

// 提前创建一次S3客户端,避免循环内重复初始化
var s3Client = new AmazonS3Client(accessKeyId.ToString(), secretAccessKey, RegionEndpoint.USWest2);

var listObjectsRequest = new Amazon.S3.Model.ListObjectsV2Request
{
    BucketName = sourceBucketName
};

var listObjectsResponse = await sourceS3Client.ListObjectsV2Async(listObjectsRequest);

foreach (var s3Object in listObjectsResponse.S3Objects)
{
    if (!s3Object.Key.Contains("JSON"))
    {
        // 构造目标对象Key:子目录 + 原文件名
        string destObjectKey = $"RCA-test1/{s3Object.Key}";
        // 正确调用CopyObjectAsync,目标桶名保持纯名称
        await s3Client.CopyObjectAsync(sourceBucketName, s3Object.Key, destinationBucketName, destObjectKey);
    }
}

额外注意事项

  • S3中没有真正的“子目录”,只是通过对象Key中的斜杠模拟目录结构,不需要提前创建RCA-test1目录,复制文件时会自动生成对应路径结构。
  • 确保你的IAM权限同时拥有源桶的s3:GetObject权限和目标桶的s3:PutObject权限,权限不足也可能引发类似签名错误的混淆问题。
  • 循环内重复创建S3客户端会消耗额外资源,建议在循环外初始化一次复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:23:36