例 - アプリ仕様を使用して外部エンドポイントにアクセスする

このトピックでは、Snowflakeの外部にあるエンドポイントに接続する Snowflake Native App を構成する方法について説明します。この例では、アプリのマニフェストファイルとセットアップスクリプトを構成する以下を実行する方法を示します。

  • 権限の自動付与 を使用して、コンシューマーに外部アクセス統合を作成する権限をリクエストします。

  • アプリに外部アクセス統合を追加する

  • アプリケーション仕様 を使用して、コンシューマーに外部エンドポイントへの接続許可をリクエストします。

マニフェストファイルのバージョンを指定します。

アプリに対する権限の自動付与を有効にするには、次の例に示すように、マニフェストファイルの先頭でバージョンを設定します。

manifest_version: 2
Copy

マニフェストファイルで CREATEEXTERNALACCESSINTEGRATION の権限をリクエストします

CREATEEXTERNALACCESSINTEGRATION の権限では、インストールまたはアップグレード時にアプリが外部アクセス統合を作成できます。コンシューマーにこの権限を要求するには、マニフェストファイルに次のエントリを追加します。

privileges:
  - CREATE EXTERNAL ACCESS INTEGRATION:
      description: "Required to create eai integrations so we can simplify your life"
Copy

CREATE EXTERNAL ACCESS INTEGRATION の権限は、インストールまたはアップグレード前にアプリに自動的に付与され、次のような利点があります。

  • コンシューマーは、アプリに必要な外部アクセス統合を手動で作成し、参照を使用してアクセスを承認する必要がありません。

  • プロバイダーは、インストール中やアップグレード時に、オブジェクトの作成に進む前に、CREATEEXTERNALACCESSINTEGRATION の権限の存在をチェックするコードを記述する必要がありません。

外部アクセス統合のネットワークルールの作成

外部アクセス統合には、外部エンドポイントを定義するネットワークルールが必要です。たとえば、ネットワークルールを作成するには、アプリのセットアップスクリプトに CREATE NETWORK RULE コマンドを追加します。

CREATE OR REPLACE NETWORK RULE setup.my_network_rule
   TYPE = HOST_PORT
   VALUE_LIST = ( 'example.com' )
   MODE = EGRESS;
Copy

このコマンドは、ホストポート``example.com``への送信リクエスト(エグレス)を定義するネットワークルールを作成します。

外部アクセス統合を作成する

セットアップスクリプトでネットワークルールを作成したら、次の例に示すように、CREATE EXTERNAL ACCESS INTEGRATION コマンドを使用して外部アクセス統合を作成します。

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_app_prefix_eai_rule
  ALLOWED_NETWORK_RULES = (setup.my_network_rule)
  ENABLED = TRUE;
Copy

注釈

このコマンドは、コンシューマーアカウントに外部アクセス統合を作成します。ただし、リクエストされたホストポートに外部アクセスを許可するアプリ仕様をコンシューマーが承認するまで、外部アクセス統合は使用できません。詳細については、 アプリの仕様を使用した外部リソースへの接続の承認 をご参照ください。

外部エンドポイントにアクセスするためのユーザー定義関数を作成する

外部アクセス統合を作成した後、セットアップスクリプトは、ネットワークルールで定義されたエンドポイントに接続するために使用するユーザー定義関数とストアドプロシージャを作成できます。

次の例は、my_app_prefix_eai_rule 外部アクセス統合を使用するユーザー定義関数を示しています。

CREATE OR REPLACE FUNCTION setup.EXTERNAL_ACCESS_UDF(hostname STRING)
  RETURNS STRING
  LANGUAGE JAVA
  HANDLER='TestHostNameLookup.compute'
  EXTERNAL_ACCESS_INTEGRATIONS = (my_app_prefix_eai_rule)
  AS
  '
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      class TestHostNameLookup {{
          public static String compute(String hostname) throws Exception {{
              InetAddress addr = null;
              try {
                  addr = InetAddress.getByName(hostname);
              } catch(UnknownHostException ex) {
                  return "Hostname lookup failed";
              }
              return "Hostname lookup successful";
          }
      }
';
GRANT USAGE ON FUNCTION setup.EXTERNAL_ACCESS_UDF(STRING)
  TO APPLICATION ROLE app_public;
Copy

この関数は EXTERNAL_ACCESS_INTEGRATIONS 以前に作成した外部アクセスを統合します。

この関数は InetAddress Javaパッケージを使用して、プロシージャに渡されたホスト名を検索します。提供するホスト名は、外部アクセス統合によって使用されるネットワークルールの VALUE_LIST プロパティで提供される値と一致する必要があります。

アプリ仕様を作成する

アプリは、インストール中やアップグレード中、または実行時にストアドプロシージャからアプリ仕様を作成できます。次の例は、ALTER APPLICATION SET SPECIFICATIONS コマンドの使用方法を示して、アプリ仕様を作成する方法を示しています:

ALTER APPLICATION SET SPECIFICATION my_app_specification
        TYPE = EXTERNAL_ACCESS
        LABEL = 'An external api'
        DESCRIPTION = 'Used to connect to an external API'
        HOST_PORTS  = 'example.com';
Copy