サービス プリンシパル名を使用して、異なるサブスクリプションの仮想ネットワークを接続する
ユーザー アカウントやゲスト アカウントを使用せずに、異なるサブスクリプションの仮想ネットワークに接続する必要があるシナリオが存在します。 この仮想ネットワークの方法では、異なるサブスクリプションのサービス プリンシパル名 (SPN) を使用して 2 つの仮想ネットワークをピアリングする方法について説明します。 異なるサブスクリプション内の仮想ネットワークと Microsoft Entra ID テナント間の仮想ネットワーク ピアリングは、Azure CLI または PowerShell を使用してピアリングする必要があります。 現在、Azure portal には、異なるサブスクリプション内の SPN と仮想ネットワークをピアリングするオプションはありません。
前提条件
2 つのアクティブなサブスクリプションと 2 つの Microsoft Entra ID テナントを持つ Azure アカウント。 無料でアカウントを作成できます。
サービス プリンシパルを作成し、アプリのアクセス許可を割り当て、各サブスクリプションに関連付けられている Microsoft Entra ID テナントにリソースを作成するためのアカウント アクセス許可。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この操作方法に関する記事では、Azure CLI のバージョン 2.31.0 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
使用済みのリソース
SPN | リソース グループ | サブスクリプション/テナント | 仮想ネットワーク | 場所 |
---|---|---|---|---|
spn-1-peer-vnet | test-rg-1 | subscription-1 | vnet-1 | 米国東部 2 |
spn-2-peer-vnet | test-rg-2 | subscription-2 | vnet-2 | 米国西部 2 |
subscription-1 リソースを作成する
az sign-in を使用して、subscription-1 に関連付けられた Microsoft Entra ID テナントにリソース グループ、仮想ネットワーク、SPN を作成するアクセス許可を持つユーザー アカウントで subscription-1 にサインインします。
az login
az group create を使用して、リソース グループを作成します。
az group create \ --name test-rg-1 \ --location eastus2
az network vnet create を使用して、subscription-1 に vnet-1 という名前の仮想ネットワークを作成します。
az network vnet create \ --resource-group test-rg-1 \ --location eastus2 \ --name vnet-1 \ --address-prefixes 10.0.0.0/16 \ --subnet-name subnet-1 \ --subnet-prefixes 10.0.0.0/24
spn-1-peer-vnet を作成する
前の手順で作成した仮想ネットワークへのスコープを持つ spn1-peer-vnet を作成します。 この SPN は、仮想ネットワーク ピアを許可するために、今後の手順で vnet-2 のスコープに追加されます。
az network vnet show を使用して、前に作成した仮想ネットワークのリソース ID を、後の手順で使用するために変数に配置します。
vnetid=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
az ad sp create-for-rbac を使用して、仮想ネットワーク vnet-1 にスコープ指定されたネットワーク共同作成者のロールを持つ spn-1-peer-vnet を作成します。
az ad sp create-for-rbac \ --name spn-1-peer-vnet \ --role "Network Contributor" \ --scope $vnetid
このステップでの作成の出力をメモします。 この出力には、パスワードのみが表示されます。 後のサインイン手順で使用するので、パスワードをコピーしておきます。
{ "appId": "11112222-bbbb-3333-cccc-4444dddd5555", "displayName": "spn-1-peer-vnet", "password": "", "tenant": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" }
サービス プリンシパルの appId は、以降の手順で SPN の構成を完了するために使用されます。 az ad sp list を使用して、後で使用するために SPN の appId を変数に配置します。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
前の手順で作成した SPN には、認証プロセスの承認を完了するためのリダイレクト URI が必要であり、マルチテナント使用に変換する必要があります。 az ad app update を使用して、リダイレクト URI として https://www.microsoft.com を追加し、spn-1-peer-vnet でマルチテナントを有効にします。
az ad app update \ --id $appid1 \ --sign-in-audience AzureADMultipleOrgs \ --web-redirect-uris https://www.microsoft.com
サービス プリンシパルには、ディレクトリへの User.Read アクセス許可が必要です。 az ad app permission add と az ad app permission grant を使用して、User.Read の Microsoft Graph アクセス許可をサービス プリンシパルに追加します。
az ad app permission add \ --id $appid1 \ --api 00000003-0000-0000-c000-000000000000 \ --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope az ad app permission grant \ --id $appid1 \ --api 00000003-0000-0000-c000-000000000000 \ --scope User.Read
subscription-2 リソースを作成する
az login を使用して、subscription-2 に関連付けられた Microsoft Entra ID テナントにリソース グループ、仮想ネットワーク、SPN を作成するアクセス許可を持つユーザー アカウントで subscription-2 にサインインします。
az login
az group create を使用して、リソース グループを作成します。
az group create \ --name test-rg-2 \ --location westus2
az network vnet create を使用して、subscription-2 に vnet-2 という名前の仮想ネットワークを作成します。
az network vnet create \ --resource-group test-rg-2 \ --location westus2 \ --name vnet-2 \ --address-prefixes 10.1.0.0/16 \ --subnet-name subnet-1 \ --subnet-prefixes 10.1.0.0/24
spn-2-peer-vnet を作成する
前の手順で作成した仮想ネットワークへのスコープを持つ spn2-peer-vnet を作成します。 この SPN は、仮想ネットワーク ピアを許可するために、今後の手順で vnet-2 のスコープに追加されます。
az network vnet show を使用して、前に作成した仮想ネットワークのリソース ID を、後の手順で使用するために変数に配置します。
vnetid=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
az ad sp create-for-rbac を使用して、仮想ネットワーク vnet-2 にスコープ指定されたネットワーク共同作成者のロールを持つ spn-2-peer-vnet を作成します。
az ad sp create-for-rbac \ --name spn-2-peer-vnet \ --role "Network Contributor" \ --scope $vnetid
このステップでの作成の出力をメモします。 後のサインイン手順で使用するので、パスワードをコピーしておきます。 パスワードは再び表示されません。
出力は次の出力のようになります。
{ "appId": "22223333-cccc-4444-dddd-5555eeee6666", "displayName": "spn-2-peer-vnet", "password": "", "tenant": "bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f" }
サービス プリンシパルの appId は、以降の手順で SPN の構成を完了するために使用されます。 az ad sp list を使用して、後で使用するために SPN の ID を変数に配置します。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv)
前の手順で作成した SPN には、認証プロセスの承認を完了するためのリダイレクト URI が必要であり、マルチテナント使用に変換する必要があります。 az ad app update を使用して、リダイレクト URI として https://www.microsoft.com を追加し、spn-2-peer-vnet でマルチテナントを有効にします。
az ad app update \ --id $appid2 \ --sign-in-audience AzureADMultipleOrgs \ --web-redirect-uris https://www.microsoft.com
サービス プリンシパルには、ディレクトリへの User.Read アクセス許可が必要です。 az ad app permission add と az ad app permission grant を使用して、User.Read の Microsoft Graph アクセス許可をサービス プリンシパルに追加します。
az ad app permission add \ --id $appid2 \ --api 00000003-0000-0000-c000-000000000000 \ --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope az ad app permission grant \ --id $appid2 \ --api 00000003-0000-0000-c000-000000000000 \ --scope User.Read
subscription-1 に spn-2-peer-vnet を登録し、vnet-1 にアクセス許可を割り当てる
Microsoft Entra ID テナントの管理者アクセス許可を持つユーザー アカウントは、spn-2-vnet-peer を subscription-1 に追加するプロセスを完了する必要があります。 完了すると、spn-2-vnet-peer に、vnet-1 へのアクセス許可を割り当てることができます。
subscription-1 に spn-2-peer-vnet アプリを登録する
subscription-1 Microsoft Entra ID テナントの管理者は、仮想ネットワーク vnet-1 に追加できるように、サービス プリンシパル spn-2-peer-vnet を承認する必要があります。 次のコマンドを使用して、subscription-2 にサインインし、spn-2-peer-vnet の appID を見つけます。
az login を使用して subscription-2 にサインインします。
az login
az ad sp list を使用して、spn-2-peer-vnet の appId を取得します。 出力内の appID をメモします。 この appID は、後の手順の認証 URL で使用されます。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv) echo $appid2
spn-2-peer-vnet の appid と、subscription-1 の Microsoft Entra ID テナント ID を使用して、承認用のサインイン URL を作成します。 URL は、次の例から構築されます。
https://login.microsoftonline.com/entra-tenant-id-subscription-1/oauth2/authorize?client_id={$appid2}&response_type=code&redirect_uri=https://www.microsoft.com
URL は次の例のようになります。
https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/oauth2/authorize?client_id=22223333-cccc-4444-dddd-5555eeee6666&response_type=code&redirect_uri=https://www.microsoft.com
Web ブラウザーで URL を開き、subscription-1 の Microsoft Entra ID テナントの管理者でサインインします。
アプリケーション spn-2-peer-vnet を承認します。 認証が成功すると、microsoft.com ホームページが表示されます。
vnet-1 に spn-2-peer-vnet を割り当てる
管理者が spn-2-peer-vnet を承認した後、ネットワーク共同作成者として仮想ネットワーク vnet-1 に追加します。
az login を使用して、subscription-1 にサインインします。
az login
az ad sp list を使用して、spn-2-peer-vnet の appId を検索し、後で使用するために変数に配置します。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv)
az network vnet show を使用して、vnet-1 のリソース ID を取得し、後の手順で使用するために変数に配置します。
vnetid=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
次のコマンド az role assignment create を使用して、ネットワーク共同作成者として spn-2-peer-vnet を vnet-1 に追加します。
az role assignment create --assignee $appid2 \ --role "Network Contributor" \ --scope $vnetid
subscription-2 に spn-1-peer-vnet を登録し、vnet-2 にアクセス許可を割り当てる
Microsoft Entra ID テナントの管理者アクセス許可を持つユーザー アカウントは、spn-1-peer-vnet を subscription-2 に追加するプロセスを完了する必要があります。 完了すると、spn-1-peer-vnet に、vnet-2 へのアクセス許可を割り当てることができます。
subscription-2 に spn-1-peer-vnet アプリを登録する
subscription-2 Microsoft Entra ID テナントの管理者は、仮想ネットワーク vnet-2 に追加できるように、サービス プリンシパル spn-1-peer-vnet を承認する必要があります。 次のコマンドを使用して、subscription-1 にサインインし、spn-1-peer-vnet の appID を見つけます。
az login を使用して、subscription-1 にサインインします。
az login
az ad sp list を使用して、spn-1-peer-vnet の appId を取得します。 出力内の appID をメモします。 この appID は、後の手順の認証 URL で使用されます。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv) echo $appid1
spn-1-peer-vnet の appid と、subscription-2 の Microsoft Entra ID テナント ID を使用して、承認用のサインイン URL を作成します。 URL は、次の例から構築されます。
https://login.microsoftonline.com/entra-tenant-id-subscription-2/oauth2/authorize?client_id={$appid1}&response_type=code&redirect_uri=https://www.microsoft.com
URL は次の例のようになります。
https://login.microsoftonline.com/bbbbcccc-1111-dddd-2222-eeee3333ffff/oauth2/authorize?client_id=11112222-bbbb-3333-cccc-4444dddd5555&response_type=code&redirect_uri=https://www.microsoft.com
Web ブラウザーで URL を開き、subscription-2 の Microsoft Entra ID テナントの管理者でサインインします。
アプリケーション spn-1-peer-vnet を承認します。 認証が成功すると、microsoft.com ホームページが表示されます。
vnet-2 に spn-1-peer-vnet を割り当てる
管理者が spn-1-peer-vnet を承認した後、ネットワーク共同作成者として仮想ネットワーク vnet-2 に追加します。
az login を使用して subscription-2 にサインインします。
az login
az ad sp list を使用して、spn-1-peer-vnet の appId を検索し、後で使用するために変数に配置します。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
az network vnet show を使用して、vnet-2 のリソース ID を取得し、後の手順で使用するために変数に配置します。
vnetid=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
az role assignment create を使用して、ネットワーク共同作成者として spn-1-peer-vnet を vnet-2 に追加します。
az role assignment create --assignee $appid1 \ --role "Network Contributor" \ --scope $vnetid
vnet-1 を vnet-2 にピアリングし、vnet-2 を vnet-1 にピアリングする
vnet-1 を vnet-2 にピアリングするには、サービス プリンシパルの appId とパスワードを使用して、subscription-1 に関連付けられている Microsoft Entra ID テナントにサインインします。
spn-1-peer-vnet と spn-2-peer-vnet の appId を取得する
この記事では、各サブスクリプションにサインインし、各 SPN の appID と各仮想ネットワークのリソース ID を取得します。 これらの値を使用して、後の手順で SPN を使用して各サブスクリプションにサインインします。 双方に SPN の appID と仮想ネットワークのリソース ID が既にある場合、仮想ネットワークをピアリングするためにこれらの手順は必要ありません。
az login を使用して、通常のユーザー アカウントで subscription-1 にサインインします。
az login
az network vnet show を使用して、vnet-1 のリソース ID を取得し、後の手順で使用するために変数に配置します。
vnetid1=$(az network vnet show \ --resource-group test-rg-1 \ --name vnet-1 \ --query id \ --output tsv)
az ad sp list を使用して、spn-1-peer-vnet の appId を取得し、後の手順で使用するために変数に配置します。
appid1=$(az ad sp list \ --display-name spn-1-peer-vnet \ --query [].appId \ --output tsv)
az login を使用して、通常のユーザー アカウントで subscription-2 にサインインします。
az login
az network vnet show を使用して、vnet-2 のリソース ID を取得し、後の手順で使用するために変数に配置します。
vnetid2=$(az network vnet show \ --resource-group test-rg-2 \ --name vnet-2 \ --query id \ --output tsv)
az ad sp list を使用して、spn-2-peer-vnet の appId を取得し、後の手順で使用するために変数に配置します。
appid2=$(az ad sp list \ --display-name spn-2-peer-vnet \ --query [].appId \ --output tsv) echo $appid2
次の az logout コマンドを使用して、Azure CLI セッションからサインアウトします。 ターミナルは閉じないでください。
az logout
仮想ネットワークをピアリングする
az login を使用して、spn-1-peer-vnet で subscription-1 にサインインします。 コマンドを完了するには、subscription-1 に関連付けられている Microsoft Entra ID テナントのテナント ID が必要です。 パスワードは、変数プレースホルダーを使用して例に示されています。 リソースの作成時にメモしたパスワードに置き換えます。
--tenant
のプレースホルダーを、subscription-1 に関連付けられている Microsoft Entra ID テナントのテナント ID に置き換えます。az login \ --service-principal \ --username $appid1 \ --password $password \ --tenant aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
az login を使用して、spn-2-peer-vnet で subscription-2 にサインインします。 コマンドを完了するには、subscription-2 に関連付けられている Microsoft Entra ID テナントのテナント ID が必要です。 パスワードは、変数プレースホルダーを使用して例に示されています。 リソースの作成時にメモしたパスワードに置き換えます。
--tenant
のプレースホルダーを、subscription-2 に関連付けられている Microsoft Entra ID テナントのテナント ID に置き換えます。az login \ --service-principal \ --username $appid2 \ --password $password \ --tenant bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f
az account set を使用して、コンテキストを subscription-1 に変更します。
az account set --subscription "subscription-1-subscription-id-NOT-ENTRA-TENANT-ID"
az network vnet peering create を使用して、vnet-1 と vnet-2 の間に仮想ネットワーク ピアリングを作成します。
az network vnet peering create \ --name vnet-1-to-vnet-2 \ --resource-group test-rg-1 \ --vnet-name vnet-1 \ --remote-vnet $vnetid2 \ --allow-vnet-access
az network vnet peering list を使用して、vnet-1 と vnet-2 の間の仮想ネットワーク ピアリングを検証します。
az network vnet peering list \ --resource-group test-rg-1 \ --vnet-name vnet-1 \ --output table
az account set を使用して、コンテキストを subscription-2 に変更します。
az account set --subscription "subscription-2-subscription-id-NOT-ENTRA-TENANT-ID"
az network vnet peering create を使用して、vnet-2 と vnet-1 の間に仮想ネットワーク ピアリングを作成します。
az network vnet peering create \ --name vnet-2-to-vnet-1 \ --resource-group test-rg-2 \ --vnet-name vnet-2 \ --remote-vnet $vnetid1 \ --allow-vnet-access
az network vnet peering list を使用して、vnet-2 と vnet-1 の間の仮想ネットワーク ピアリングを検証します。
az network vnet peering list \ --resource-group test-rg-2 \ --vnet-name vnet-2 \ --output table