连接AWS Athena数据库时触发NoRegionError问题求助
问题描述
我尝试连接Athena数据库,代码如下:
def get_records_from_athena(env,region): database = config_params[env]['globeahtenadatabase'] query = queryconfig.athenaqueryglobe['globedataofathena'] df = AthenaBase(region, 'saml', True).get_query_result(database, query) return df class AthenaBase(AwsBase): def __init__(self, region, profile_name, should_create_session) : ''' 创建AthenaBase实例 :param region: AWS区域 :param profile_name 示例: "saml" :param should_create_session 布尔值,指定是否创建会话。本地运行时传True :return:None ''' super().__init__(region, "athena", profile_name, should_create_session) self.s3_obj = S3Base(region, profile_name, should_create_session) def get_query_result(self, database, query_string): ''' 返回Athena查询结果 :param database Athena中的数据库名称 :param query_output_path 存储桶内路径,示例: Athena_Query :return:None ''' query_result_df = wr.athena.read_sql_query( sql=query_string , database=database , boto3_session=self.session , ctas_approach=False , use_threads=True) return query_result_df
我甚至尝试把region硬编码成'us-east-1':
def get_records_from_athena(env,region): database = config_params[env]['globeahtenadatabase'] query = queryconfig.athenaqueryglobe['globedataofathena'] df = AthenaBase('us-east-1', 'saml', True).get_query_result(database, query) return df
但还是出现No region错误。以下是我继承使用的AwsBase类,不确定是不是创建boto3客户端时出了问题:
class AwsBase: def __init__(self, region, resource, profile_name, should_create_session, config=None): """ 本地运行时should_create_session设为True(确保已在终端登录ADFS) """ self.region = region self.resource = resource self.profile_name = profile_name self.should_create_session = should_create_session self.session, self.client = self.getClient(region, resource, profile_name, should_create_session, config) def getClient(self, region, resource, profile_name, should_create_session, config): """ 本地运行时should_create_session设为True(确保已在终端登录ADFS) """ if should_create_session==True: session = boto3.Session(profile_name=profile_name) client = session.client(service_name=resource, region_name=region, config=config) elif should_create_session==False: session = boto3.Session() client = boto3.client(service_name=resource, region_name=region, config=config) else: raise Exception("should_create_session必须是布尔值") return session,client
详细报错信息:
File "C:\Users\ppathar.virtualenvs\market-data-quality-checks-OBE1rMIj\lib\site-packages\botocore\args.py", line 218, in _compute_endpoint_config return self._resolve_endpoint(**resolve_endpoint_kwargs) File "C:\Users\ppathar.virtualenvs\market-data-quality-checks-OBE1rMIj\lib\site-packages\botocore\args.py", line 300, in _resolve_endpoint return endpoint_bridge.resolve( File "C:\Users\ppathar.virtualenvs\market-data-quality-checks-OBE1rMIj\lib\site-packages\botocore\client.py", line 381, in resolve resolved = self.endpoint_resolver.construct_endpoint( File "C:\Users\ppathar.virtualenvs\market-data-quality-checks-OBE1rMIj\lib\site-packages\botocore\regions.py", line 133, in construct_endpoint result = self._endpoint_for_partition( File "C:\Users\ppathar.virtualenvs\market-data-quality-checks-OBE1rMIj\lib\site-packages\botocore\regions.py", line 148, in _endpoint_for_partition raise NoRegionError() botocore.exceptions.NoRegionError: You must specify a region.
问题分析与解决
报错核心原因是wr.athena.read_sql_query依赖的boto3会话未绑定区域信息。当前AwsBase类仅在创建client时指定了region,但session本身未设置region——boto3.Session初始化时若不传region_name,会尝试从环境变量、本地配置文件读取,若这些地方也无配置,就会导致后续依赖session的操作抛出NoRegionError。
修复步骤
- 修改AwsBase的getClient方法,创建Session时显式传入
region_name:
def getClient(self, region, resource, profile_name, should_create_session, config): """ 本地运行时should_create_session设为True(确保已在终端登录ADFS) """ if should_create_session==True: # 创建Session时绑定区域 session = boto3.Session(profile_name=profile_name, region_name=region) client = session.client(service_name=resource, config=config) elif should_create_session==False: # 同样给Session绑定区域 session = boto3.Session(region_name=region) client = session.client(service_name=resource, config=config) else: raise Exception("should_create_session必须是布尔值") return session,client
- 验证其他潜在问题:
- 确保S3Base类也做同样修改,因为Athena查询结果需存储到S3,S3操作同样依赖区域配置
- 检查本地AWS配置文件(
~/.aws/config或C:\Users\<你的用户名>\.aws\config),确认saml profile的默认区域配置与传入的region一致
为什么硬编码region没用?
你仅在创建AthenaBase时传入了region,但session本身未绑定区域,wr.athena.read_sql_query调用时依赖的是session的区域配置,而非client的。因此必须给Session本身指定region_name,才能让所有基于该session的操作正确识别区域。
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

