循环调用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
相关产品推荐
相关产品推荐

