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

これらの手順は、リモートサービスとして使用できるGoogle Cloud Functionを作成する方法を示しています。

このドキュメントでは、 GCP の管理にすでに精通していることを前提としています。これらの手順では、実行する必要のある一般的な手順について説明しますが、詳細は変更される可能性があるため、ユーザーインターフェイスについて詳しくは説明しません。

Googleは、これらのステップの多くに使用できるコマンドラインインターフェイスも提供しています。詳細については、 GCP のドキュメントをご参照ください。

このトピックの内容:

Google Cloud関数を作成する

Google Cloud関数を作成するための手順

  1. Cloud Functionを作成するためのGoogleの手順 に従い、Google Cloud Functionを作成します。Snowflakeが提供するサンプルのPython言語関数を作成する場合は、 Python Quickstart を選択します。それ以外の場合は、必要な言語に基づいて適切な QuickStart を選択してください。Googleの手順に従いながら、次を確認します。

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

    • トリガー URL を上記のワークシートの「Cloud Function Trigger URL」フィールドにコピーします。

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

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

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

    • Save をクリックします。

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

      重要

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

    • デフォルトのコードをSnowflakeサンプルコード、または独自のカスタムコードに置き換えます。Snowflakeのサンプルコードは、 同期Google Cloud関数のサンプル にあります。

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

  2. クラウド関数の作成が完了したら、 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関数のサンプル

このサンプルコードは、入力パラメーター値を単一のリスト(配列)に結合し、そのリストを 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)