是否可通过Python脚本借助AWS Glue实现S3存储桶间文件传输?
当然可以!用AWS Glue配合Python脚本实现S3存储桶之间的文件传输完全可行,我平时处理这类跨桶数据迁移/同步需求时,常用两种思路,下面给你详细拆解:
核心前提:配置正确的IAM权限
不管用哪种方式,Glue作业执行的IAM角色必须拥有足够的S3权限,至少需要:
s3:GetObject(读取源桶文件)s3:PutObject(写入目标桶)s3:ListBucket(列出源桶的文件列表)
另外还要给角色添加Glue相关的权限(比如glue:StartJobRun),确保作业能正常执行。
方式一:Glue Python Shell作业(直接文件复制)
如果只是单纯的文件传输,不需要数据处理,用Glue的Python Shell作业最直接——它支持直接调用boto3,利用S3的服务端复制功能(不用把文件下载到本地,效率极高)。
下面是示例脚本:
import boto3 def copy_s3_files(source_bucket, target_bucket, prefix=""): s3_client = boto3.client('s3') # 分页列出源桶中指定前缀的所有对象 paginator = s3_client.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=source_bucket, Prefix=prefix) for page in page_iterator: if 'Contents' not in page: continue for obj in page['Contents']: source_key = obj['Key'] # 跳过文件夹(如果有的话) if source_key.endswith('/'): continue # 构建目标键(这里直接沿用源键,你可以根据需求修改) target_key = source_key # 执行服务端复制 s3_client.copy_object( Bucket=target_bucket, Key=target_key, CopySource={'Bucket': source_bucket, 'Key': source_key} ) print(f"已复制: s3://{source_bucket}/{source_key} -> s3://{target_bucket}/{target_key}") if __name__ == '__main__': # 替换成你的源桶、目标桶和前缀(可选) SOURCE_BUCKET = "your-source-bucket" TARGET_BUCKET = "your-target-bucket" FILE_PREFIX = "data/2024/" # 如果你只想复制特定前缀下的文件,留空则复制整个桶 copy_s3_files(SOURCE_BUCKET, TARGET_BUCKET, FILE_PREFIX)
方式二:Glue ETL作业(适合需同时处理数据的场景)
如果你的需求是传输+数据转换(比如格式转换、字段清洗),那用Glue ETL作业(基于PySpark)更合适。比如读取源桶的CSV文件,直接写入目标桶的Parquet格式:
import sys from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # 读取源S3桶的文件(支持CSV、Parquet、JSON等多种格式) source_data = spark.read.csv( "s3://your-source-bucket/data/", header=True, inferSchema=True ) # 这里可以添加数据处理逻辑(比如过滤、字段修改) # processed_data = source_data.filter(source_data["status"] == "active") # 写入目标S3桶 source_data.write.parquet( "s3://your-target-bucket/processed-data/", mode="overwrite" # 可选:append/overwrite/ignore )
运行作业的步骤
- 登录AWS控制台,进入Glue服务
- 点击“Jobs” -> “Add job”
- 根据你选的方式,选择“Python shell”或“Spark”作为作业类型
- 上传你的Python脚本,选择之前配置好的IAM角色
- 配置作业的其他参数(比如Python版本、内存配置),然后保存并运行
一些实用提示
- 服务端复制(方式一)适合大文件,因为是S3内部直接复制,速度快还省带宽
- 如果需要增量同步,可以结合S3事件通知(比如当源桶有新文件时触发Glue作业),或者用Glue的调度器定期执行
- 注意处理重复文件:可以在脚本里添加逻辑,检查目标桶是否已存在同名文件,避免重复复制
- 如果你要复制大量文件,建议在脚本里添加错误捕获(try-except),避免单个文件复制失败导致整个作业中断
内容的提问来源于stack exchange,提问作者TeeKay
相关产品推荐
相关产品推荐

