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

이 항목에서는 외부 네트워크 액세스 를 통해 외부 서비스에 대한 아웃바운드 비공개 연결을 설정하는 구성 세부 정보를 제공합니다. 아웃바운드 공용 연결과 아웃바운드 비공개 연결 구성의 주요 차이점은 비공개 연결의 경우 다음 작업을 수행해야 한다는 점입니다.

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

  • PRIVATE_HOST_PORT 속성을 사용할 네트워크 규칙을 만듭니다. 이 속성은 Azure URL 및 포트 번호를 포함하며, 이 속성을 사용하면 Snowflake에서 Microsoft Azure 로 연결할 때 공용 인터넷을 통하지 않고 Microsoft Azure 내부 네트워크를 통과할 수 있습니다.

청구 및 가격

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

외부 네트워크 액세스 구성

이러한 단계는 Microsoft Azure 에서 외부 네트워크 액세스와 함께 아웃바운드 비공개 연결을 사용하는 경우에만 해당됩니다.

  1. SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 시스템 함수를 호출하여 Snowflake VNet에서 비공개 연결 엔드포인트를 프로비저닝하여 Snowflake가 비공개 연결을 사용하여 외부 서비스에 연결할 수 있도록 합니다.

    USE ROLE ACCOUNTADMIN;
    
    SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
      '/subscriptions/1111-22-333-4444-55555/resourceGroups/external-access/providers/Microsoft.Sql/servers/externalaccessdemo',
      'externalaccessdemo.database.windows.net',
      'sqlServer'
    );
    
    Copy
  2. Azure Portal에서 Azure API 관리 리소스의 소유자로서 비공개 엔드포인트를 승인합니다. 자세한 내용은 Microsoft Azure 설명서 를 참조하십시오.

  3. 네트워크 규칙, 시크릿, 프로시저를 저장할 데이터베이스스키마 를 생성합니다.

    CREATE DATABASE ext_network_access_db;
    CREATE SCHEMA secrets;
    CREATE SCHEMA network_rules;
    CREATE SCHEMA procedures;
    
    Copy
  4. 비공개 연결을 사용하도록 PRIVATE_HOST_PORT 속성을 지정하여 네트워크 규칙 을 생성합니다.

    CREATE OR REPLACE NETWORK RULE ext_network_access_db.network_rules.azure_sql_private_rule
       MODE = EGRESS
       TYPE = PRIVATE_HOST_PORT
       VALUE_LIST = ('externalaccessdemo.database.windows.net');
    
    Copy
  5. 액세스 자격 증명을 안전하게 저장할 시크릿 을 생성합니다.

    CREATE OR REPLACE SECRET ext_network_access_db.secrets.secret_password
       TYPE = PASSWORD
       USERNAME = 'my-username'
       PASSWORD = 'my-password';
    
    Copy
  6. 이전 단계의 네트워크 규칙을 지정하여 외부 액세스 통합 을 생성합니다.

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION azure_private_access_sql_store_integration
       ALLOWED_NETWORK_RULES = (ext_network_access_db.network_rules.azure_sql_private_rule)
       ALLOWED_AUTHENTICATION_SECRETS = (ext_network_access_db.secrets.secret_password)
       ENABLED = TRUE;
    
    Copy
  7. 프로시저 를 생성하여 외부 서비스에 연결합니다.

    CREATE OR REPLACE PROCEDURE ext_network_access_db.procedures.connect_azure_sqlserver()
       RETURNS TABLE()
       LANGUAGE PYTHON
       RUNTIME_VERSION = 3.10
       HANDLER = 'connect_sqlserver'
       EXTERNAL_ACCESS_INTEGRATIONS = (azure_private_access_sql_store_integration)
       SECRETS = ('cred' = ext_network_access_db.secrets.secret_password)
       IMPORTS=('@demo/pytds.zip')
       PACKAGES = ('snowflake-snowpark-python','pyopenssl','bitarray','certifi')
    AS $$
    import pytds
    import certifi
    import _snowflake
    from snowflake.snowpark import types as T
    
    def connect_sqlserver(session):
       server = 'externalaccessdemo.database.windows.net'
       database = 'externalaccess'
       username_password_object = _snowflake.get_username_password('cred');
    
    
       # Create a connection to the database
       with pytds.connect(server, database, username_password_object.username, username_password_object.password, cafile=certifi.where(), validate_host=False) as conn:
             with conn.cursor() as cur:
                cur.execute("""
                SELECT O.OrderId,
                      O.OrderDate,
                      O.SodName,
                      O.UnitPrice,
                      O.Quantity,
                      C.Region
                FROM Orders AS O
                INNER JOIN Customers AS C
                   ON O.CustomerID = C.CustomerID;""")
                rows = cur.fetchall()
    
                schema = T.StructType([
                      T.StructField("ORDER_ID", T.LongType(), True),
                      T.StructField("ORDER_DATE", T.DateType(), True),
                      T.StructField("SOD_NAME", T.StringType(), True),
                      T.StructField("UNIT_PRICE", T.FloatType(), True),
                      T.StructField("QUANTITY", T.FloatType(), True),
                      T.StructField("REGION", T.StringType(), True)
                   ])
    
                final_df = session.createDataFrame(rows, schema)
    
                return final_df
       $$;
    
    Copy
  8. 프로시저를 호출하여 외부 서비스에 연결합니다.

    CALL ext_network_access_db.procedures.connect_azure_sqlserver();
    
    Copy

비공개 연결이 필요한 각 외부 네트워크 액세스 구성에 대해 이 단계를 반복합니다.

외부 네트워크 액세스 통합을 위해 비공개 연결 엔드포인트가 더 이상 필요하지 않은 경우 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT 시스템 함수를 호출합니다.