首页 > 解决方案 > R - 如何将文件从一个位置复制并粘贴到 s3 存储桶中的另一个位置(使用 aws.s3)?

问题描述

我想使用 R 中的包将文件从一个目录复制到同一个 S3 存储桶中的另一个目录aws.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。

标签: ramazon-s3

解决方案


S3中的对象键不以前导开头/(这是存储桶的根,而不是对象键的第一个字符),但是许多库错误地允许您使用该字符开始对象键,/并且仍然可以正常工作GetObject 之类的调用。这是不幸的,但到目前为止,它已经在很多地方根深蒂固(至少包括一些官方 SDK),因此很难在不引起广泛问题的情况下进行修复。

但是...由于 S3 的 PUT+Copy API 在网络上的工作方式,通过/在大多数操作(例如 GetObject)中默默吞下对象键的不正确前导来“帮助”您的库可能无法在其上发挥相同的错误魔法CopyObject 操作,如果您传递以 . 开头的对象键,则会失败/。发生这种情况时,是库作者的错,而不是 S3 服务。

验证您的old_path不是以 a 开头,并且操作应该按预期工作这样做和做你正在做的事情之间有一个重要的区别——应该使用 S3 的内部复制操作,避免下载和重新上传,整个操作实际上发生在 S3 内部。/copy_object()copy_object()


推荐阅读