如何通过AWS CLI将预签名URL的文件复制到自有S3存储桶?
可行方案:无需本地下载,直接流式复制
不需要先把文件下载到本地,你可以通过AWS SDK流式处理或CLI管道命令实现直接复制,全程不落地文件到本地磁盘。以下是具体实现方式:
方法1:用Python boto3 + requests实现流式复制
这种方式适合需要自动化或处理大文件的场景,通过流传输直接将预签名URL的文件内容传到自己的S3桶:
import boto3 import requests # 替换为实际参数 presigned_url = "供应商提供的预签名HTTPS URL" your_bucket = "你的S3存储桶名称" target_file_key = "要保存的文件路径(如:backup/data.csv)" # 初始化S3客户端 s3_client = boto3.client('s3') # 获取预签名URL的文件流 with requests.get(presigned_url, stream=True) as res: res.raise_for_status() # 确保请求成功 # 直接将流上传到自己的S3桶 s3_client.upload_fileobj(res.raw, your_bucket, target_file_key)
方法2:用CLI管道快速实现(适合小文件)
如果不想写代码,可通过curl获取文件内容,再用管道直接传给AWS CLI的s3 cp命令,全程无本地文件:
curl -L "供应商的预签名URL" | aws s3 cp - s3://你的存储桶名称/目标文件名
为什么之前的尝试会报错?
你把预签名URL改成s3://格式后出现错误,原因在于:
- AWS CLI的
s3 sync/cp命令使用s3://路径时,要求你的AWS账号对供应商的存储桶有直接访问权限(如s3:GetObject权限),但供应商仅提供了预签名URL,并未给你账号授权,所以会触发Access Denied。 - Bad Request错误通常是因为你构造的
s3://路径有误(比如桶名、对象键写错),或者供应商的存储桶不允许直接通过s3://协议访问。
内容的提问来源于stack exchange,提问作者Jim Ancona
相关产品推荐
相关产品推荐

