Google Cloud 上での外部ネットワークアクセスとプライベート接続

このトピックでは、外部ネットワークアクセス を使用して Google Cloud 外部サービスへのアウトバウンドプライベート接続を設定するための構成の詳細を説明します。アウトバウンド・パブリック接続とアウトバウンド・プライベート接続の設定の主な違いは、プライベート接続の場合、以下の操作を行う必要があることです。

  • プライベート接続エンドポイントを作成します。このステップでは、 ACCOUNTADMIN ロールが必要です。

  • ネットワークルールを作成し、TYPE プロパティを PRIVATE_HOST_PORT にセットします。

アウトバウンド プライベート接続コスト

各プライベート・コネクティビティ・エンドポイントの料金は、処理されるデータ総量に応じて支払われます。これらのアイテムの価格については、 Snowflake Service Consumption Table をご参照ください。

ACCOUNT_USAGE および ORGANIZATION_USAGE スキーマで請求ビューをクエリする際、以下のサービスタイプでフィルターをかけることで、これらの項目のコストを調べることができます。

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

例えば、 USAGE_IN_CURRENCY_DAILY 表示をクエリし、これらのサービスタイプでフィルターをかけることができます。

外部ネットワークアクセスの構成

Google Cloud で外部ネットワークアクセスを使用したアウトバウンドプライベート接続を構成するには、次のステップを実行します。

  1. Snowflakeで、SYSTEM$PROVISION_PRIVATELINK_ENDPOINT システム関数を呼び出して、Snowflake VNet にプライベート接続エンドポイントをプロビジョニングし、Snowflakeがプライベート接続を使用して Google Cloud 外部サービスに接続できるようにします。

    USE ROLE ACCOUNTADMIN;
    
    SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
      'projects/<project_id>/regions/us-west2/serviceAttachments/cloud-func',
      'my-hello-echo-function.com',
    );
    
    Copy
  2. Google Cloud console で、サービスの添付ファイルに移動し、新しく接続されたSnowflakeプロジェクトを受け入れます。

  3. Snowflake で、ネットワークルール を作成し、プライベート接続を有効にするために PRIVATE_HOST_PORT プロパティを指定します。

    CREATE DATABASE IF NOT EXISTS external_access_db;
    
    CREATE OR REPLACE NETWORK RULE external_access_db.public.cloud_func_rule
      MODE = EGRESS
      TYPE = PRIVATE_HOST_PORT
      VALUE_LIST = ('my-hello-echo-function:443');
    
    Copy
  4. Snowflakeで、外部アクセス統合 を作成し、前のステップのネットワークルールを指定します。

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION web_server_eai
      ALLOWED_NETWORK_RULES = (external_access_db.public.cloud_func_rule)
      ENABLED = TRUE;
    
    Copy
  5. Snowflakeで、次の SQL ステートメントを実行し、外部アクセス統合を使用できる関数を作成します。

    CREATE OR REPLACE FUNCTION call_func(name VARCHAR)
      returns VARCHAR
      LANGUAGE JAVA
      EXTERNAL_ACCESS_INTEGRATIONS = (web_server_eai)
      HANDLER = 'UDFClient.call'
      AS
      $$
      import java.net.http.HttpClient;
      import java.net.http.HttpRequest;
      import java.net.http.HttpResponse;
      import java.net.URI;
      import java.io.IOException;
    
      public class UDFClient {
        private HttpClient client;
    
        public UDFClient() {
          this.client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
     }
    
      public String call(String name) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
             .header("Content-Type", "application/json")
             .uri(URI.create("http://my-hello-echo-function?name=" + name))
             .GET()
             .build();
    
        HttpResponse<String> response =
             client.send(request, HttpResponse.BodyHandlers.ofString());
    
        return String.valueOf(response.body());
       }
      }
      $$;
    
    Copy
  6. Snowflakeで、前のステップで作成した関数を呼び出します。

    SELECT call_func("snowflake");
    
    -- Returns "Hello snowflake!"
    
    Copy

外部ネットワークアクセス統合用のプライベート接続エンドポイントが不要になった場合は、 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT システム機能を呼び出します。