Azure HDInsightは、パブリックネットワークからのアクセス許可を前提とした構成が既定の構成とされています。
一方で、実運用では外部からインターネット経由での通信を許可せず、プライベート通信に限定するようなケースも存在するかと思います。
今回は、Azure HDInsightへのインバウンド通信をプライベートネットワークに限定する場合の、リソース構成について説明します。
Azure HDInsightの構成
Azure HDInsightは、HDInsightクラスターとリソースプロバイダー間のネットワークトラフィックの方向を、「リソースプロバイダー接続」の設定項目で、「Inbound」か「Outbound」のいずれか選択することができます。
どちらの設定を選択したかにより、仮想ネットワークアーキテクチャが変わります。*1
Inboundの場合
Inboundを選択した場合、アーキテクチャは以下の図のようになります。(依存リソースは省略)
図中のロードバランサー1~3は、それぞれ以下の用途で構成されます。
- インターネット経由でAmbariやその他サービスへアクセスするためのパブリックなエンドポイント
- HTTP:<HDInsightクラスター名>.azurehdinsight.net
- 仮想ネットワークからAmbariやその他サービスへアクセスするためのプライベートなエンドポイント
- HTTP:<HDInsightクラスター名>-int.azurehdinsight.net
- インターネット経由でヘッドノードへ接続するためのパブリックなエンドポイント
- SSH:<HDInsightクラスター名>-ssh.azurehdinsight.net
1、3はパブリックIPを持つ外部ロードバランサーが、2はパブリックIPを持たない内部ロードバランサーが作成されます。
この構成では、クライアントは1、3の外部ロードバランサーを使用して、パブリックネットワーク経由でHDInsightクラスターへアクセスできます。
詳細については以下のドキュメントを参照してください。
learn.microsoft.com
Outboundの場合
Outboundを選択すると、アーキテクチャが以下の図のように変わります。(依存リソースは省略)
図中のロードバランサー1、2は、それぞれ以下の用途で構成されます。
- 仮想ネットワークからAmbariやその他サービスへアクセスするためのHTTPプライベートなエンドポイント(HTTP)
- 仮想ネットワークからヘッドノードへ接続するためのプライベートなエンドポイント(SSH)
リソースプロバイダー接続がOutoboundのHDInsightクラスターを作成する際にはパブリックIPを持たない内部ロードバランサーのみが提供され、HDInsightクラスターが受信用のパブリックエンドポイントを持たない構成となります。
そのため、この構成においては、外部のクライアントからHDInsightクラスターへのパブリックアクセスが原則不可となります。
Outbound選択時の通信について
Outbound選択時には、HDInsightのリソースプロバイダー接続が受信から送信に変わり、HDInsightの管理通信がクラスター内部から発信されます。そのため、HDInsightの管理通信をNSGの受信規則で許可したり、Azure Firewall利用時に、管理通信へのルートをユーザー定義ルートでオーバーライドしたりする必要はありません。
また、Outbound選択時には、既定のストレージアカウントや外部メタストア用のSQL DatabaseといったHDInsightクラスター固有のリソースに対してプライベートエンドポイントを割り当てることで、クラスターからプライベートエンドポイント経由で固有リソースへアクセスできるようになります。
留意点
こちらの構成の場合、エンドポイント用に提供されるFQDNを使用してHDInsightクラスターへアクセスするためには、ユーザー側でDNSレコードを登録する必要があります。
- 1に対応するFQDN
- <HDInsightクラスター名>.azurehdinsight.net
- 2に対応するFQDN
- <HDInsightクラスター名>-ssh.azurehdinsight.net
こちらの構成の詳細は、以下ドキュメントに記載されています。
learn.microsoft.com
検証
リソースプロバイダー接続がOutboundのHDInsightクラスターを作成し、クラスターと同一ネットワーク内にあるVMから、FQDNを使用してクラスターへアクセスできるか検証します。
ここでは、以下の検証環境を一時作成します。
事前準備
HDInsightクラスター作成のための事前準備をします。*2
HDInsight用のNSGは既定のルールのみで作成します。
HDInsight用のストレージアカウント(Azure Data Lake Storage Gen2)を作成します。[階層型名前空間を有効にする]のチェックボックスを選択して作成します。
HDInsight用のユーザー割り当てマネージドIDを作成し、ストレージアカウントに対して[BLOBデータ所有者]ロールを割り当てます。
HDInsightクラスター作成
HDInsightクラスターを作成します。ここでは、特筆事項を抜粋して設定値を説明します。
各設定項目の詳細については以下のドキュメントを参照してください。
learn.microsoft.com
クラスターの種類は任意ですが、今回はHadoopを選択しています。
既定のストレージアカウントは、事前作成したAzure Data Lake Storage Gen2を選択します。Azure Data Lake Storage Gen2アクセス用のマネージドIDについても、事前作成したマネージドIDを選択します。
リソースプロバイダー接続は[Outbound]を設定します。
HDInsightクラスターの作成が完了しました。
プライベートDNSゾーン作成
FQDNを使用したHDInsightクラスターへの接続を可能にするため、プライベートDNSゾーンを作成してAレコードを登録します。
プライベートDNSゾーン名は「azurehdinsight.net」で作成します。
作成したゾーンを、HDInsightクラスターが所属する仮想ネットワークへリンクします。
作成したゾーンに、以下のAレコードを追加します。
<HDInsightクラスター名> A <HTTPエンドポイントのIPアドレス>
<HDInsightクラスター名>-ssh A <SSHエンドポイントのIPアドレス>
「<HDInsightクラスター名>.azurehdinsight.net」に対応するIPアドレス
HDInsightクラスター作成時に、同一リソースグループ内に作成される「gateway-internal-<HDInsightクラスターID>」のLBにて、フロントエンドIPから確認できます。
「<HDInsightクラスター名>-ssh.azurehdinsight.net」に対応するIPアドレス
HDInsightクラスター作成時に、同一リソースグループ内に作成される「headnode-internal-<HDInsightクラスターID>」のLBにて、フロントエンドIPから確認できます。
接続確認
実際に、HDInsightクラスターと同一ネットワーク内にあるVMから、FQDNを使用してHDInsightクラスターへ接続できるかどうかを確認します。
<HDInsightクラスター名>.azurehdinsight.netへの接続確認
接続確認用VMにRDP接続し、PowerShellで以下のコマンドを実行します。
(Invoke-WebRequest -Uri "https://<HDInsightクラスター名>.azurehdinsight.net" -credential "<クラスターログインユーザー名>").StatusCode
HDInsightクラスター作成時に設定した認証情報を入力して[OK]を選択します。
ステータスコードが200で返されることを確認できます。
<HDInsightクラスター名>-ssh.azurehdinsight.netへの接続確認
接続用VMにRDP接続し、PowerShellで以下のコマンドを実行します。
ssh <SSHユーザー名>@<HDInsightクラスター名>-ssh.azurehdinsight.net
クラスターへの接続が成功することを確認できます。
外部からの接続
外部からインターネット経由で接続しようとすると失敗します。
- <HDInsightクラスター名>.azurehdinsight.netへの接続
- <HDInsightクラスター名>-ssh.azurehdinsight.netへの接続
おわりに
本記事では、パブリックアクセス制限時のAzure HDInsightの構成と検証内容について説明しました。
ご参考になれば幸いです。
*1:厳密には、Private Linkを有効にした場合や、特定のクラスターの種類選択時のオプションによっても変わりますが、ここでは割愛します
*2:仮想ネットワークや接続確認用のVM作成は割愛します