使用AWS Wrangler调用Athena查询时遇BucketExists WaiterError求助
Athena查询报错:WaiterError: Waiter BucketExists failed: Max attempts exceeded
我用以下Python代码通过Athena查询数据:
import boto3 import awswrangler as wr sessAWS_Test = boto3.session.Session( aws_access_key_id = 'id', aws_secret_access_key = 'key', region_name = 'region used' ) strQuery = """select * from raw_data where year like '2023' and month like '03' limit 100 """ wr.athena.read_sql_query(strQuery, database = 'raw_data', boto3_session = sessAWS_Test, ctas_approach=False)
执行最后一行代码时触发错误:
WaiterError: Waiter BucketExists failed: Max attempts exceeded. Previously accepted state: Matched expected HTTP status code: 404
当前使用的IAM用户权限配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject*", "s3:Get*", "athena:StartQueryExecution", "athena:StopQueryExecution", "athena:GetQueryExecution", "athena:GetQueryResults" ], "Resource": [ "arn:aws:s3:::bucket_to_write_results", "arn:aws:s3:::bucket_to_write_results/*", "arn:aws:athena:region:id:workgroup/workgroup_name" ] } ] }
我已经排查过区域指定问题(代码中已带区域Session),其他非S3相关的错误案例也无法解决问题,特此求助。
可能的原因及解决办法
1. 结果存储桶不存在
确认S3控制台中bucket_to_write_results是否存在:
- 若不存在,直接创建该桶,注意桶名全局唯一,且桶的区域要和代码中
region_name指定的区域一致。
2. IAM权限缺少桶列表权限
检查桶是否存在需要s3:ListBucket权限,原权限中的s3:Get*不包含该权限,需更新IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject*", "s3:Get*", "s3:ListBucket", "athena:StartQueryExecution", "athena:StopQueryExecution", "athena:GetQueryExecution", "athena:GetQueryResults" ], "Resource": [ "arn:aws:s3:::bucket_to_write_results", "arn:aws:s3:::bucket_to_write_results/*", "arn:aws:athena:region:id:workgroup/workgroup_name" ] } ] }
3. 显式指定查询结果输出路径
awswrangler可能默认使用Athena工作流配置的结果存储桶,若该桶和权限中指定的桶不一致,需在read_sql_query中显式指定s3_output参数:
wr.athena.read_sql_query( strQuery, database='raw_data', boto3_session=sessAWS_Test, ctas_approach=False, s3_output='s3://bucket_to_write_results/athena-query-results/' )
4. 桶区域与Session区域不匹配
S3桶是区域资源,若创建桶时指定的区域和代码中region_name不一致,会导致无法访问。确认桶的区域和Session区域一致,若不一致,要么修改Session的region_name,要么重新创建对应区域的桶。
内容的提问来源于stack exchange,提问作者ricardov-DB
相关产品推荐
相关产品推荐

