はじめに
Snowflake から外部 API を叩くための最もスタンダードな構成は、外部関数(External Function)と AWS Lambda / API Gateway を組み合わせたものかと思います。
最近では、Openflow によって様々なサービスとの連携が可能になっていて、実装方法の幅が広がっているように感じます。
でも、できたら Snowflake 内で全て完結させて、かつ、できるだけ簡単に実装したい、と思いますよね。
ということで、Snowflake のストアドプロシージャから外部 API を利用してみました。
何が必要?
まず、前提として、Snowflake から外部環境へはそのままではアクセスが禁止されてます。
なので、何も設定しないで処理を実装するだけでは、ネットワークアクセスエラーが発生してしまいます。
必要なのは以下の2つです。
- ネットワークルール
- 外部アクセス統合
ネットワークルール
まず、ネットワークルールについてです。
上で述べましたが、Snowflake はデフォルトではインターネットアクセスが遮断されています。
そのため、ネットワークルールを作成して「どこへ通信してよいか」を明示する必要があります。
今回はランダムな犬の画像 URL を返す API を利用してみます。アクセスキーなどは不要な API です。
Dog API
CREATE OR REPLACE NETWORK RULE dog_api_rule
MODE = EGRESS -- Snowflakeから外部への通信
TYPE = HOST_PORT -- ホスト+ポート指定
VALUE_LIST = ('dog.ceo:443');
外部アクセス統合
次に、外部アクセス統合です。
外部アクセス統合は、Snowflake が外部システムに安全に接続するための接続の定義です。
ネットワークルールと紐づけることで、どの宛先へ・どの範囲で・どんな認証方式を使って通信するかを管理します。
ストアドプロシージャや UDF 作成時に紐づけることで、定義内容に沿って外部へアクセスすることが可能になります。
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION dog_api_access_integration
ALLOWED_NETWORK_RULES = (dog_api_rule)
ENABLED = true;
ストアドプロシージャ
ネットワークルールと外部アクセス統合を作成しましたので、インターネットを使って外部 API を利用する準備が整いました。
今回は Python をハンドラーとしたストアドプロシージャを作成しました。
Python のコードの中身はシンプルで、requests ライブラリを使って API へリクエストを投げて、レスポンスを受け取っているだけです。
CREATE OR REPLACE PROCEDURE get_random_dog()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.10'
PACKAGES = ('snowflake-snowpark-python', 'requests')
HANDLER = 'main'
EXTERNAL_ACCESS_INTEGRATIONS = (dog_api_access_integration)
EXECUTE AS OWNER
AS
$$
import requests
def main(session):
url = "https://dog.ceo/api/breeds/image/random"
response = requests.get(url, timeout=10)
if response.status_code != 200:
return f"Error: {response.status_code}"
data = response.json()
return data.get("message", "No image found")
$$;
あとはプロシージャを実行するだけです。
CALL get_random_dog();
これで、犬の画像のURLが取得できます。
おわりに
Snowflake はただデータを蓄積するだけでなく、その利用に向けてのさまざまな機能を有します。
例えば、Streamlit を使ってアプリを作ったり、Snowflake Intelligence で AI エージェントに何かタスクを実行させたりと。
つまり、大規模な利用でない限りは Snowflake だけでシステムを完結させることができるものだと思っています。
そんなときに、これって Snowflake でできるのかなと思うことが多々あります。
ということで、今回は Snowflake だけで外部 API を使えるのかを見てみました。