Snowflake

Snowflake External Functionsで外部APIを呼び出す仕組みと構築手順

2026-03-26
更新: 2026-03-27
NicheeLab編集部

External Functionは、SnowflakeのSQLクエリから クラウドプロバイダーのAPI Gateway経由で外部のREST APIを呼び出すためのスカラー関数です。 バックエンドにAWS Lambda・Azure Functions・Google Cloud Functionsなどを配置し、 ML推論・データエンリッチメント・外部サービス連携をSQL内で完結させることができます。

External Functionのデータフロー

SELECT external_func(col) FROM table
  │
  ├─ Snowflake Virtual Warehouse
  │    └─ 入力行をバッチ化してJSON形式に変換
  │
  ├─ Cloud Services Layer
  │    └─ API Integrationの認証情報でAPI Gatewayへリクエスト
  │
  ├─ API Gateway (AWS API Gateway / Azure APIM / GCP API Gateway)
  │    └─ 認証・レート制限・ルーティング
  │
  └─ Backend (Lambda / Azure Functions / Cloud Functions)
       └─ ビジネスロジック実行 → JSON形式でレスポンスを返却

リクエスト/レスポンスのJSON形式

-- Snowflakeが送信するリクエスト形式
{
  "data": [
    [0, "Hello world"],
    [1, "Snowflake is great"],
    [2, "External functions rock"]
  ]
}

-- バックエンドが返すレスポンス形式
{
  "data": [
    [0, "positive"],
    [1, "positive"],
    [2, "positive"]
  ]
}

各行は [行番号, 値...] の配列です。行番号はSnowflakeが自動付与し、 レスポンスでも同じ行番号を返す必要があります。 バックエンドのコードではこの形式をパースし、同じ形式で結果を返却します。

AWS Lambdaバックエンドの実装例

# AWS Lambda関数 (Python)
import json

def lambda_handler(event, context):
    body = json.loads(event['body'])
    rows = body['data']

    results = []
    for row in rows:
        row_number = row[0]
        input_text = row[1]
        # ビジネスロジック: テキストの文字数を返す
        char_count = len(input_text) if input_text else 0
        results.append([row_number, char_count])

    return {
        'statusCode': 200,
        'body': json.dumps({'data': results})
    }

AWS: External Functionの作成

-- 前提: API Integrationが作成済み
-- (CREATE API INTEGRATIONの詳細はAPI Integrationsの記事を参照)

CREATE OR REPLACE EXTERNAL FUNCTION char_count(input_text VARCHAR)
  RETURNS INT
  API_INTEGRATION = aws_ml_api
  MAX_BATCH_ROWS = 500
  AS 'https://abc123.execute-api.us-east-1.amazonaws.com/prod/char-count';

Azure: External Functionの作成

CREATE OR REPLACE EXTERNAL FUNCTION translate_text(text VARCHAR, target_lang VARCHAR)
  RETURNS VARCHAR
  API_INTEGRATION = azure_translate_api
  AS 'https://my-apim.azure-api.net/translate/v1';

GCP: External Functionの作成

CREATE OR REPLACE EXTERNAL FUNCTION geocode_address(address VARCHAR)
  RETURNS VARIANT
  API_INTEGRATION = gcp_geocode_api
  AS 'https://my-gateway-abc123.uc.gateway.dev/geocode';

クラウド別の構成要素

構成要素AWSAzureGCP
API GatewayAmazon API GatewayAzure API ManagementGoogle Cloud API Gateway
バックエンドLambdaAzure FunctionsCloud Functions
API_PROVIDERaws_api_gatewayazure_api_managementgoogle_api_gateway
認証IAM Role + STSAzure ADService Account

呼び出しパターン

-- 基本的な呼び出し
SELECT id, text, char_count(text) AS count
FROM documents
LIMIT 1000;

-- CASE式と組み合わせて条件付き呼び出し(コスト最適化)
SELECT
  id,
  text,
  CASE
    WHEN needs_translation = TRUE
    THEN translate_text(text, 'ja')
    ELSE text
  END AS translated_text
FROM documents;

-- 結果を永続化
CREATE TABLE enriched_documents AS
SELECT
  d.*,
  geocode_address(d.address) AS geo_result,
  geo_result:lat::FLOAT AS latitude,
  geo_result:lng::FLOAT AS longitude
FROM documents d
WHERE d.address IS NOT NULL;

パフォーマンスチューニング

パラメータデフォルト説明
MAX_BATCH_ROWS自動1リクエストあたりの最大行数。バックエンドのタイムアウト制約に合わせて調整
COMPRESSIONAUTOリクエスト/レスポンスの圧縮。大量データ送受信時にNONEで無効化も可能
REQUEST_TRANSLATOR / RESPONSE_TRANSLATORなしカスタムのリクエスト/レスポンス変換関数を指定

セキュリティの考慮事項

  • API Integrationで通信先を制限:API_ALLOWED_PREFIXESで許可するURLを最小限にし、API_BLOCKED_PREFIXESで除外パスを追加する
  • USAGE権限でアクセス制御:External FunctionのUSAGE権限を特定ロールにのみGRANTし、不正利用を防止する
  • API Gateway側の認証も設定:Snowflakeからの認証に加えて、API GatewayでAPIキー検証やスロットリングを設定する
  • バックエンドの入力検証:Lambda/Cloud Functions側でも入力値のバリデーションを行い、インジェクション攻撃を防止する

制約事項

  • External Functionはスカラー関数としてのみ作成可能(テーブル関数は不可)
  • HTTPSプロトコルのみ対応(HTTPは不可)
  • 戻り値の型はVARCHAR、INT、FLOAT、BOOLEAN、VARIANTなどのスカラー型に限定
  • External Functionの呼び出しにはVirtual Warehouseが必要(クレジット消費あり)
  • IMMUTABLE / VOLATILE / STABLEのボラティリティ指定が可能だが、キャッシュ動作に影響する

問題で確認

External Functions

問題 1

External Functionのバックエンド(AWS Lambda)が処理するリクエストのJSON形式として正しいものはどれか。

  1. {"rows": [{"id": 0, "value": "hello"}, {"id": 1, "value": "world"}]}
  2. {"data": [[0, "hello"], [1, "world"]]}
  3. [{"row_num": 0, "input": "hello"}, {"row_num": 1, "input": "world"}]
  4. {"batch": [{"index": 0, "args": ["hello"]}, {"index": 1, "args": ["world"]}]}

正解: B

SnowflakeのExternal Functionは{"data": [[行番号, 引数1, 引数2, ...], ...]}の形式でリクエストを送信します。各行は配列で、最初の要素が行番号(0始まり)、続く要素が関数の引数です。レスポンスも同じ形式で返す必要があります。この形式はSnowflake固有のプロトコルであり、バックエンドの実装ではこの形式をパースする処理が必要です。

よくある質問

External Functionの呼び出しでバッチサイズを制御できますか?

MAX_BATCH_ROWSパラメータで1回のHTTPリクエストに含める最大行数を制御できます。デフォルトではSnowflakeが自動的に最適なバッチサイズを決定しますが、バックエンドのLambda/Cloud Functionsにタイムアウトやメモリの制約がある場合は、MAX_BATCH_ROWS = 100のように明示的に小さい値を指定します。バッチサイズを小さくするとHTTPリクエスト数が増えるため、レイテンシとのトレードオフがあります。

External Functionは同期呼び出しですか、非同期呼び出しですか?

デフォルトは同期呼び出しです。Snowflakeがバックエンドにリクエストを送信し、レスポンスを受信するまでクエリの実行がブロックされます。バックエンドの処理が長い場合はAPI Gatewayのタイムアウトに注意が必要です(AWS API Gatewayのデフォルトは29秒)。タイムアウトを超える処理が必要な場合はバックエンド側で非同期パターン(SQS + Lambda等)を実装し、API Gateway側でポーリングを行う設計が必要です。

External FunctionのリクエストとレスポンスのJSON形式はどうなっていますか?

リクエストは{"data": [[0, arg1, arg2], [1, arg3, arg4], ...]}の形式で、各行は[行番号, 引数1, 引数2, ...]の配列です。レスポンスも同じ形式で{"data": [[0, result1], [1, result2], ...]}のように行番号と結果値の配列を返す必要があります。バックエンドのLambda/Cloud Functionsはこの形式に準拠して入出力を処理する必要があります。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.