如何通过AWS CLI直接将Box.com文件传输至AWS S3存储桶?
问题解答
AWS CLI无法直接通过Box的URL将文件复制到S3,你之前执行的命令报错,原因有两点:
aws s3 cp命令仅支持本地文件、S3对象或S3兼容存储之间的复制,不支持从第三方云存储的HTTP链接直接传输;- 你使用的Box共享链接是网页访问链接,并非可直接读取的原始文件流链接,而且这类链接通常需要权限验证,AWS CLI无法处理Box的身份校验逻辑,所以会提示路径不存在。
针对你5万份文件的批量传输需求,推荐以下几种无需本地中转的方案:
方案1:用Box CLI + AWS CLI做流式传输
先安装并认证Box CLI,通过管道将Box文件的输出流直接传给AWS CLI,全程不落地文件:
# 替换<BOX_FILE_ID>为实际的Box文件ID,filename.laz为S3端的文件名 box file download --id <BOX_FILE_ID> --output - | aws s3 cp - s3://kyfromabove/elevation/LAZ/Phase1/filename.laz
如果是批量文件,可以写Shell/Python脚本循环遍历Box文件列表,逐个执行上述命令。
方案2:用AWS DataSync直接同步
AWS DataSync支持Box和S3之间的直接数据同步,是大规模文件迁移的最优选择:
- 在AWS控制台创建DataSync任务,选择Box作为源存储、S3作为目标存储;
- 完成Box的授权配置(需要在Box平台创建应用并生成凭据);
- 设置同步规则(如文件过滤、增量同步策略)后启动任务,DataSync会自动处理传输、重试和进度跟踪。
方案3:编写自定义脚本(用SDK流式处理)
用Box SDK和AWS SDK编写脚本,直接获取Box文件流并上传到S3,适合需要自定义逻辑的场景,比如Python示例:
import boto3 from boxsdk import Client, OAuth2 # 初始化Box客户端(替换为你的Box凭据) oauth = OAuth2( client_id='你的Box客户端ID', client_secret='你的Box客户端密钥', access_token='你的Box访问令牌', ) box_client = Client(oauth) # 初始化S3客户端 s3 = boto3.client('s3') # 替换为实际的Box文件ID和S3目标路径 file_id = 'Box文件ID' s3_key = 'elevation/LAZ/Phase1/filename.laz' # 流式上传:从Box获取文件流,直接传到S3 with box_client.file(file_id).content_stream() as stream: s3.upload_fileobj(stream, 'kyfromabove', s3_key)
内容的提问来源于stack exchange,提问作者Ian Horn
相关产品推荐
相关产品推荐

