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 で外部ネットワークアクセスを使用したアウトバウンドプライベート接続を構成するには、次のステップを実行します。
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', );
Google Cloud console で、サービスの添付ファイルに移動し、新しく接続されたSnowflakeプロジェクトを受け入れます。
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');
Snowflakeで、外部アクセス統合 を作成し、前のステップのネットワークルールを指定します。
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION web_server_eai ALLOWED_NETWORK_RULES = (external_access_db.public.cloud_func_rule) ENABLED = TRUE;
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()); } } $$;
Snowflakeで、前のステップで作成した関数を呼び出します。
SELECT call_func("snowflake"); -- Returns "Hello snowflake!"
外部ネットワークアクセス統合用のプライベート接続エンドポイントが不要になった場合は、 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT システム機能を呼び出します。