Google Cloud 에서의 외부 네트워크 액세스 및 비공개 연결

이 항목에서는 :doc:`외부 네트워크 액세스</developer-guide/external-network-access/external-network-access-overview>`를 통해 Google Cloud 외부 서비스에 대한 아웃바운드 비공개 연결을 설정하는 구성 세부 정보를 제공합니다. 아웃바운드 공용 연결과 아웃바운드 비공개 연결 구성의 주요 차이점은 비공개 연결의 경우 다음 작업을 수행해야 한다는 점입니다.

  • 비공개 연결 엔드포인트를 생성합니다. 이 단계에는 ACCOUNTADMIN 역할이 필요합니다.

  • TYPE 속성이 :code:`PRIVATE_HOST_PORT`로 설정되도록 네트워크 규칙을 만듭니다.

아웃바운드 비공개 연결 비용

처리된 총 데이터와 함께 각 비공개 연결 엔드포인트에 대한 비용을 지불합니다. 이러한 품목의 가격은 Snowflake서비스 사용 테이블 을 참조하십시오.

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. |gc-console|에서 서비스 첨부 파일로 이동하여 새로 연결된 Snowflake 프로젝트를 수락합니다.

  3. Snowflake에서 비공개 연결을 활성화하도록 PRIVATE_HOST_PORT 속성을 지정하여 :doc:`네트워크 규칙</sql-reference/sql/create-network-rule>`을 만듭니다.

    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에서 이전 단계의 네트워크 규칙을 지정하여 :doc:`외부 액세스 통합</sql-reference/sql/create-external-access-integration>`을 만듭니다.

    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 시스템 함수를 호출합니다.