如何使用Python向AWS S3不同区域的存储桶上传文件
使用Python向AWS S3不同区域存储桶上传文件
嘿,这就给你详细讲清楚怎么用Python(基于boto库)往AWS S3不同区域的存储桶上传文件,结合代码示例一步步来:
1. 前置准备
- 先确保安装了boto库:
pip install boto - 准备好你的AWS访问密钥(
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY),千万不要把密钥硬编码后提交到公共代码仓库,建议用环境变量或AWS凭证文件管理!
2. 完整代码示例及关键说明
下面是可直接复用的完整代码,我会标注跨区域上传的核心要点:
import boto import boto.s3 import sys from boto.s3.key import Key # 替换为你的AWS密钥(推荐用环境变量读取,而非硬编码) AWS_ACCESS_KEY_ID = '你的AWS_ACCESS_KEY_ID' AWS_SECRET_ACCESS_KEY = '你的AWS_SECRET_ACCESS_KEY' # 目标存储桶信息:名称+所在区域(比如us-west-2、ap-southeast-1等) bucket_name = "你的存储桶名称" bucket_region = "存储桶所在的AWS区域标识" # 核心:连接到指定区域的S3服务 # 一定要用connect_to_region指定区域,避免默认区域连接导致跨区域访问报错 conn = boto.s3.connect_to_region( bucket_region, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY ) # 获取目标存储桶(validate=True会验证桶的存在性及你的访问权限) try: bucket = conn.get_bucket(bucket_name, validate=True) except boto.exception.S3ResponseError as e: print(f"获取存储桶失败:{e}") sys.exit(1) # 本地要上传的文件路径 testfile = "本地文件的完整路径" print(f'正在上传 {testfile} 到Amazon S3存储桶 {bucket_name}') # 上传进度回调函数:用点号实时显示进度 def percent_cb(complete, total): sys.stdout.write('.') sys.stdout.flush() # 创建S3 Key对象,指定文件在存储桶中的保存名称(可与本地文件名不同) k = Key(bucket) k.key = "存储桶内的目标文件名" # 若想保持原名,可替换为os.path.basename(testfile) # 执行上传,带上进度回调 try: # num_cb参数控制回调次数,这里设为10即每10%进度触发一次回调 k.set_contents_from_filename(testfile, cb=percent_cb, num_cb=10) print("\n上传完成!") except Exception as e: print(f"\n上传失败:{e}")
3. 跨区域上传的关键注意点
- 指定区域是核心:必须使用
connect_to_region()连接存储桶所在的区域,不能用默认的connect_s3(),否则会出现跨区域访问的权限或连接错误。 - 存储桶验证开关:
get_bucket的validate=True会额外请求验证桶的状态,如果你确认桶存在且自己有权限,可以设为False来提升连接速度。 - 密钥安全最佳实践:永远不要把密钥硬编码在代码里,推荐通过环境变量读取:
import os AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
内容的提问来源于stack exchange,提问作者Marimuthu
相关产品推荐
相关产品推荐

