アプリ内で長期間実行されるサービスの作成と管理

このトピックでは、 Snowflake Native App with Snowpark Container Services で長時間実行されるサービスを構成して使用する方法について説明します。アプリでジョブサービスを使用する方法については、 アプリでジョブサービスを作成および管理する をご参照ください。

コンシューマーアカウントでサービスを作成するために必要な権限

アプリがコンシューマーアカウントでサービスを作成するには、最初にコンシューマーが次の権限を付与する必要があります。

  • CREATE COMPUTE POOL

    この権限はすべてのサービスに必要です。コンシューマーアカウントでサービスを作成するには、1つ以上のコンピューティングプールが必要です。

  • BIND SERVICE ENDPOINT

    この権限は、エンドポイントを公開するすべてのサービスに必要です。サービスがSnowflake外部の URLs に接続する必要がある場合、アプリが必要な外部アクセス統合を作成するためにこの権限が必要です。

アプリ内にサービスを作成する際の考慮事項

Snowflake Native App with Snowpark Container Services 内にサービスを作成する場合は、次の点を考慮する必要があります。

  • ウェアハウスへの参照。 Snowflake Native App with Snowpark Container Services での使用については アプリ内でサービスを使用する際のベストプラクティス をご参照ください。

  • アプリ内のサービスでは、引用符付きの名前はサポートされていません。

  • バージョン管理されたスキーマでサービスを作成することはできません。

  • アプリ内で作成されたコンテナイメージを使用して、アプリケーションの外部でサービスを作成することはできません。

アプリで CREATE SERVICE コマンドを使用する

CREATE SERVICE を使用して長時間実行サービスを作成します。アプリのコンテキスト内では、プロバイダーはこのコマンドをセットアップスクリプト内で直接呼び出すのではなく、常にストアドプロシージャ内から呼び出すことを検討する必要があります。

サービスを作成するには、ストアドプロシージャ内で CREATE SERVICE コマンドを使用します。次の例は、アプリでこのコマンドを使用するための構文を示しています。

CREATE SERVICE [ IF NOT EXISTS ] <name>
  IN COMPUTE POOL <compute_pool_name>
  {
    fromSpecification
    | fromSpecificationTemplate
  }

fromSpecification ::=
  SPECIFICATION_FILE = '/containers/service1_spec.yaml'

fromSpecificationTemplate ::=
  FROM SPECIFICATION_TEMPLATE_FILE = '/containers/service1_spec.yaml'
  USING ( <key> => <value> [ , <key> => <value> [ , ... ] ]  )
Copy

FROM SPECIFICATION_FILE 句は、アプリのバージョンに固有のサービス仕様ファイルを指します。このパスは、アプリのルートディレクトリからの相対パスです。

ストアドプロシージャに CREATE SERVICE コマンドを追加する

Snowflake Native Apps with Snowpark Container Services は、ストアドプロシージャ内でサービスを作成する複数の方法をサポートしています。

プロバイダーは、これらの方法を任意に組み合わせて、コンシューマーアカウントにサービスを作成できます。

grant_callback プロパティを使用してサービスを作成する

grant_callback は、プロバイダーがコールバック関数を指定できるようにする、マニフェストファイルのプロパティです。コールバック関数は、コンピューティングプールやサービスを作成し、アプリケーションに必要なその他のセットアップタスクを実行できるストアドプロシージャです。

注釈

grant_callback プロパティを使用してコールバック関数を指定することは、 Snowflake Native Apps with Snowpark Container Services でのみサポートされています。

grant_callback を使用してコールバック関数を指定する利点は、コンシューマーがアプリに必要な権限を付与するまでストアドプロシージャが呼び出されないことです。これにより、アプリがコンシューマーアカウントでサービスやその他のオブジェクトを作成するために必要な権限を持つことが保証されます。

grant_callback を使用するには、 manifest.yml ファイルの configuration セクションに追加します。

configuration:
  log_level: INFO
  trace_level: ALWAYS
  grant_callback: core.grant_callback
Copy

次に、セットアップスクリプトで、次の例に示すようにコールバック関数を定義します。

 CREATE SCHEMA core;
 CREATE APPLICATION ROLE app_public;

 CREATE OR REPLACE PROCEDURE core.grant_callback(privileges array)
 RETURNS STRING
 AS $$
 BEGIN
   IF (ARRAY_CONTAINS('CREATE COMPUTE POOL'::VARIANT, privileges)) THEN
      CREATE COMPUTE POOL IF NOT EXISTS app_compute_pool
          MIN_NODES = 1
          MAX_NODES = 3
          INSTANCE_FAMILY = GPU_NV_M;
   END IF;
   IF (ARRAY_CONTAINS('BIND SERVICE ENDPOINT'::VARIANT, privileges)) THEN
      CREATE SERVICE IF NOT EXISTS core.app_service
       IN COMPUTE POOL my_compute_pool
       FROM SPECIFICATION_FILE = '/containers/service1_spec.yaml';
   END IF;
   RETURN 'DONE';
 END;
 $$;

GRANT USAGE ON PROCEDURE core.grant_callback(array) TO APPLICATION ROLE app_public;
Copy

この例では、 grant_callback プロシージャが以下を作成します。

  • 消費者がアプリに CREATE COMPUTE POOL 権限を付与しているかどうかをテストします。コンシューマーがこの権限を与えた場合、 grant_callback プロシージャがコンピューティングプールを作成します。

  • 消費者がアプリに BIND SERVICE ENDPOINT 権限を付与しているかどうかをテストします。消費者がこの権限を許可した場合、 grant_callback プロシージャがサービスを作成します。

この例では、コンテナーを使ったアプリでサービスとコンピューティングプールを作成するパターンを示しています。この例では、アプリはまずコンシューマーが必要な権限を付与しているかどうかをテストし、それからサービスまたはコンピューティングプールを作成します。

参照定義に基づいてサービスを作成する

アプリは、 manifest.yml ファイルの register_callback プロパティを使用することで、参照定義を使用してサービスを作成できます。このプロパティは、コンシューマーアカウント内のオブジェクトを参照定義にバインドするために使用されるストアドプロシージャを指定します。

アプリ内で参照を使用する方法の詳細については、 コンシューマーから参照およびオブジェクトレベル権限をリクエストする をご参照ください

アプリは、必要な参照をすべてバインドされた後、参照の register_callback を使用してサービスを作成できます。外部アクセス統合またはシークレットへのすべての参照が許可される前にサービスが作成されると、サービスの作成は失敗します。

ストアドプロシージャを使用してサービスを作成する

アプリはストアドプロシージャ内で直接サービスを作成できます。他のストアドプロシージャと同様に、プロバイダーはアプリケーションセットアップスクリプトでそれらを定義できます。このストアドプロシージャは、 CREATE SERVICE コマンドを使用してサービスを作成し、ストアドプロシージャに必要な権限をアプリケーションロールに付与します。

コンシューマーは、アプリに必要な権限と参照を付与した後、このストアドプロシージャを呼び出して自分のアカウントにサービスを作成します。

サービスのステータスを確認する

サービスのステータスを確認するために、アプリはセットアップスクリプトから SYSTEM$GET_SERVICE_STATUS --- 非推奨 システム関数を呼び出すことができます。

このシステム関数は、各サービスインスタンス内の各コンテナの JSON オブジェクトを返します。

アプリ内でサービスを使用する際のベストプラクティス

以下は、 Snowflake Native App with Snowpark Container Services 内でサービスを使用する場合のベストプラクティスと考慮事項です。

  • コンシューマーがサービスとやり取りできるようにするStreamlitアプリまたはストアドプロシージャを作成します。

    状況によっては、コンシューマーがアプリによって提供されるサービスを作成、開始、停止、再起動、管理する必要がある場合があります。

  • 単一のストアドプロシージャを使用して、コンシューマーが必要なすべての権限を付与したことを確認します。

    サービスでは、コンシューマーがアプリに複数の権限を付与する必要がある場合があります。たとえば、サービスには CREATE COMPUTE POOL、 CREATE WAREHOUSE、 BIND SERVICE ENDPOINT などの権限が必要です。アプリでは、コンシューマーアカウン内の既存のオブジェクトへの参照が必要になる場合もあります。

    このような状況において、Snowflakeでは、すべての前提条件が満たされていることを確認するために単一のストアドプロシージャを使用することを推奨しています。前提条件が満たされると、このストアドプロシージャによってサービスが作成されます。

  • サービスがクエリを実行するためにウェアハウスを必要とする場合、アプリはコンシューマーアカウントに直接ウェアハウスを作成する必要があります。これには、コンシューマーがアプリに CREATE WAREHOUSE グローバル権限を付与する必要があります。詳細については、 コンシューマーからグローバル権限をリクエストする をご参照ください。

  • 仕様テンプレートを使用してサービスを作成する場合、コンシューマーが提供する引数をアプリケーション・インスタンス内に格納します。これにより、サービスをアップグレードする際の引数として渡すことができます。