You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可通过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
)
运行作业的步骤
  1. 登录AWS控制台,进入Glue服务
  2. 点击“Jobs” -> “Add job”
  3. 根据你选的方式,选择“Python shell”或“Spark”作为作业类型
  4. 上传你的Python脚本,选择之前配置好的IAM角色
  5. 配置作业的其他参数(比如Python版本、内存配置),然后保存并运行
一些实用提示
  • 服务端复制(方式一)适合大文件,因为是S3内部直接复制,速度快还省带宽
  • 如果需要增量同步,可以结合S3事件通知(比如当源桶有新文件时触发Glue作业),或者用Glue的调度器定期执行
  • 注意处理重复文件:可以在脚本里添加逻辑,检查目标桶是否已存在同名文件,避免重复复制
  • 如果你要复制大量文件,建议在脚本里添加错误捕获(try-except),避免单个文件复制失败导致整个作业中断

内容的提问来源于stack exchange,提问作者TeeKay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:51