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

如何在Snowflake中直接调用REST API?求无AWS权限替代方案

问题描述

我尝试在Snowflake中直接调用REST API,通过Python存储过程调用requests.get()方法,但Snowflake目前不支持建立HTTP连接。社区建议使用外部函数,但我因多种原因无法获取AWS账号权限,恳请提供替代方案——比如调用公开REST API(https://api.publicapis.org/entries)的方法;若无法直接实现,也推荐无需使用外部函数的近似解决方案。

我的Snowpark代码

import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col, avg, as_integer
import requests
def main(session: snowpark.Session): 
    r = request.get('https://api.publicapis.org/entries')
    return r

Snowpark报错信息

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/7514b8b71a5770c388d7c6f6030134a2a250933021f5c5a0e176ded90a60847a/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 0xffff728c2c10>: 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 486, 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='api.publicapis.org', port=443): Max retries exceeded with url: /entries (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff728c2c10>: 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 5, 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 589, in request
    resp = self.send(prep, **send_kwargs)
  File "requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.publicapis.org', port=443): Max retries exceeded with url: /entries (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff728c2c10>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
可行替代方案

方案1:本地预取数据后导入Snowflake

Snowflake内部沙箱无法发起外部HTTP请求,最直接的解决方式是在本地或你有权限的外部环境中调用API获取数据,再将数据导入Snowflake表中。示例脚本如下:

import requests
import snowflake.connector

# 调用公开API获取数据
response = requests.get("https://api.publicapis.org/entries")
api_entries = response.json()["entries"]

# 连接Snowflake并写入数据
conn = snowflake.connector.connect(
    user="你的Snowflake用户名",
    password="你的Snowflake密码",
    account="你的Snowflake账号标识(如xxx.us-west-2)",
    warehouse="你的仓库名称",
    database="目标数据库",
    schema="目标Schema"
)

# 创建存储API数据的表(如果不存在)
cursor = conn.cursor()
cursor.execute("""
CREATE OR REPLACE TABLE PUBLIC_APIS (
    API_NAME VARCHAR,
    DESCRIPTION VARCHAR,
    AUTH_TYPE VARCHAR,
    IS_HTTPS BOOLEAN,
    CORS_STATUS VARCHAR,
    API_LINK VARCHAR,
    CATEGORY VARCHAR
)
""")

# 批量插入API数据
insert_stmt = """
INSERT INTO PUBLIC_APIS (API_NAME, DESCRIPTION, AUTH_TYPE, IS_HTTPS, CORS_STATUS, API_LINK, CATEGORY)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
data_values = [
    (entry["API"], entry["Description"], entry["Auth"], entry["HTTPS"], entry["Cors"], entry["Link"], entry["Category"])
    for entry in api_entries
]
cursor.executemany(insert_stmt, data_values)

conn.commit()
cursor.close()
conn.close()

完成导入后,你可以直接通过Snowpark查询这个表,实现原本需要调用API后进行的数据分析操作。

方案2:利用Snowflake任务调度外部脚本(无需AWS权限)

如果需要定期同步API数据,可以将上述导入脚本部署到你有权限的服务器(如个人电脑、公司内部服务器),然后通过Snowflake的**任务(Task)配合外部访问集成(External Access Integration)**调度脚本执行。这种方式不需要AWS账号,只要你有可运行脚本的外部环境即可。

方案3:修正代码笔误(非核心问题,但需注意)

你的原代码存在一个小笔误:request.get应该改为requests.get(少了末尾的s),不过这不是导致连接失败的原因,只是需要修正的细节问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:54:51