Snow Sight运行Python脚本调用外部API报连接失败错误求助
问题概述
在Snow Sight网页UI中运行连接外部API的Snowpark Python脚本时,出现Failed to establish a new connection错误。本地环境不依赖Snowpark时脚本可正常运行,但在Snowflake环境中无法解析域名,无法建立连接。
示例代码
import snowflake.snowpark as snowpark from snowflake.snowpark.functions import col import requests def main(session: snowpark.Session): url = "https://www.google.com/" res = requests.get(url) print(res) # Print a sample of the dataframe to standard output. # dataframe.show() # Return value will appear in the Results tab. return main
错误日志
Traceback (most recent call last):
File "urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "urllib3/util/connection.py", line 72, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/usr/lib/python_udf/2ea5e02f17b08cc4ded0dc3a5c4124fe51cdcb5d9c141c6fcf0ec8e525830082/lib/python3.8/socket.py", line 918, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "urllib3/connectionpool.py", line 714, in urlopen
httplib_response = self._make_request(
File "urllib3/connectionpool.py", line 403, in _make_request
self._validate_conn(conn)
File "urllib3/connectionpool.py", line 1053, in _validate_conn
conn.connect()
File "urllib3/connection.py", line 363, in connect
self.sock = conn = self._new_conn()
File "urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0xffff4c666580>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "requests/adapters.py", line 487, in send
resp = conn.urlopen(
File "urllib3/connectionpool.py", line 798, in urlopen
retries = retries.increment(
File "urllib3/util/retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff4c666580>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
Worksheet, line 8, in main
File "requests/api.py", line 73, in get
return request("get", url, params=params, **kwargs)
File "requests/api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "requests/adapters.py", line 520, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff4c666580>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
解决方案
1. 配置Snowflake网络访问规则
Snowflake默认限制外部网络访问,需通过以下步骤开启:
- 进入Snowflake控制台,找到Account > Networking > Network Policies
- 创建或修改现有网络策略,添加允许访问的外部域名(如
www.google.com)或IP范围 - 将该网络策略应用到对应的用户、角色或账户
2. 使用Snowflake外部访问集成(官方推荐)
这是Snowflake官方指定的外部API访问方式,步骤如下:
- 创建网络规则,指定允许访问的外部端点:
CREATE OR REPLACE NETWORK RULE my_network_rule MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('www.google.com:443');
- 创建外部访问集成对象:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_external_access_integration ALLOWED_NETWORK_RULES = (my_network_rule) ENABLED = TRUE;
- 绑定到脚本/存储过程:
创建存储过程时指定集成,或在Worksheet中通过会话配置调用。示例存储过程创建语句:
CREATE OR REPLACE PROCEDURE call_external_api() RETURNS VARCHAR LANGUAGE PYTHON RUNTIME_VERSION = 3.8 PACKAGES = ('snowflake-snowpark-python', 'requests') EXTERNAL_ACCESS_INTEGRATIONS = (my_external_access_integration) HANDLER = 'main';
3. 测试DNS解析
如果网络策略已配置仍报错,用Snowflake内置函数测试域名解析:
SELECT SYSTEM$NETWORK_DNS_LOOKUP('www.google.com');
若返回空或错误,联系Snowflake支持调整DNS配置。
4. 配置代理(环境需要时)
如果Snowflake环境需通过代理访问外部网络,在脚本中添加代理配置:
proxies = { 'http': 'http://your-proxy:port', 'https': 'https://your-proxy:port', } res = requests.get(url, proxies=proxies)
同时确保代理地址已被Snowflake网络策略允许。
内容的提问来源于stack exchange,提问作者Rutvij Dave

