外部テーブルの紹介

このトピックでは、Snowflakeの外部で開発、保守、保存、実行される、実行可能コードを呼び出す外部関数について説明します。

このトピックの内容:

こちらもご参照ください。

CREATE EXTERNAL FUNCTIONCREATE API INTEGRATION

外部関数とは

外部関数は、Snowflake外で実行されるコードを呼び出します。実行されたコードは リモートサービス と呼ばれます。

ユーザーは自分のリモートサービスを作成して呼び出すか、サードパーティが作成したリモートサービスを呼び出すことができます。これらのリモートサービスは、 AWS Lambdaなどのクラウドサーバーレスコンピューティングサービスを含む、任意の HTTP サーバースタックを使用して記述できます。

SQL ステートメントを実行するユーザーの観点からすると、外部関数は他のスカラー関数と同様に動作します。SQL ステートメントは次のアクションを実行します。

  1. 関数を呼び出し、オプションでパラメーターを渡します。

  2. 関数から値を受け取ります。

SQL ステートメントでは、外部関数は一般に UDFs (ユーザー定義関数)のように動作します。たとえば、外部関数は次の規則に従います。

  • Snowflake内では、外部関数はデータベースオブジェクトとして表されます。そのオブジェクトは特定のデータベースとスキーマで作成され、ドット表記を使用して参照できます(例: MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_FUNCTION())。

  • 外部関数は、他のタイプの関数が使用される可能性がある SQL ステートメントの任意の句で使用できます(例: WHERE 句)。

  • 戻り値は、 JSON を含む VARIANT などの複合値にすることができます。

  • 外部関数はオーバーロードされる可能性があります。2つの異なる関数に同じ名前を付けることができますが、署名が異なる(入力パラメーターの異なる数値またはデータ型)場合があります。

  • 外部関数は、より複雑な式の一部にすることができます。

    select upper(zipcode_to_city_external_function(zipcode))
      from address_table;
    

外部関数でよく使用される用語

以下は、よく使用される用語の定義です。

リモートサービス

リモートサービスは、Snowflakeの外部で保存および実行され、値を返します。たとえば、リモートサービスは次のように実装できます。

  • AWS Lambda関数。

  • EC2 インスタンスで実行されている HTTPS サーバー(例:Node.js)。

Snowflakeの外部関数機能から呼び出されるには、リモートサービスは次の条件を満たしている必要があります。

  • HTTPS エンドポイントを公開する。

  • JSON 入力を受け入れ、 JSON 出力を返す。

    Snowflake互換の HTTP ヘッダーと JSON 形式のデータの詳細については、 データ形式 をご参照ください。

外部関数

外部関数はSnowflake構造であり、 リモートサービス をSnowflake内にあるかのように見せ、リモートサービスを SQL ステートメントで呼び出せるようにします。つまり、外部関数はリモートサービスをローカル関数のように見せます。

外部関数は、Snowflakeがリモートサービスを呼び出すために使用する情報のセットです。この情報には、リモートサービスとの間で情報を中継する プロキシサービス (たとえば、 AWS API Gateway)の URL が含まれます。この情報は「CREATE EXTERNAL FUNCTION」コマンドの一部として指定され、データベースオブジェクト内に保存されます。

ユーザー定義関数

ユーザー定義関数( UDF)は、Snowflakeではなく、ユーザーによって記述された関数です。UDF は次のいずれかです。

  • 内部:実行可能コードはSnowflake内で保存および実行されます。

  • 外部:ここで定義されている 外部関数 (つまり、リモートサービスをローカル関数のように見せかける構造)。

プロキシサービス

Snowflakeが直接 リモートサービス を呼び出すことはありません。代わりに、Snowflakeはプロキシサービスを介してリモートサービスを間接的に呼び出します。プロキシサービスは、1つのソフトウェアから別のソフトウェアに、たとえばSnowflakeからリモートサービスに、リクエストまたは関数呼び出し(データを含む)を中継します。通常は、戻り値を呼び出し元に中継します。プロキシサービスを使用すると、柔軟性とセキュリティが向上します。

AWS API Gatewayはプロキシサービスの例です。

外部関数の利点

外部関数には、他の UDFs (ユーザー定義関数)に比べて次の利点があります。

  • リモートサービスのコードは、他の UDFs を記述できない言語で記述できます。

    • Python

    • Go

    • C#

  • リモートサービスでは、内部 UDFs からアクセスできない関数とライブラリを使用できます。

    • リモートサービスは、機械学習スコアリングライブラリなどの市販のサードパーティライブラリとインターフェイスにより接続できます。

  • 開発者は、Snowflake、および同じインターフェイスを使用するように作成された他のソフトウェアの両方から呼び出すことができるリモートサービスを作成できます。

外部関数の制限

外部関数には次の制限があります。

  • Snowflakeはクラウド HTTP プロキシサービス(Amazon AWS API Gatewayなど)を介して間接的にリモートサービスを呼び出すため、外部関数のリモートサービスはプロキシサービスから呼び出し可能である必要があります。さいわい、 HTTPS エンドポイントとして機能できるほとんどすべての関数は、プロキシサービスを介して外部関数としてアクセスできます。関数の作成者は、リモートサービスを呼び出すようにプロキシサービスをプログラムする必要があります(例: AWS Lambdaで実行される関数)。

  • 現在、外部関数は、 Secure Data Sharing を介してデータコンシューマーと共有することはできません。

  • リモートサービスはSnowflakeに対して不透明であるため、オプティマイザーは、非外部関数に対して実行できるはずのいくつかの最適化を実行できない場合があります。

  • 現在、外部関数はスカラー関数でなければなりません。スカラー外部関数は、各入力「行」に対して単一の値を返します。

  • 以下の状況では、外部関数を使用できません。

    • CREATE TABLE ステートメントの DEFAULT 句。つまり、列のデフォルト値は、外部関数を呼び出す式にすることができません。

    • COPY 変換

  • 外部関数機能は、ストアドプロシージャではなく、関数のみをサポートします。

外部関数の使用に対する請求

外部関数を使用すると、 データ転送ウェアハウスの使用 に関連する通常のコストが発生します。外部関数を使用するための追加料金はありません。

外部関数に関する追加の考慮事項

  • 外部関数を初めて呼び出す前に、管理者は設定作業を行う必要があります。この作業には、クラウドプラットフォーム(例: AWS)、特にセキュリティに関する知識が必要です。

  • カスタムリモートサービスを作成するには、通常、 HTTP や REST APIs などのトピックに関する知識が必要です。

  • 外部関数は、内部関数(組み込み関数と UDFs の両方)よりもオーバーヘッドが大きく、通常は実行速度が遅くなります。

  • 外部関数により、Snowflakeの外部で追加の処理コストが発生する可能性があります。

  • 外部関数は、追加のセキュリティ問題を引き起こす可能性があります。たとえば、サードパーティの関数を呼び出すと、そのパーティは関数に渡されたデータのコピーを保持できます。

  • 一部のクラウドプラットフォームには特定の要件がある場合があります。たとえば、 AWS では、外部関数に地域エンドポイントが必要です。詳細については、 サポートされているプラットフォーム をご参照ください。

外部関数の呼び出し

外部関数の呼び出しは、他のユーザー定義関数の呼び出しと同じです。外部関数は、他の関数が使用される可能性のあるほぼすべての句に使用できます。

以下に、スカラー外部関数を呼び出す例を示します。

select my_external_function_2(column_1, column_2)
    from table_1;

select col1
    from table_1
    where my_external_function_3(col2) < 0
    ;

create view view1 (col1) as
    select my_external_function_5(col1)
        from table9;

サポートされているプラットフォーム

リモートサービスとプロキシサービスには、プラットフォームとそのプラットフォーム上のアカウントが必要です。多くの場合、リモートサービスのプラットフォームおよびアカウントは、プロキシサービスのプラットフォームおよびアカウントと同じです。ただし、必須ではありません。

これらのプラットフォームおよびアカウントは、Snowflakeプラットフォームおよびアカウントとは別です。

リモートサービスのプラットフォーム

リモートサービスをホストするには、 HTTP サーバースタックが必要です。リモートサービスをサポートできるすべての HTTP サーバースタックでは、外部関数との互換性が必要です。

プロキシサービスのプラットフォーム

クラウドプラットフォーム上のネイティブ HTTP プロキシサービスのインスタンスが必要です。

プロキシサービスを構成するには、通常、次が必要です。

  • クラウドプラットフォームのプロバイダー(たとえば、Amazon AWS)のアカウント。このアカウントは、プロキシサービスのストレージサービスとコンピューティングサービスを提供します。このアカウントは、Snowflakeアカウントとは別です。

  • プロキシサービスの構成に必要な権限を持つクラウドプラットフォームのロール。このクラウドプラットフォームのロールは、Snowflakeのロールとは別です。

次の HTTPS プロキシサービスがサポートされています。

  • Amazon AWS API Gateway。

Snowflakeが現在サポートしているプロキシサービスのタイプは AWS API Gatewayのみですが、 AWS でホストされていないSnowflakeのインスタンスで外部関数を作成できます。仮想ウェアハウスがMicrosoft AzureまたはGoogle Cloud Platform(GCP)上にある場合は、AWS API Gatewayを介してリモートサービスにアクセスする外部関数を作成できます。

以下のセクションには、プラットフォームを選択する前にユーザーが知っておくべきプラットフォーム固有の情報が含まれています。

Amazon AWS API Gateway

  • この機能のプレビューは、 AWS API Gatewayの地域エンドポイントのみをサポートしています。(エンドポイントのさまざまなタイプの説明については、https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-basic-concept.htmlを参照)

  • Snowflake外部関数と API 統合は、 AWS カスタムドメイン をサポートしていません。Snowflakeから AWS API Gatewayにアクセスするには、 AWS によって生成されたデフォルトの URL を使用します。これは次のようになります。

    https://api-id.execute-api.region.amazonaws.com/stage