コンシューマーから参照およびオブジェクトレベル権限をリクエストする¶
このトピックでは、プロバイダーが、 APPLICATION オブジェクトの外部に存在するコンシューマーアカウントのオブジェクトへのアクセスをリクエストするために、 Snowflake Native App を構成する方法について説明します。
参照について¶
場合によっては、インストールされた Snowflake Native App は、 APPLICATION オブジェクトの外部に存在するコンシューマーカウントの既存のオブジェクトにアクセスする必要があります。たとえば、アプリがコンシューマーデータベースの既存のテーブルにアクセスする必要が生じる場合があります。
この場合、アプリがコンシューマーアカウントのスキーマ名とオブジェクト名を判断できないため、コンシューマーがオブジェクトに APPLICATION オブジェクトへのアクセス権を付与するだけでは不十分です。
Snowflake Native App が APPLICATION オブジェクトの外部にある既存のオブジェクトにアクセスできるようにするために、 Snowflake Native App Framework は、顧客がオブジェクトの名前とスキーマを指定し、オブジェクトへのアクセスを可能にする参照を提供します。
コンシューマーアカウント内の参照を定義するワークフロー¶
参照およびオブジェクトレベルの権限をリクエストするために、プロバイダーは Snowflake Native App の開発および公開時に以下を実行します。
マニフェストファイルで参照を定義 します。
マニフェストファイルで定義された各参照のコールバックを処理するために、セットアップスクリプトにストアドプロシージャを追加します。
Snowflake Native App のインストール後、コンシューマーは以下の操作を実行します。
Snowflake Native App で必要な参照を表示します。
SYSTEM$REFERENCE システム関数を呼び出して参照を作成します。
参照のIDを渡してコールバックのストアドプロシージャを実行します。
コンシューマーがコールバックストアドプロシージャを実行すると、 Snowflake Native App はリクエストされたオブジェクトにアクセスできるようになります。
このワークフローは、コンシューマーが手動で参照を作成するプロセスの概要を示しています。 Snowsight を使用してインターフェイスを作成し、コンシューマーが参照を作成して権限を付与する方法については、 権限および参照をリクエストするユーザーインターフェイスを作成する をご参照ください。
参照に含めることのできるオブジェクトの型および権限¶
以下のテーブルに、参照に含めることのできるオブジェクトの型と、各オブジェクトに許可される権限を示します。
オブジェクト型 |
許可される権限 |
---|---|
TABLE |
SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES |
VIEW |
SELECT, REFERENCES |
EXTERNAL TABLE |
SELECT, REFERENCES |
FUNCTION |
USAGE |
PROCEDURE |
USAGE |
WAREHOUSE |
MODIFY, MONITOR, USAGE, OPERATE |
API INTEGRATION |
USAGE |
EXTERNAL ACCESS INTEGRATION |
USAGE |
SECRET |
USAGE, READ |
マニフェストファイルで参照を定義する¶
次の例は、 APPLICATION オブジェクトの外部に存在するコンシューマーアカウントのテーブル用に manifest.yml
ファイルで参照を定義する方法を示しています。
references:
- consumer_table:
label: "Consumer table"
description: "A table in the consumer account that exists outside the APPLICATION object."
privileges:
- INSERT
- SELECT
object_type: TABLE
multi_valued: false
register_callback: config.register_single_reference
この例では、コンシューマーアカウントのテーブルで INSERT および SELECT 権限を必要とする consumer_table
という名前の参照を定義しています。 register_callback
プロパティは、コンシューマーテーブルをこの参照定義にバインドするために使用されるストアドプロシージャを指定します。
複数のコンシューマー・オブジェクトを同じ参照にバインドするには、 multi_valued
を使用します。このプロパティが指定されている場合、1つの値参照を持つオブジェクトに対して同じ操作が実行されます。このプロパティは、多値参照を持つオブジェクトにも使用できます。 Snowflake Native App Framework 参照操作の詳細については、 対応する参照関数 をご参照ください。
参照定義を削除する¶
注釈
Snowflakeは、アプリの新バージョンでマニフェストファイルから参照定義を削除しないことを推奨しています。定義された参照を削除する必要がある場合は、削除された参照を使用するコードを同じバージョンリリースで更新し、 README ファイルでコンシューマーに通知します。
アプリが参照を定義した後に、それ以降のバージョンのアプリから参照定義が削除された場合は、削除された参照をまだ使用している関数やプロシージャを呼び出すと、コンシューマーにはエラーが発生します。たとえば、アプリ my_app
のバージョンV1のマニフェストファイルには、 REF_TO_TABLE の参照定義と、テーブル参照 REF_TO_TABLE を使用してビュー VIEW_SELECT_FROM_DEFINED_REF を作成するストアドプロシージャ CREATE_VIEW_FROM_TABLE が含まれます。
my_app
のバージョンV2では、 REF_TO_TABLE の参照定義がマニフェストファイルから削除されています。コンシューマーが、インストールされているアプリ my_app
をバージョンV2にアップグレードした場合、 CREATE_VIEW_FROM_TABLE プロシージャを呼び出すと以下のエラーが発生します。
Reference definition '<REF_DEF_NAME>' cannot be found in the current version of the application '<APP_NAME>'
参照のコールバックストアドプロシージャを作成する¶
manifest.yml
ファイルで参照を定義した後、プロバイダーはセットアップスクリプトにストアドプロシージャを追加して、参照のコールバックを登録する必要があります。
次の例は、 マニフェストファイルで参照を定義する に表示される参照のコールバックを処理するために使用されるストアドプロシージャを示しています。
CREATE APPLICATION ROLE app_admin;
CREATE OR ALTER VERSIONED SCHEMA config;
GRANT USAGE ON SCHEMA config TO APPLICATION ROLE app_admin;
CREATE PROCEDURE CONFIG.REGISTER_SINGLE_REFERENCE(ref_name STRING, operation STRING, ref_or_alias STRING)
RETURNS STRING
LANGUAGE SQL
AS $$
BEGIN
CASE (operation)
WHEN 'ADD' THEN
SELECT SYSTEM$SET_REFERENCE(:ref_name, :ref_or_alias);
WHEN 'REMOVE' THEN
SELECT SYSTEM$REMOVE_REFERENCE(:ref_name, :ref_or_alias);
WHEN 'CLEAR' THEN
SELECT SYSTEM$REMOVE_ALL_REFERENCES(:ref_name);
ELSE
RETURN 'unknown operation: ' || operation;
END CASE;
RETURN NULL;
END;
$$;
GRANT USAGE ON PROCEDURE CONFIG.REGISTER_SINGLE_REFERENCE(STRING, STRING, STRING)
TO APPLICATION ROLE app_admin;
この例では、ストアドプロシージャの引数として渡された参照に対して特定の操作を実行するシステム関数を呼び出す、 REGISTER_SINGLE_REFERENCE
という名前のストアドプロシージャを作成します。
注釈
ストアドプロシージャは SYSTEM$SET_REFERENCE システム関数を使用するため、ストアドプロシージャは記述に単一の値を持つ参照に対してのみ機能します。参照を複数の値に関連付けるには、 SYSTEM$ADD_REFERENCE システム関数を使用します。
オブジェクト構成を要求するためのコールバックストアドプロシージャを作成する¶
一部のオブジェクトタイプでは、プロバイダーは追加の構成を提供するために、セットアップスクリプトにストアドプロシージャを追加する必要があります。このコールバックは、コンシューマーが Snowsight を使用して参照を許可する場合に使用されます。
次の例は、 マニフェストファイルで参照を定義する に示されている参照に対して構成コールバックストアドプロシージャを定義する方法を示しています。
CREATE OR REPLACE CONFIG.GET_CONFIGURATION_FOR_REFERENCE(ref_name STRING)
RETURNS STRING
LANGUAGE SQL
AS
$$
BEGIN
CASE (ref_name)
WHEN 'CONSUMER_EXTERNAL_ACCESS' THEN
RETURN '{
"type": "CONFIGURATION",
"payload":{
"host_ports":["google.com"],
"allowed_secrets" : "LIST",
"secret_references":["CONSUMER_SECRET"]}}';
WHEN 'CONSUMER_SECRET' THEN
RETURN '{
"type": "CONFIGURATION",
"payload":{
"type" : "OAUTH2",
"security_integration": {
"oauth_scopes": ["https://www.googleapis.com/auth/analytics.readonly"],
"oauth_token_endpoint": "https://oauth2.googleapis.com/token",
"oauth_authorization_endpoint":
"https://accounts.google.com/o/oauth2/auth"}}}';
END CASE;
RETURN '';
END;
$$;
GRANT USAGE ON PROCEDURE CONFIG.GET_CONFIGURATION_FOR_REFERENCE(STRING)
TO APPLICATION ROLE app_admin;
この例では、 EXTERNAL ACCESS INTEGRATION または SECRET 参照型の参照を構築するために使用される JSON 形式の構成を返す GET_CONFIGURATION_FOR_REFERENCE
という名前のストアドプロシージャを作成します。switchステートメント内のエントリは、 manifest.yml
ファイル内の参照名にマップする必要があります。
注釈
このコールバック関数は、 EXTERNAL ACCESS INTEGRATION および SECRET 型の参照で必要となります。これらのタイプの参照にのみ適用されます。
アプリケーションで定義された参照を表示する¶
プロバイダーが manifest.yml
ファイルで参照を定義すると、それらはインストールされた Snowflake Native App の一部として含まれます。
Snowflake Native App 用に定義された参照を表示するには、次の例に示すように SHOW REFERENCES コマンドを実行します。
SHOW REFERENCES IN APPLICATION hello_snowflake_app;
アプリケーションにオブジェクトをバインドする¶
Snowflake Native App の参照定義を表示した後、コンシューマーは、次の例に示すように SYSTEM$REFERENCE システム関数を実行して、参照を作成します。
SELECT SYSTEM$REFERENCE('table', 'db1.schema1.table1', 'persistent', 'select', 'insert');
このコマンドは参照の識別子を返します。コンシューマーは、以下の例に示すように、参照用の識別子をコールバックストアドプロシージャに渡すことができます。
CALL app.config.register_single_reference(
'consumer_table' , 'ADD', SYSTEM$REFERENCE('TABLE', 'db1.schema1.table1', 'PERSISTENT', 'SELECT', 'INSERT'));
この例では、 consumer_table
は manifest.yml
ファイルで定義されている参照の名前です。コンシューマーが参照に関連付けられたストアドプロシージャを実行すると、 Snowflake Native App はコンシューマーカウントのテーブルにアクセスできるようになります。
前のセクション のコールバックストアドプロシージャは、次の例に示すように SYSTEM$SET_REFERENCE システム関数を呼び出します。
SELECT SYSTEM$SET_REFERENCE(:ref_name, :ref_or_alias);
参照に関連するその他のシステム関数については、 サポートされている参照関数 をご参照ください。
参照を使用する際の考慮事項¶
Snowflakeは、バージョン間で参照定義を変更しないことをお勧めします。新しいバージョンで参照定義を更新する、たとえば、権限を SELECT から INSERT に変更するには、新しい参照定義を異なる名前で定義する必要があります。更新された Snowflake Native App は、この新しい参照を新しいバージョンのアプリで使用できます。
参照を別のオブジェクトに埋め込むには、たとえば参照を変数に代入するには、その参照がすでにコンシューマーカウントのオブジェクトにバインドされている必要があります。たとえば、最初にコンシューマーウェアハウスへの参照をバインドしない限り、タスクを作成することはできません。
Snowflake Native App 内で参照を使用する例¶
次のセクションでは、異なるコンテキストで参照を使用する例を示します。
注釈
以下の例の reference()
関数は、 APPLICATION オブジェクトのストアドプロシージャ内でのみ呼び出すことができます。
参照を使用してクエリを実行する¶
以下の例は、参照を使用したクエリの実行方法を示しています。
SELECT * FROM reference('consumer_table');
SELECT reference('encrypt_func')(t.c1) FROM consumer_table t;
参照を使用してストアドプロシージャを呼び出す¶
次の例は、参照を使用してストアドプロシージャを呼び出す方法を示しています。
CALL reference('consumer_proc')(11, 'hello world');
参照を使用して DML コマンドを実行する¶
以下の例では、参照を使用してテーブルのデータを変更する方法を示します。
INSERT INTO reference('data_export')(C1, C2)
SELECT T.C1, T.C2 FROM reference('other_table')
COPY INTO reference('the_table') ...
参照を使用して DESCRIBE コマンドを実行する¶
次の例では、参照を使用して DESCRIBE 操作を実行する方法を示します。
DESCRIBE TABLE reference('the_table')
タスクで参照を使用する¶
CREATE TASK app_task
WAREHOUSE = reference('consumer_warehouse')
...;
ALTER TASK app_task SET WAREHOUSE = reference('consumer_warehouse');
ビュー定義で参照を使用する¶
CREATE VIEW app_view
AS SELECT reference('function')(T.C1) FROM reference('table') AS T;
関数本文で参照を使用する¶
CREATE FUNCTION app.func(x INT)
RETURNS STRING
AS $$ select reference('consumer_func')(x) $$;
外部関数で参照を使用する¶
CREATE EXTERNAL FUNCTION app.func(x INT)
RETURNS STRING
...
API_INTEGRATION = reference('app_integration');
関数またはプロシージャで参照を使用する¶
CREATE FUNCTION app.func(x INT)
RETURNS STRING
...
EXTERNAL_ACCESS_INTEGRATIONS = (reference('consumer_external_access_integration'), ...);
SECRETS = ('cred1' = reference('consumer_secret'), ...);
注釈
コンシューマーは、外部アクセス統合またはシークレットへの参照を含む関数またはストアドプロシージャを直接呼び出すことはできません。シークレットと外部アクセス統合への参照は、Streamlitアプリ、タスク、その他の関数、ストアドプロシージャなど、他のすべてのアプリケーションコンポーネントで使用できます。
外部アクセス統合またはシークレットへの参照を含む関数またはストアドプロシージャをコンシューマーが直接呼び出せるようにするために、プロバイダーは、コンシューマーが直接呼び出せるラッパー関数内にこれらのオブジェクトを含む関数を含めることができます。
ポリシーで参照を使用する¶
CREATE ROW ACCESS POLICY app_policy
AS (sales_region varchar) RETURNS BOOLEAN ->
'sales_executive_role' = reference('get_sales_team')
or exists (
select 1 from reference('sales_table')
where sales_manager = reference('get_sales_team')()
and region = sales_region
);
構成コールバック応答の JSON 形式¶
構成コールバック関数は、 JSON 形式で応答を返します。返される JSON 形式は、外部アクセス統合とシークレット参照では異なります。
外部アクセス統合の JSON 形式¶
EXTERNAL ACCESS INTEGRATION 参照の場合、 JSON 応答の予想される構造は次のとおりです。
{
"type": "CONFIGURATION",
"payload": {
"host_ports": ["host_port_1", ...],
"allowed_secrets": "NONE|ALL|LIST",
"secret_references": ["ref_name_1", ...]
}
}
host_ports
文字列の配列。各値は有効なドメインにする必要があります。
必要に応じて、ポートを含めることもできます。有効なポート範囲は1~65535です。ポートを指定しない場合、デフォルトは443です。外部ネットワークの場所が動的ポートをサポートしている場合は、可能なポートをすべて指定する必要があります。
すべてのポートへのアクセスを許可するには、ポートを0に指定します。例:
company.com:0
。これらの値は、外部アクセス統合の出力ネットワークルールを作成するために使用されます。詳細については、 CREATE NETWORK RULE をご参照ください。
allowed_secrets
EXTERNAL ACCESS INTEGRATION 参照によって許可されるシークレットを指定します。有効な値:
NONE
: シークレットは許可されません。ALL
: 既存のシークレットを許可します。LIST
:secret_references
プロパティで指定された特定のシークレットのセットを許可します。
allowed_secrets
の値は、外部アクセス統合を作成するために使用されます。詳細については、 CREATE EXTERNAL ACCESS INTEGRATION をご参照ください。secret_references
:外部アクセス統合によって許可されるシークレット参照のリストを指定します。
ここで指定する値は、マニフェストで定義されたシークレット参照と同じである必要があります。
このプロパティは、
allowed_secrets
がLIST
に設定されている場合にのみ適用されます。このコンテキストでは、secret_references
が必要です。
シークレット参照の JSON 形式¶
シークレット参照の場合、 JSON 応答の予想される構造は次のようになります。
{
"type": "CONFIGURATION",
"payload": {
"type": "OAUTH2",
"security_integration": {
"oauth_scopes": ["scope_1", "scope_2"],
"oauth_token_endpoint" : "token_endpoint",
"oauth_authorization_endpoint" : "auth_endpoint"
}
}
}
payload.type
シークレットの種類。有効な値:
OAUTH2
: OAuth2 許可フローで使用するシークレットを指定します。詳細については、 CREATE SECRET をご参照ください。
payload.security_integration
OAuth シークレットの API 認証 を構成するために必要な値を指定します。
エラー応答の JSON 形式¶
エラーが発生した場合、または参照がまだ構成の準備ができていない場合は、エラー応答の予想される構造は次のようになります。
{
"type": "ERROR",
"payload":{
"message": "The reference is not available for configuration ..."
}
}
message
: Snowsight に表示されるアプリケーションからのエラーメッセージ。
サポートされている参照関数¶
Snowflake Native App Framework は、参照に関するさまざまな操作を実行するために、以下の関数をサポートしています。
システム関数 |
説明 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|