r - 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。
解决方案
S3中的对象键不以前导开头/
(这是存储桶的根,而不是对象键的第一个字符),但是许多库错误地允许您使用该字符开始对象键,/
并且仍然可以正常工作GetObject 之类的调用。这是不幸的,但到目前为止,它已经在很多地方根深蒂固(至少包括一些官方 SDK),因此很难在不引起广泛问题的情况下进行修复。
但是...由于 S3 的 PUT+Copy API 在网络上的工作方式,通过/
在大多数操作(例如 GetObject)中默默吞下对象键的不正确前导来“帮助”您的库可能无法在其上发挥相同的错误魔法CopyObject 操作,如果您传递以 . 开头的对象键,则会失败/
。发生这种情况时,是库作者的错,而不是 S3 服务。
验证您的old_path
不是以 a 开头,并且操作应该按预期工作。这样做和做你正在做的事情之间有一个重要的区别——应该使用 S3 的内部复制操作,避免下载和重新上传,整个操作实际上发生在 S3 内部。/
copy_object()
copy_object()
推荐阅读
- php - 使用 GitHub 在共享主机上部署 Laravel PHP 站点
- python - 在鼠标悬停的右侧或左侧扬声器上播放声音
- python-3.7 - 如何减去不连续的字符串python
- azure - Azure 消息总线未释放内存
- docker - 无法在 http+docker://localhost 连接到 Docker 守护程序 - 它正在运行吗?(特殊用例)
- java - 确定输入是 Parquet 还是平面文件
- arrays - 无法使用 Flutter 向 Firebase Firestore 中的数组添加或删除对象
- webstorm - 如何在 JetBrains WebStorm 2020.3.2 的单独窗口中显示项目
- angular - 开发和生产的不同浏览器列表?
- java - While循环中的后递减操作