使用AWS S3 Node.js SDK调用copyObject时出现Access Denied错误
S3同桶复制对象触发Access Denied,配置全权限策略仍未解决
问题详情
在同一S3存储桶内复制已有对象到新路径时出现Access Denied错误,但可正常列出桶内所有对象、创建新对象。
相关代码
//configuring parameters const AWS = require("aws-sdk"); AWS.config.update({ accessKeyId: //iam user's access key, secretAccessKey: //iam user's secret key, }); var s3 = new AWS.S3(); var params = { Bucket: `mybucket`, CopySource: `filepath`, Key: `filenewpath`, }; const result = await s3.copyObject(params).promise();
已尝试操作
开放存储桶全访问权限,配置了以下存储桶策略,但问题未解决:
{ "Version": "2012-10-17", "Id": "Policy1682423703415", "Statement": [ { "Sid": "Stmt1682423694567", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::832462061628:user/developer1" }, "Action": "s3:*", "Resource": "arn:aws:s3:::salesforcecvfiles" } ] }
原因分析与解决方案
1. CopySource参数格式错误
CopySource需要完整的「存储桶名+对象路径」格式,正确写法为mybucket/source-object-key(不要以斜杠开头)。如果你的filepath仅为对象键、未包含桶名,会直接导致权限验证失败。
2. 存储桶策略资源范围不完整
当前策略的Resource仅指定了存储桶本身(arn:aws:s3:::salesforcecvfiles),但S3对象的资源ARN格式是arn:aws:s3:::salesforcecvfiles/*。复制操作需要同时对源对象和目标对象拥有权限,需修改策略的Resource字段:
"Resource": [ "arn:aws:s3:::salesforcecvfiles", "arn:aws:s3:::salesforcecvfiles/*" ]
3. IAM用户权限缺失
除了存储桶策略,需确认IAM用户developer1的权限策略中包含s3:GetObject(读取源对象)和s3:PutObject(写入目标对象)权限,或直接授予s3:*权限覆盖对象层级。
4. 源对象存在额外权限限制
如果源对象设置了对象级ACL,即使桶策略开放权限,也可能导致无法读取源对象。可通过S3控制台查看源对象的权限设置,确保当前IAM用户拥有读取权限。
修正后的代码示例
//configuring parameters const AWS = require("aws-sdk"); AWS.config.update({ accessKeyId: "your-iam-access-key", secretAccessKey: "your-iam-secret-key", }); var s3 = new AWS.S3(); var params = { Bucket: "mybucket", CopySource: "mybucket/source-file-path", // 修正为桶名+源对象完整路径 Key: "new-file-path", }; const result = await s3.copyObject(params).promise();
内容的提问来源于stack exchange,提问作者Mridul Kapil
相关产品推荐
相关产品推荐

