外部関数の紹介¶
このトピックでは、Snowflakeの外部で開発、保守、保存、実行される、実行可能コードを呼び出す外部関数について説明します。
このトピックの内容:
- こちらもご参照ください。
外部関数とは¶
外部関数は、Snowflake外で実行されるコードを呼び出します。実行されたコードは リモートサービス と呼ばれます。
ユーザーは自分のリモートサービスを作成して呼び出すか、サードパーティが作成したリモートサービスを呼び出すことができます。これらのリモートサービスは、 AWS Lambdaなどのクラウドサーバーレスコンピューティングサービスを含む、任意の HTTP サーバースタックを使用して記述できます。
SQL ステートメントを実行するユーザーの観点からすると、外部関数は他のスカラー関数と同様に動作します。SQL ステートメントは次のアクションを実行します。
関数を呼び出し、オプションでパラメーターを渡します。
関数から値を受け取ります。
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がリモートサービスを呼び出すために使用する情報のセットです。この情報には、リモートサービスとの間で情報を中継する プロキシサービス (たとえば、Amazon API Gateway)の URL が含まれます。この情報は「CREATE EXTERNAL FUNCTION」コマンドの一部として指定され、データベースオブジェクト内に保存されます。
プロキシサービス
Snowflakeが直接 リモートサービス を呼び出すことはありません。代わりに、Snowflakeはプロキシサービスを介してリモートサービスを間接的に呼び出します。プロキシサービスは、1つのソフトウェアから別のソフトウェアに、たとえばSnowflakeからリモートサービスに、リクエストまたは関数呼び出し(データを含む)を中継します。通常は、戻り値を呼び出し元に中継します。プロキシサービスを使用すると、柔軟性とセキュリティが向上します。
Amazon API Gatewayはプロキシサービスの例です。
バッチ
バッチは、リモートサービスに送信される1以上の行のグループです。
通常、クエリにリモートサービスに送信する行が多数ある場合、行はバッチに分割されます。バッチは通常、より多くの並列処理とより高速なクエリを可能にします。場合によっては、バッチによりリモートサービスの過負荷が軽減されます。
リモートサービスは、受信したバッチごとに行のバッチを1つを返します。スカラー外部関数の場合、返されるバッチの行数は、受信したバッチの行数と同じです。
各バッチには一意のバッチIDがあり、Snowflakeからリモートサービスに送信される各リクエストに含まれています。
再試行操作(タイムアウトのためなど)は、通常、バッチレベルで実行されます。
非同期
呼び出し元が結果を待つ間、非同期リモートサービスをポーリングできます。 同期 と対比してください。
非同期処理により、タイムアウトに対する感度は低下します。
非同期サービスの詳細については、Microsoftの 非同期要求-応答パターン の説明をご参照ください。(情報はMicrosoft Azureに限定されない。)
ユーザーがSnowflakeを使用して非同期動作を実装する方法の詳細については、以下をご参照ください。
同期
同期リモートサービスは、結果の準備ができるまで応答を送信しません。ポーリングできません。 非同期 と対比してください。
同期コードは、非同期コードよりも実装が簡単です。
外部関数の利点¶
外部関数には、他の UDFs (ユーザー定義関数)に比べて次の利点があります。
リモートサービスのコードは、他の UDFs を記述できない言語で記述できます。
Python
Go
C#
リモートサービスでは、内部 UDFs からアクセスできない関数とライブラリを使用できます。
リモートサービスは、機械学習スコアリングライブラリなどの市販のサードパーティライブラリとインターフェイスにより接続できます。
開発者は、Snowflake、および同じインターフェイスを使用するように作成された他のソフトウェアの両方から呼び出すことができるリモートサービスを作成できます。
外部関数の制限¶
外部関数には次の制限があります。
Snowflakeはクラウド HTTP プロキシサービス(Amazon API Gatewayなど)を介して間接的にリモートサービスを呼び出すため、外部関数のリモートサービスはプロキシサービスから呼び出し可能である必要があります。さいわい、 HTTPS エンドポイントとして機能できるほとんどすべての関数は、プロキシサービスを介して外部関数としてアクセスできます。関数の作成者は、リモートサービスを呼び出すようにプロキシサービスをプログラムする必要があります(例: AWS Lambdaで実行される関数)。
現在、外部関数は、 Secure Data Sharing を介してデータコンシューマーと共有することはできません。
リモートサービスはSnowflakeに対して不透明であるため、オプティマイザーは、非外部関数に対して実行できるはずのいくつかの最適化を実行できない場合があります。
現在、外部関数はスカラー関数でなければなりません。スカラー外部関数は、各入力行に対して単一の値を返します。
以下の状況では、外部関数を使用できません。
CREATE TABLE
ステートメントのDEFAULT
句。つまり、列のデフォルト値は、外部関数を呼び出す式にすることができません。DEFAULT
句に外部関数を含めようとすると、CREATE TABLE
ステートメントは失敗します。Secure Data Sharing を介して共有されるデータベースオブジェクト(テーブル、ビュー、UDF、マスキングポリシーなど)。現在、外部機能は共有と互換性がありません。
外部関数機能を使用して記述できるのは、ストアドプロシージャではなく、関数のみです。
外部関数の使用に対する請求¶
外部関数を使用すると、以下に関連する通常のコストが発生します。
さらに、間接的な使用料またはサードパーティの使用料を支払う必要がある可能性があります。
リモートサービスのプロバイダーからの請求などです。
料金はベンダーによって異なります。
外部関数に関する追加の考慮事項¶
外部関数を初めて呼び出す前に、管理者は設定作業を行う必要があります。この作業には、クラウドプラットフォーム(例: AWS)、特にセキュリティに関する知識が必要です。
カスタムリモートサービスを作成するには、通常、 HTTP や REST APIs などのトピックに関する知識が必要です。
外部関数は、内部関数(組み込み関数と UDFs の両方)よりもオーバーヘッドが大きく、通常は実行速度が遅くなります。
外部関数により、Snowflakeの外部で追加の処理コストが発生する可能性があります。
外部関数は、追加のセキュリティ問題を引き起こす可能性があります。たとえば、サードパーティの関数を呼び出すと、そのパーティは関数に渡されたデータのコピーを保持できます。
一部のクラウドプラットフォームには特定の要件がある場合があります。たとえば、 AWS では、外部関数に地域エンドポイント、またはプライベートエンドポイントが必要です。詳細については、 サポートされているプラットフォーム をご参照ください。Amazon API Gatewayの地域エンドポイントとプライベートエンドポイントの詳細については、 エンドポイントの選択: 地域エンドポイント対プライベートエンドポイント をご参照ください。
外部関数の呼び出し¶
外部関数の呼び出しは、他のユーザー定義関数の呼び出しと同じです。外部関数は、他の関数が使用される可能性のあるほぼすべての句に使用できます。
以下に、スカラー外部関数を呼び出す例を示します。
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サーバースタックでは、外部関数との互換性が必要です。
Snowflakeは、リモートサービスを作成するための手順を次のように提供します。
AWS Lambda関数。
Microsoft Azureの機能。
プロキシサービスのプラットフォーム¶
クラウドプラットフォーム上のネイティブ HTTP プロキシサービスのインスタンスが必要です。
プロキシサービスを構成するには、通常、次が必要です。
クラウドプラットフォームのプロバイダーのアカウント、たとえば、 AWS を使用するためのAmazonアカウント。このアカウントは、プロキシサービスのストレージサービスとコンピューティングサービスを提供します。このアカウントは、Snowflakeアカウントとは別です。
プロキシサービスの構成に必要な権限を持つクラウドプラットフォームのロール。このクラウドプラットフォームのロールは、Snowflakeのロールとは別です。
次の HTTPS プロキシサービスがサポートされています。
Amazon API Gateway。
Microsoft Azure API Managementサービス。
SQLからの外部関数の呼び出しは、すべてのプラットフォームで同じです。これらのサービスへのアクセスを構成するために必要なSQLステートメントは、すべてのプラットフォームで同じです。ただし、外部機能コードをサービスにコピーするなどの管理上の詳細は、プラットフォームによって異なります。
仮想ウェアハウスがGoogle Cloud Platform(GCP)上にある場合は、Amazon API GatewayまたはAzure API Managementサービスを介して、リモートサービスにアクセスする外部関数を作成できます。
以下のセクションには、プラットフォームを選択する前にユーザーが知っておくべきプラットフォーム固有の情報が含まれています。
プラットフォーム固有の制限¶
- AWS
Amazon API Gatewayの地域およびプライベートエンドポイントのみをサポートしています。(エンドポイントのさまざまなタイプの説明については、https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-basic-concept.htmlを参照)
Snowflake外部関数と API 統合は、 AWS カスタムドメイン をサポートしていません。SnowflakeからAmazon API Gatewayにアクセスするには、 AWS によって生成されたデフォルトの URL を使用します。これは次のようになります。
https://api-id.execute-api.region.amazonaws.com/stage