内部ステージ用のAzureプライベートエンドポイント

このトピックでは、Microsoft Azureプライベートエンドポイントを介してSnowflake内部ステージに接続するための概念と、詳細な手順について説明します。

このトピックの内容:

概要

AzureプライベートエンドポイントAzure Private Link を組み合わせて、Snowflake内部ステージへの安全な接続を提供できます。この設定により、Snowflake内部ステージへのデータのロードとアンロードの操作にはAzure内部ネットワークを使用し、パブリックインターネットを介さないようになります。

Microsoftが内部ステージアクセス用のプライベートエンドポイントをサポートする前は、Snowflake内部ステージへの安全なアクセスを容易にするために、Azure VNet 内にプロキシファームを作成する必要がありました。Snowflake内部ステージ用のプライベートエンドポイントのサポートが追加されたことで、ユーザーとクライアントアプリケーションは、プライベートAzureネットワークを介してSnowflake内部ステージにアクセスできるようになりました。次の図は、この新しいサポートをまとめたものです。

Connect to internal stage using Azure Private Link

BEFORE 図の番号に関して次の点に注意してください。

  • ユーザーには、Snowflake内部ステージに接続するための2つのオプションがあります。

    • オプションAは、番号1で示されているように、内部ステージへの直接のオンプレミス接続を許可します。

    • オプションBは、番号2および3で示されているように、プロキシファームを介した内部ステージへの接続を許可します。

  • プロキシファームを使用している場合、ユーザーは番号4で示されているようにSnowflakeに直接接続することもできます。

AFTER 図の番号に関して次の点に注意してください。

  • わかりやすくするために、この図では、単一のSnowflake内部ステージ(6と7)を指す、Azure VNet 1つからの単一のプライベートエンドポイントを示しています。

    同じSnowflake内部ステージを指す、それぞれが異なる VNet 内の複数のプライベートエンドポイントを構成できることに注意してください。

  • この機能の更新により、プロキシファームを介してSnowflakeまたはSnowflake内部ステージに接続する必要がなくなります。

  • オンプレミスユーザーは、番号5に示すようにSnowflakeに直接接続できます。

  • Snowflake内部ステージに接続するには、オンプレミスユーザーは、番号6のプライベートエンドポイントに接続し、次に番号7に示すようにAzure PrivateLinkを使用して、Snowflake内部ステージに接続します。

Azureには、各Snowflakeアカウントに、内部ステージとして使用するための専用のストレージアカウントがあります。ストレージアカウント URIs は、ストレージアカウントへの接続がプライベート接続(つまり、Azure Private Link)を使用するかどうかによって異なります。プライベート接続 URL には、 URL に privatelink セグメントが含まれています。

パブリックストレージアカウント URI

<ストレージアカウント名>.blob.core.windows.net

プライベート接続ストレージアカウント URI

<ストレージアカウント名>.privatelink.blob.core.windows.net

利点

Snowflake内部ステージにアクセスするためにプライベートエンドポイントを実装すると、次の利点があります。

  • 内部ステージのデータは、パブリックインターネットを通過しません。

  • Azure VNet の外部で実行されるクライアントおよび SaaS アプリケーション(Microsoft PowerBI など)は、Snowflakeに安全に接続できます。

  • 管理者は、内部ステージデータにアクセスするためにファイアウォール設定を変更する必要がありません。

  • 管理者は、ユーザーがストレージアカウントに接続する方法に関して、一貫したセキュリティと監視を実装できます。

制限事項

Microsoft AzureはプライベートエンドポイントがSnowflakeとどのように相互作用できるかを定義します。

  • 単一のプライベートエンドポイントは、単一のSnowflakeサービスエンドポイントと通信できます。同じSnowflake内部ステージに接続する複数の1対1の構成を持つことができます。

  • Snowflake内部ステージに接続できるストレージアカウントのプライベートエンドポイントの最大数は固定です。詳細については、 標準ストレージアカウント制限 をご参照ください。

Snowflake内部ステージにアクセスするためのプライベートエンドポイントの構成

Snowflake内部ステージにアクセスするようにプライベートエンドポイントを構成するには、組織内にある次の3つのロールから、サポートが必要です。

  1. Snowflakeアカウント管理者(つまり、Snowflake ACCOUNTADMIN システムロールを持つユーザー)。

  2. Microsoft Azure管理者。

  3. ネットワーク管理者。

組織によっては、次の構成ステップを実装するために、構成作業で複数の人またはチームとの調整が必要になる場合があります。

次のステップを実行して、Azureプライベートエンドポイントを介したSnowflake内部ステージへの安全なアクセスを構成および実装します。

  1. AzureサブスクリプションがAzure Storageリソースマネージャーに登録されていることを確認します。この手順により、プライベートエンドポイントから内部ステージに接続できるようになります。

  2. Snowflakeアカウント管理者として、Snowflakeアカウントで次のステートメントを実行し、 privatelink_internal_stage キーで定義された内部ステージストレージアカウントの ResourceID を記録します。詳細については、 ENABLE_INTERNAL_STAGES_PRIVATELINK および SYSTEM$GET_PRIVATELINK_CONFIG をご参照ください。

    use role accountadmin;
    alter account set ENABLE_INTERNAL_STAGES_PRIVATELINK = true;
    select key, value from table(flatten(input=>parse_json(system$get_privatelink_config())));
    
    Copy
  3. Azure管理者として、Azureポータルからプライベートエンドポイントを作成します。

    プライベートエンドポイントのプロパティを表示し、リソース ID 値を記録します。この値は、次のステップの privateEndpointResourceID 値になります。

    Target sub-resource 値が blob に設定されていることを確認します。

    詳細については、Microsoft Azure Private Link ドキュメント をご参照ください。

  4. Snowflake管理者として、 privateEndpointResourceID 値を使用して、関数の引数として SYSTEM$AUTHORIZE_STAGE_PRIVATELINK_ACCESS 関数を呼び出します。このステップは、プライベートエンドポイントを介したSnowflake内部ステージへのアクセスを許可します。

    use role accountadmin;
    select system$authorize_stage_privatelink_access('<privateEndpointResourceID>');
    
    Copy

    必要に応じて、これらのステップを実行して、内部ステージへのアクセスを 取り消し ます。

  5. ネットワーク管理者として、 DNS 設定を更新し、 URLs を次のように解決します。

    <ストレージアカウント名>.blob.core.windows.net から <ストレージアカウント名>.privatelink.blob.core.windows.net

    Azure VNet でプライベート DNS ゾーンを使用する場合は、 <ストレージアカウント名>.privatelink.blob.core.windows.net のエイリアスの記録を作成します。

    詳細については、 Azureプライベートエンドポイント DNS 構成 をご参照ください。

    ちなみに

    • テストには別のSnowflakeアカウントを使用し、テスト VNet でプライベート DNS ゾーンを構成して機能をテストすることにより、テストが分離されて他のワークロードに影響を与えないようにします。

    • 別のSnowflakeアカウントを使用できない場合は、テストユーザーを使用して、 DNS の変更を実行したテスト VPC からSnowflakeにアクセスします。

    • オンプレミスアプリケーションからテストするには、 DNS 転送を使用して、 DNS 設定を実行する VNet 内のAzureプライベート DNS にリクエストを転送します。クライアントマシンから次のコマンドを実行して、返された IP アドレスがストレージアカウントのプライベート IP アドレスであることを確認します。

      dig <storage_account_name>.blob.core.windows.net
      
      Copy

パブリックアクセスのブロック(オプション)

Azure Private Link経由で内部ステージにアクセスするようにプライベートエンドポイントを構成すると、オプションでパブリック IP アドレスから内部ステージへのリクエストをブロックできます。パブリックアクセスがブロックされると、すべてのトラフィックはプライベートエンドポイントを経由する必要があります。

Azure内部ステージへのパブリックアクセスの制御は、Snowflakeサービスへのパブリックアクセスの制御とは異なります。内部ステージへのリクエストをブロックするには、ネットワークポリシーではなく、 SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 関数を使用します。ネットワークポリシーとは異なり、この関数は一部のパブリックアドレス(IP)をブロックしながら他のアドレスを許可することはできません。SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS を呼び出すと、 すべての パブリック IP アドレスがブロックされます。

重要

公開アクセスをブロックする 前に、プライベート接続経由のトラフィックが内部ステージに正常に到達していることを確認します。プライベート接続を設定せずにパブリックアクセスをブロックすると、Azure Data Factoryのようなマネージドサービスに支障をきたすなど、予期せぬ障害が発生する可能性があります。

SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 関数は、内部ステージがあるAzureストレージアカウントの Networking 設定を変更することで制限を適用します。これらのAzureの設定は、一般的に「ストレージアカウントのファイアウォール設定」と呼ばれています。Snowflake関数を実行すると、Azureでは次が実行されます。

  • Public network access フィールドを Enabled from selected virtual networks and IP addresses に設定します。

  • Snowflake VNet のサブネットIDを Virtual Networks セクションに追加します。

  • Firewall セクションからすべての IP アドレスをクリアします。

パブリック IP アドレスから内部ステージへのすべてのトラフィックをブロックするには、以下を実行します。

SELECT SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS();
Copy

この関数は実行終了までに数分かかることがあります。

パブリックアクセスの確実なブロック

SYSTEM$INTERNAL_STAGES_PUBLIC_ACCESS_STATUS 関数を実行すると、パブリック IP アドレスが内部ステージにアクセスできるかどうかを判断できます。

Azureの設定が現在すべてのパブリックトラフィックをブロックしている場合、この関数は Public Access to internal stages is blocked を返します。これは、 SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 関数の実行後に設定が変更されていないことを確認するものです。

少なくともいくつかのパブリック IP アドレスが内部ステージにアクセスできる場合、関数は Public Access to internal stages is unblocked を返します。

パブリックアクセスのブロック解除

SYSTEM$UNBLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 関数を実行すると、これまでブロックされていた内部ステージへのパブリックアクセスを許可できます。

この関数を実行すると、内部ステージがあるAzureストレージアカウントの Networking 設定が変更されます。Azure Public network access フィールドを Enabled from all networks に設定します。

Snowflake内部ステージにアクセスするためのプライベートエンドポイントの取り消し

Microsoft Azureプライベートエンドポイントを介してSnowflake内部ステージへのアクセスを取り消すには、次のステップを実行します。

  1. Snowflake管理者は、 ENABLE_INTERNAL_STAGES_PRIVATELINK パラメーターを FALSE に設定して、 SYSTEM$REVOKE_STAGE_PRIVATELINK_ACCESS 関数を呼び出し、プライベートエンドポイントへのアクセスを最初に許可するために使用されたのと同じ privateEndpointResourceID 値を使用して、プライベートエンドポイントへのアクセスを取り消します。

    use role accountadmin;
    alter account set enable_internal_stages_privatelink = false;
    select system$revoke_stage_privatelink_access('<privateEndpointResourceID>');
    
    Copy
  2. Azure管理者は、Azureポータルからプライベートエンドポイントを削除します。

  3. ネットワーク管理者として、ストレージアカウント URLs の解決に使用された DNS およびエイリアスの記録を削除します。

この時点で、プライベートエンドポイントへのアクセスは取り消され、 SYSTEM$GET_PRIVATELINK_CONFIG 関数を呼び出したクエリ結果は、 privatelink_internal_stage キーとその値を返さないはずです。

トラブルシューティング

パブリックインターネット経由でSnowflakeステージにアクセスし、プライベート DNS サービスを使用してサービスのホスト名を解決するAzureアプリケーションは、このトピックで説明されているように、ステージへのプライベートエンドポイント接続が確立されている場合、Snowflakeステージにアクセスできません。

プライベートエンドポイント接続が作成されると、Microsoft Azureはパブリック DNS サービスに CNAME 記録を自動的に作成し、ストレージアカウントホストを対応するAzureプライベートリンク(つまり .privatelink.blob.core.windows.net)にポイントします。アプリケーションが同じドメインにプライベート DNS リージョンを構成している場合、Microsoft Azureは、プライベート DNS サービスにクエリを実行して、ストレージアカウントホストを解決しようとします。ストレージアカウントのエントリがプライベート DNS サービスで見つからない場合は、接続エラーが発生します。

この問題に対処するには、次の2つのオプションがあります。

  1. プライベート DNS リージョンをアプリケーションから削除または分離します。

  2. プライベート DNS サービスでストレージアカウントのプライベートホスト名(つまり、 <ストレージアカウント名>.privatelink.blob.core.windows.net)の CNAME 記録を作成し、次のコマンドの出力で指定されたホスト名をポイントするようにします。

    dig CNAME <storage_account_name>.privatelink.blob.core.windows.net
    
    Copy