ステップ1: コンソールでリモートサービスを作成する(Google Cloud Function)

このトピックでは、外部関数のリモートサービスとして使用するGoogle Cloud Functionを作成するための詳細な手順について説明します。

このトピックの内容:

Google Cloud関数を作成する

Googleの Cloud Functionを作成するための手順 に従って、Google Cloud Functionを作成します。

Snowflakeが提供するサンプルのPython言語関数を使用して関数を作成する場合は、 Python Quickstart を選択します。それ以外の場合は、使用している言語に基づいて適切なQuickStartを選択してください。

Googleの手順に従いながら、次を確認します。

  1. 関数のトリガーがHTTPであることを指定します。

  2. トリガー URL を追跡ワークシートの「Cloud Function Trigger URL」フィールドにコピーします。

  3. Authentication セクションで、 Require authentication を選択します。

    GCP の手順では、 Allow unauthenticated invocations を選択するようになっています。これは、Snowflakeが提供するサンプル関数を含むサンプル関数では許容されますが、実稼働システムの大半では認証が必要です。

  4. Require HTTPS がまだ有効になっていない場合は、有効にします。

  5. Save をクリックします。

  6. 適切な Runtime を選択します。Snowflakeが提供するサンプルPython関数を作成する場合は、Python 3.7ランタイムを選択します。

    重要

    コードに貼り付ける 前にRuntime 値を選択します。

  7. デフォルトのコードをSnowflakeサンプルコード、または独自のカスタムコードに置き換えます。Snowflakeサンプルコードは 同期Google Cloud Functionのサンプル (このトピック)で提供されています。

  8. Entry point が関数の名前(この場合は echo)と一致することを確認します。

Google Cloud Functionをテストする

Google Cloud Functionの作成が完了したら、コンソールの Testing タブを使用して関数を呼び出し、期待どおりに機能することを確認します。

Snowflakeが提供するサンプルPython関数の場合、次のテストデータを使用します(Testing タブにあるデフォルトのデータを以下のデータで置換します)。

{ "data":
  [
    [ 0, 43, "page" ],
    [ 1, 42, "life, the universe, and everything" ]
  ]
}

実行結果は次のようになります。

{"data":
  [
    [0, [43, "page"] ],
    [1, [42, "life, the universe, and everything"] ]
  ]
}

結果は、上記の例とは異なる形式で表示される場合があります。

テストが成功すれば、外部関数のリモートサービスとして使用可能なGoogle Cloud Functionができたことになります。

同期Google Cloud Functionのサンプル

このサンプルコードは、入力パラメーター値を単一のリスト(配列)に結合し、そのリストを SQL 型 VARIANT の単一値として返します。コードはPython3.7で書かれています。

この関数は、Snowflakeが送信し、読み取る形式と同じ形式(JSON)でデータを受け入れ、返します。

import json

HTTP_SUCCESS = 200
HTTP_FAILURE = 400

def echo(request):
    try:
        # The list of rows to return.
        return_value = []

        payload = request.get_json()
        rows = payload["data"]

        # For each input row
        for row in rows:
            # Include the row number.
            row_number = row[0]
            # Combine the value(s) in the row into a Python list that will be treated as an SQL VARIANT.
            row_value = row[1:]
            row_to_return = [row_number, row_value]
            return_value.append(row_to_return)

        json_compatible_string_to_return = json.dumps( { "data" : return_value } )
        return (json_compatible_string_to_return, HTTP_SUCCESS)

    except:
        return(request.data, HTTP_FAILURE)

データ形式の詳細については、 リモートサービスの入力および出力データ形式 をご参照ください。