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

循环调用boto3 S3 get_bucket_tagging时遇Access Denied问题求助

问题描述

尝试从不同AWS账户获取指定S3存储桶的标签列表,代码中先通过boto3 Session创建S3资源完成其他任务(运行正常),但获取标签时仅第一个item对应的存储桶能成功,其余均返回AccessDenied错误。

原代码:

for item in items:
    botoSession = boto3.Session(
        aws_access_key_id=item['AccessKeyId'],
        aws_secret_access_key=item['SecretAccessKey'],
        aws_session_token=item['SessionToken'],
        region_name=item['regionParm']
    )

    # 其他任务(运行正常)
    s3 = botoSession.resource('s3')
    bucket = s3.Bucket(f"{item['bucketName']}")

    # 获取标签的任务
    try:
        s3_client = boto3.client('s3')
        tags = s3_client.get_bucket_tagging(Bucket=f"{item['bucketName']}")['TagSet']
        print(tags)
    except Exception as e:
        print(e)

错误信息:

An error occurred (AccessDenied) when calling the GetBucketTagging operation: Access Denied
解决方案

问题出在获取S3客户端的方式上:直接调用boto3.client('s3')时,会使用默认的AWS凭证链(比如环境变量、~/.aws/credentials文件,或是第一个Session初始化后残留的默认配置),而非当前循环中botoSession对应的目标账户凭证。

修正方法是从当前循环创建的botoSession中获取客户端,而非调用全局的boto3.client:

修正后的代码:

for item in items:
    botoSession = boto3.Session(
        aws_access_key_id=item['AccessKeyId'],
        aws_secret_access_key=item['SecretAccessKey'],
        aws_session_token=item['SessionToken'],
        region_name=item['regionParm']
    )

    # 其他任务(运行正常)
    s3 = botoSession.resource('s3')
    bucket = s3.Bucket(f"{item['bucketName']}")

    # 获取标签的任务 - 从当前Session创建client
    try:
        s3_client = botoSession.client('s3')  # 关键修改:使用当前Session的凭证
        tags = s3_client.get_bucket_tagging(Bucket=f"{item['bucketName']}")['TagSet']
        print(tags)
    except Exception as e:
        print(e)

这样每次循环都会使用当前item对应的AWS账户凭证发起请求,不会被之前的Session或默认凭证干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:33:26