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

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

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

  • PRIVATE_HOST_PORT プロパティを使用するネットワーク・ルールを作成します。このプロパティには、Azure URL とポート番号が含まれます。これにより、Snowflake から Microsoft Azure への接続が、パブリックインターネットを避けて Microsoft Azure 内部ネットワークを経由するようになります。

請求と価格設定

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

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

これらの手順は、 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 Management リソースの所有者として、プライベートエンドポイントを承認します。詳細については、 Microsoft Azure Private Link ドキュメント をご参照ください。

  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 システム機能を呼び出します。