チュートリアル5: サービスエンドポイント権限を構成してテストする

概要

チュートリアル1では、同じロールを使用してサービスを作成し、テストします。サービスを作成するロールはサービスの所有者ロールであるため、そのロールを使用してサービスと通信することができます。

このチュートリアルでは、サービスと通信するために別のロールを使用することを検討します。

サービス仕様で定義した サービスロール を使用して、このロールに USAGE 権限を付与します。

このチュートリアルでは、 チュートリアル1 を以下のように変更します。

  1. サービスとの通信に使用する新しいロールを作成します。

  2. サービス仕様を以下のように変更します。

    • 1つのエンドポイントではなく、2つのエンドポイントを定義します。2番目のエンドポイントは、エンドポイントの権限がどのように機能するかを示すためだけに追加されていることに注意してください。

    • 2つのエンドポイントのうち1つだけにアクセスできるサービスロールを定義します。

  3. 作成した新しいロールにサービスロールを付与し、サービスエンドポイントの1つへのアクセスを許可します。

  4. 新しいロールを使用して、サービスエンドポイントと通信します。

準備

共通セットアップ に従って、以下の変更を行います。

  1. 共通セットアップの手順を完了します。

  2. ACCOUNTADMIN ロールを使用して、 user_name をSnowflakeユーザーの名前に置き換えて、以下のスクリプトを実行して別のロール(service_function_user_role)を作成します。Echoサービスを作成した後、このロールを使用してサービスと通信します。

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE service_function_user_role;
    GRANT ROLE service_function_user_role TO USER <user-name>;
    GRANT USAGE ON WAREHOUSE tutorial_warehouse TO ROLE service_function_user_role;
    
    Copy
  3. チュートリアル1 のステップ1と2に従って、イメージを作成し、アカウント内のリポジトリにアップロードします。このチュートリアルの一部としてサービスを作成するので、ステップ3には進まないでください。

サービスの作成

  1. このステップの SQL ステートメントのコンテキストが正しいことを確認するために、以下を実行します。

    USE ROLE test_role;
    USE DATABASE tutorial_db;
    USE SCHEMA data_schema;
    USE WAREHOUSE tutorial_warehouse;
    
    Copy
  2. サービスを作成するには test_role (サービスの所有者ロール)を使用して以下のコマンドを実行します。

    CREATE SERVICE echo_service
      IN COMPUTE POOL tutorial_compute_pool
      FROM SPECIFICATION $$
        spec:
          containers:
          - name: echo
            image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
            env:
              SERVER_PORT: 8000
              CHARACTER_NAME: Bob
            readinessProbe:
              port: 8000
              path: /healthcheck
          endpoints:
          - name: echoendpoint
            port: 8000
            public: true
          - name: echoendpoint2
            port: 8002
            public: true
        serviceRoles:
        - name: echoendpoint_role
          endpoints:
          - echoendpoint
          $$;
    
    Copy

    インライン仕様によると、 echo_service は2つのパブリックエンドポイントを公開していますが、サービスロール(echoendpoint_role)は1つのエンドポイントにのみ USAGE 権限を付与しています。

  3. サービスが実行されていることを確認します。

    SHOW SERVICES;
    SELECT SYSTEM$GET_SERVICE_STATUS('echo_service');
    DESCRIBE SERVICE echo_service;
    
    Copy
  4. test_role (サービスの所有者ロール)を使用して、共通セットアップの一部として作成した新しいロール(service_function_user_role)に、仕様で定義されたサービスロールを付与します。データベースおよびスキーマに USAGE 権限も付与します。

    USE ROLE test_role;
    USE DATABASE tutorial_db;
    USE SCHEMA data_schema;
    
    GRANT USAGE ON DATABASE tutorial_db TO ROLE service_function_user_role;
    GRANT USAGE ON SCHEMA data_schema TO ROLE service_function_user_role;
    GRANT SERVICE ROLE echo_service!echoendpoint_Role TO ROLE service_function_user_role;
    
    Copy

    このサービスロールは echoendpoint エンドポイントに service_function_user_role USAGE 権限を付与します。

    サービスロール名が大文字と小文字を区別することを示すために、この例では echoendpoint_Role ロール名を使用しています。

サービスの使用

サービスと通信するためのサービス関数を作成します。 service_function_user_role (サービスの所有者ロールではない)を使用してサービス関数を作成し、サービスを使用します。

  1. サービス関数を作成します。

    USE ROLE service_function_user_role;
    CREATE OR REPLACE FUNCTION my_echo_udf_try1 (InputText VARCHAR)
      RETURNS varchar
      SERVICE=echo_service
      ENDPOINT=echoendpoint
      AS '/echo';
    
    Copy
  2. ロールにアクセス権限がない echoservice2 エンドポイントを参照する別のサービス関数を作成してみてください。そうすると、このコマンドは 失敗 するはずです。

    CREATE OR REPLACE FUNCTION my_echo_udf_try2 (InputText varchar)
      RETURNS varchar
      SERVICE=echo_service
      ENDPOINT=echoendpoint2
      AS '/echo';
    
    Copy
  3. サービス関数を使用します。

    SELECT my_echo_udf_try1('Hello');
    
    Copy

クリーンアップする

作成したリソースを削除するには、 チュートリアル1 の手順に従って、チュートリアル1で作成したその他のリソースをクリーンアップします。

次の内容

このチュートリアルを完了したため、 サービスの操作 に戻って他のトピックを調べることができます。