[我想使用R中的aws.s3
包将文件从一个目录复制到同一S3存储桶中的另一个目录。我尝试了以下代码,但会引发错误。
library(aws.s3)
Sys.setenv(AWS_ACCESS_KEY_ID = Sys.getenv('AWS_KEY'),
AWS_SECRET_ACCESS_KEY = Sys.getenv('AWS_SECRET'),
AWS_DEFAULT_REGION = "us-west-2")
old_path <- 's3://bucket_name/some_folder/filename.avro'
new_path <- paste0(strsplit(old_path, 'bucket_name')[[1]][1],
'bucket_name/old_data',
strsplit(old_path, 'bucket_name')[[1]][2])
copy_object(from_object = old_path,
to_object = new_path,
from_bucket = 'bucket_name',
to_bucket = 'bucket_name')
这里是错误-
- Error in parse_aws_s3_response(r, Sig, verbose = verbose) :
Not Found (HTTP 404)`.
我能够运行bucket_exists
之类的命令,这意味着我能够连接到AWS。
所以copy_object
方法由于某种原因而无法使用,但是我能够获得以下代码来执行相同的操作-
put_object(get_object(old_path, 'bucket_name'), new_path, 'bucket_name')
然后如果要删除旧文件-
delete_object(old_path, 'bucket_name')
S3中的对象键不是以前导/
开头(这是存储桶的根,不是对象键的第一个字符),但是许多库incorrecty允许您以字符开头的对象键/
,并使诸如GetObject之类的调用仍然可以按预期运行。这很不幸,但是到现在为止,它已经在很多地方都根深蒂固(至少包括一些正式的SDK),因此很难在不引起广泛问题的情况下进行修复。
但是...由于S3的PUT + Copy API在网络上工作的方式,在大多数操作(例如GetObject)中通过无声地吞没对象键中不正确的前导/
来“帮助”您的库可能无法正常工作它们对CopyObject操作具有相同的错误作用,并且如果您传递以/
开头的对象密钥,则会失败。发生这种情况时,这是库作者的错,而不是S3服务。
验证您的old_path
是否执行不是以/
开头,并且copy_object()
操作应按预期工作。这样做和执行操作之间存在重要区别-copy_object()
应该使用S3的内部复制操作,这避免了下载和重新上传,而整个操作实际上发生在S3内部。