はじめに
Azure の VNet 内の VM などから Azure PaaS リソース (Azure Storage、SQL Database など) に対して、Azure のバックボーンネットワーク経由で直接接続する方法として、Azure 仮想ネットワークサービスエンドポイント と Azure Private Link の 2 つがあります。
これら 2 つの方法は、似ているようで挙動に違いがあります。詳細は以下ドキュメントを確認頂くとして、本記事では両者の構成や挙動がどのように違うかをストレージアカウントを例にして簡単にまとめたいと思います。
追記 (2020/9/9)
サービスエンドポイントと Private Link を 1 つのリソースで併用する方法について別記事にまとめています。よろしければこちらもご覧ください。
Azure 仮想ネットワークサービスエンドポイントと Azure Private Link の併用方法 - Qiita
構成図
上記のように 2 つのストレージアカウントを作成し、1 つにサービスエンドポイント、もう 1 つにPrivate Link を設定します。これらのストレージアカウント内のデータにはインターネット経由ではアクセスできず、VNet 内の VM からのみアクセスが可能です。
オプションですが、VM の SSH のポート (Port: 22) をインターネットに露出させないように、Azure ポータル -> Azure Bastion ホストを経由して VM にアクセスするようにします。
事前作業
事前作業として以下を実施しておきます。
- 仮想ネットワーク (VNet) & サブネット作成
- 仮想マシン (VM) 作成
- Bastion ホスト作成
- Bastion ホスト -> VM 接続確認
- VM に Azure CLI をインストール
VNet & サブネット作成
VM 作成
VMSubnet
に VM を作成します。Bastion ホスト経由でアクセスするためパブリック IP は付与していません。
Bastion ホスト作成
AzureBastionSubnet
に Bastion ホストを作成します。
Bastion ホスト -> VM 接続確認
VM の左側メニューの [Bastion] をクリックします。
VM 作成時に指定した認証の情報 (ここではユーザー名 & パスワード) を入力して VM に接続します。
以下のように Web ブラウザの別タブでターミナルが起動すれば接続 OK です。
VM に Azure CLI をインストール
この後の動作確認で使うため VM に Azure CLI をインストールします。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
挙動確認 : サービスエンドポイント
それでは、サービスエンドポイントを設定したストレージアカウントの挙動を確認していきます。
ストレージアカウント作成
ストレージアカウントの作成画面です。[基本] ページでは必要な情報を入力すれば OK です。
[ネットワーク] ページで パブリックエンドポイント (選択されたネットワーク) にチェックし、[仮想ネットワーク] に接続を許可するサブネット (ここでは VmSubnet
) を指定します。
他のページは特筆すべき点はありません。ストレージアカウントを作成します。
ストレージアカウント作成時にサービスエンドポイントで指定した VNet を見てみると以下キャプチャのようにサービスエンドポイントが追加されていることが確認できます。
名前解決
サービスエンドポイントを設定したサブネット VmSubnet
内の VM からストレージアカウントの FQDN (完全修飾ドメイン名) に対して名前解決のコマンド (nslookup
) を実行するとパブリック IP アドレスに解決されます。
VNet 外のコンピューター (手元の PC) でも同じくパブリック IP アドレスに解決されます。
(VmSubnet
の VM からの名前解決 : パブリック IP アドレスに解決される)
$ nslookup stnakazaxblobse1.blob.core.windows.net
Server:127.0.0.53
Address:127.0.0.53#53
Non-authoritative answer:
stnakazaxblobse1.blob.core.windows.netcanonical name = blob.mwh03prdstr03a.store.core.windows.net.
Name:blob.mwh03prdstr03a.store.core.windows.net
Address: 52.239.237.100
(VNet 外のコンピューターからの名前解決 : パブリック IP アドレスに解決される)
$ nslookup stnakazaxblobse1.blob.core.windows.net
Server: 172.26.192.1
Address: 172.26.192.1#53
Non-authoritative answer:
stnakazaxblobse1.blob.core.windows.net canonical name = blob.mwh03prdstr03a.store.core.windows.net.
Name: blob.mwh03prdstr03a.store.core.windows.net
Address: 52.239.237.100
Azure ポータルでの操作
サービスエンドポイントを設定したストレージアカウントに対して、Azure ポータルからコンテナーの作成、一覧表示、削除等の操作を行うことはできます。ただ、コンテナー内のデータを表示しようとすると権限不足のメッセージが表示されます。
(コンテナー内のデータを見ようとすると権限不足のメッセージが表示される)
Azure CLI での操作
サービスエンドポイントを設定したサブネット VmSubnet
内の VM から、ストレージアカウントのコンテナーへのファイルアップロード、ファイルの一覧表示のコマンドは成功します。
一方、VNet 外のコンピューター (手元の PC) から同様のコマンドを実行するとエラーメッセージが出力され、失敗します。
(VmSubnet
の VM からのファイルのアップロード : 成功)
$ az storage blob upload \
> --file example1.txt \
> --name example1.txt \
> --account-name stnakazaxblobse1 \
> --container-name test-container \
> --account-key xxx
Finished[#############################################################] 100.0000%
{
"etag": "\"0x8D85029187541FC\"",
"lastModified": "2020-09-03T16:47:50+00:00"
}
(VmSubnet
の VM からのファイルの一覧表示 : 成功)
$ az storage blob list \
> --account-name stnakazaxblobse1 \
> --container-name test-container \
> --account-key xxx
[
{
"container": "test-container",
(省略)
"versionId": null
}
]
(VNet 外のコンピューターからのファイルの一覧表示 : 失敗)
$ az storage blob list \
> --account-name stnakazaxblobse1 \
> --container-name test-container \
> --account-key xxx
The request may be blocked by network rules of storage account. Please check network rule set using 'az storage account show -n accountname --query networkRuleSet'.
If you want to change the default action to apply when no rule matches, please use 'az storage account update'.
挙動確認 : Private Link
次に、Private Link を設定したストレージアカウントの挙動を確認していきます。
ストレージアカウント作成
ストレージアカウントの作成画面です。[基本ページ] では必要な情報を入力すれば OK です。
[ネットワーク] ページの [接続方法] で プライベートエンドポイント にチェックし [追加] をクリックします。
プライベートエンドポイントの作成画面です。[サブネット] の下に書かれていますが、プライベートエンドポイントに対して NSG (Network Security Group) は無効であることに留意が必要です。
また、プライベートエンドポイントとプライベートに接続するには DNS レコードが必要なため、ここでは [プライベート DNS ゾーンとの統合する] で [はい] を指定します。
入力が正しいのにリソースグループ欄がエラーになることがありますが、一旦別のリソースグループを選択して [OK] を押して、再度目的のリソースグループに変更することで上手く行くと思います。
すると以下の赤枠で囲んだリソース (プライベート DNS ゾーン、ストレージアカウント、プライベートエンドポイント、ネットワークインターフェイス) が作成されます。
-
ストレージアカウント > ファイアウォールと仮想ネットワーク
-
ストレージアカウント > プライベート エンドポイント接続
-
ストレージアカウント > プライベート エンドポイント接続 > プライベート エンドポイント
-
プライベート DNS ゾーン
名前解決
VmSubnet
内の VM からストレージアカウントの FQDN (完全修飾ドメイン名) に対して名前解決のコマンド (nslookup) を実行するとプライベート IP アドレスに解決されます。
VNet 外のコンピューター (手元の PC) ではパブリック IP アドレスに解決されます。
(VmSubnet
の VM からの名前解決 : プライベート IP アドレスに解決される)
$ nslookup stnakazaxblobpl1.blob.core.windows.net
Server:127.0.0.53
Address:127.0.0.53#53
Non-authoritative answer:
stnakazaxblobpl1.blob.core.windows.netcanonical name = stnakazaxblobpl1.privatelink.blob.core.windows.net.
Name:stnakazaxblobpl1.privatelink.blob.core.windows.net
Address: 10.0.20.4
(VNet 外のコンピューターからの名前解決 : パブリック IP アドレスに解決される)
$ nslookup stnakazaxblobpl1.blob.core.windows.net
Server: 172.26.192.1
Address: 172.26.192.1#53
Non-authoritative answer:
stnakazaxblobpl1.blob.core.windows.net canonical name = stnakazaxblobpl1.privatelink.blob.core.windows.net.
stnakazaxblobpl1.privatelink.blob.core.windows.net canonical name = blob.mwh03prdstr02a.store.core.windows.net.
Name: blob.mwh03prdstr02a.store.core.windows.net
Address: 52.239.237.36
Azure ポータルでの操作
Private Link を設定したストレージアカウントに対して、Azure ポータルからコンテナーの作成、一覧表示、削除等の操作を行うことはできます。ただ、コンテナー内のデータを表示しようとすると権限不足のメッセージが表示されます。
(サービスエンドポイントとほぼ同じ内容のためキャプチャ省略)
Azure CLI での操作
VmSubnet
内の VM から、ストレージアカウントのコンテナーへのファイルアップロード、ファイルの一覧表示のコマンドは成功します。
一方、VNet 外のコンピューター (手元の PC) から同様のコマンドを実行するとエラーメッセージが出力され、失敗します。
(VmSubnet
の VM からのファイルのアップロード : 成功)
$ az storage blob upload \
> --file example1.txt \
> --name example1.txt \
> --account-name stnakazaxblobpl1 \
> --container-name test-container \
> --account-key xxx
Finished[#############################################################] 100.0000%
{
"etag": "\"0x8D8502F35AAE20E\"",
"lastModified": "2020-09-03T17:31:36+00:00"
}
(VmSubnet
の VM からのファイルの一覧表示 : 成功)
$ az storage blob list \
> --account-name stnakazaxblobpl1 \
> --container-name test-container \
> --account-key xxx
[
{
"container": "test-container",
(省略)
"versionId": null
}
]
(VNet 外のコンピューターからのファイルの一覧表示 : 失敗)
$ az storage blob list \
> --account-name stnakazaxblobpl1 \
> --container-name test-container \
> --account-key xxx
The request may be blocked by network rules of storage account. Please check network rule set using 'az storage account show -n accountname --query networkRuleSet'.
If you want to change the default action to apply when no rule matches, please use 'az storage account update'.
以上です。