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

问题描述 投票:1回答:2

[我想使用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。

r amazon-s3
2个回答
0
投票

所以copy_object方法由于某种原因而无法使用,但是我能够获得以下代码来执行相同的操作-

put_object(get_object(old_path, 'bucket_name'), new_path, 'bucket_name')

然后如果要删除旧文件-

delete_object(old_path, 'bucket_name')

0
投票

S3中的对象键不是以前导/开头(这是存储桶的根,不是对象键的第一个字符),但是许多库incorrecty允许您以字符开头的对象键/,并使诸如GetObject之类的调用仍然可以按预期运行。这很不幸,但是到现在为止,它已经在很多地方都根深蒂固(至少包括一些正式的SDK),因此很难在不引起广泛问题的情况下进行修复。

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

验证您的old_path是否执行不是/开头,并且copy_object()操作应按预期工作。这样做和执行操作之间存在重要区别-copy_object()应该使用S3的内部复制操作,这避免了下载和重新上传,而整个操作实际上发生在S3内部。

© www.soinside.com 2019 - 2024. All rights reserved.