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

多AWS账号下S3存储桶内容批量列举脚本需求(Boto3/AWS Wrangler)

多AWS账号S3存储桶内容列举脚本方案

前置准备

先确保本地AWS配置文件(~/.aws/credentials 或 ~/.aws/config)已配置好多个账号的profile,格式示例:

# ~/.aws/credentials
[account1]
aws_access_key_id = YOUR_KEY1
aws_secret_access_key = YOUR_SECRET1

[account2]
aws_access_key_id = YOUR_KEY2
aws_secret_access_key = YOUR_SECRET2

方案一:使用Boto3实现

Boto3是AWS官方SDK,适合需要自定义逻辑的场景,以下脚本支持遍历多账号、多桶,自动处理分页获取全量对象:

import boto3
from botocore.exceptions import ClientError

# 定义要操作的AWS账号profile列表和目标S3桶列表
TARGET_PROFILES = ["account1", "account2"]
TARGET_BUCKETS = ["bucket-name-1", "bucket-name-2"]

def list_s3_bucket_objects(profile, bucket_name):
    # 基于指定profile创建会话
    session = boto3.Session(profile_name=profile)
    s3_client = session.client("s3")
    
    try:
        # 分页获取桶内所有对象
        paginator = s3_client.get_paginator("list_objects_v2")
        response_iterator = paginator.paginate(Bucket=bucket_name)
        
        objects = []
        for response in response_iterator:
            if "Contents" in response:
                objects.extend(response["Contents"])
        
        print(f"=== 账号[{profile}] - 桶[{bucket_name}] 内容列表 ===")
        for obj in objects:
            print(f"对象键: {obj['Key']}, 大小: {obj['Size']}字节, 最后修改: {obj['LastModified']}")
        print("\n")
        return objects
    except ClientError as e:
        print(f"账号[{profile}] - 桶[{bucket_name}] 操作失败: {e.response['Error']['Message']}")
        return []

# 遍历所有账号和桶
for profile in TARGET_PROFILES:
    for bucket in TARGET_BUCKETS:
        list_s3_bucket_objects(profile, bucket)

方案二:使用AWS Wrangler实现

AWS Wrangler是基于Boto3的封装库,代码更简洁,适合快速开发:

import awswrangler as wr
import boto3

# 定义要操作的AWS账号profile列表和目标S3桶列表
TARGET_PROFILES = ["account1", "account2"]
TARGET_BUCKETS = ["bucket-name-1", "bucket-name-2"]

def list_s3_bucket_objects_wrangler(profile, bucket_name):
    try:
        # 直接获取桶内所有对象,自动处理分页
        objects = wr.s3.list_objects(f"s3://{bucket_name}/", boto3_session=boto3.Session(profile_name=profile))
        
        print(f"=== 账号[{profile}] - 桶[{bucket_name}] 内容列表 ===")
        for obj in objects:
            print(f"对象路径: {obj}")
        print("\n")
        return objects
    except Exception as e:
        print(f"账号[{profile}] - 桶[{bucket_name}] 操作失败: {str(e)}")
        return []

# 遍历所有账号和桶
for profile in TARGET_PROFILES:
    for bucket in TARGET_BUCKETS:
        list_s3_bucket_objects_wrangler(profile, bucket)

注意事项

  • 权限:确保每个profile对应的IAM用户拥有s3:ListBucket权限,否则会返回权限错误。
  • 结果保存:如果需要将结果持久化,可以把对象列表写入CSV文件,比如用pandas.DataFrame(objects).to_csv(f"{profile}_{bucket}_objects.csv")(需提前安装pandas)。
  • 错误处理:脚本中已加入基础错误捕获,可根据需求扩展(比如跳过不存在的桶、添加重试机制等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:45:34