AWS S3 在创建 Bucket 时,可以选择 Bucket 是否启用 ACL(Access Control List)功能,默认情况下 ACL 功能是关闭的。在 ACL 功能关闭的 Bucket 中,只要具有足够的权限,就可以上传和下载对象,但不能通过 s3cmd 等工具给对象指定 ACL。
s3cmd cp 命令上传文件时,默认情况下,s3cmd 会尝试将该文件设置为 Bucket 的所有者(owner),但如果 Bucket 中关闭了 ACL 功能,则无法完成这个操作,并且会返回错误代码 400 (AccessControlListNotSupported)。而使用 s3cmd put 命令上传文件时,默认不会进行 ACL 设置,所以不会出现这个问题。
为了解决 s3cmd cp 命令无法上传文件的问题,最简单的办法是:
s3cmd cp --acl-public s3://your-bucket-a/remote-file s3://your-bucket-b/remote-file
或
s3cmd cp -acl-private s3://your-bucket-a/remote-file s3://your-bucket-b/remote-file
其中,--acl-public 表示上传文件后文件可公开读取,而 --acl-private 表示上传文件后只有 Bucket 所有者可以读取。