0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake から外部 API を叩いてみた

Posted at

はじめに

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 を使えるのかを見てみました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?