仮想ネットワーク内のバックエンド ストレージに対するプライベート ネットワーク アクセスを構成する
Note
Basic、Standard、Enterprise プランは、2025 年 3 月中旬以降非推奨になり、廃止期間は 3 年間です。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の廃止のお知らせ」を参照してください。
Standard 従量課金と専用プランは、2024 年 9 月 30 日以降に非推奨になり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金および専用プランを Azure Container Apps に移行する」を参照してください。
この記事の適用対象:✅ Standard ✅ Enterprise
この記事では、仮想ネットワーク内のアプリケーション用バックエンド ストレージへのプライベート ネットワーク アクセスを構成する方法について説明します。
仮想ネットワーク インジェクションを使用して Azure Spring Apps サービス インスタンスにアプリケーションがデプロイされた場合、そのサービス インスタンスでは、バックエンド ストレージを使用して JAR ファイルやログなど、関連する資産を格納します。 このバックエンド ストレージへのトラフィックのルーティングは、既定の構成ではパブリック ネットワーク経由で行われますが、プライベート ストレージ アクセス機能を有効にすることもできます。 この機能を使用すると、プライベート ネットワーク経由でトラフィックを送信できるので、セキュリティが強化され、場合によってはパフォーマンスが向上します。
Note
この機能は、Azure Spring Apps 仮想ネットワークによって挿入されたサービス インスタンスにのみ適用されます。
Azure Spring Apps サービス インスタンスに対してこの機能を有効にする場合は、事前にサービス ランタイム サブネット内に少なくとも 2 つの使用可能な IP アドレスがあることを確認してください。
この機能を有効または無効にすると、それに応じてバックエンド ストレージに対する DNS 解決が変更されます。 短い時間、デプロイでは更新中に、バックエンド ストレージへの接続を確立できなかったり、それらのエンドポイントを解決できなかったりする場合があります。
この機能を有効にすると、バックエンド ストレージにはプライベートにアクセスできるだけなので、使用するアプリケーションを仮想ネットワーク内にデプロイする必要があります。
前提条件
- Azure サブスクリプション。 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Azure CLI: バージョン 2.56.0 以上。
- 仮想ネットワークにデプロイされた既存の Azure Spring Apps サービス インスタンス。 詳しくは、「仮想ネットワークに Azure Spring Apps をデプロイする」をご覧ください。
新しい Azure Spring Apps インスタンスを作成する際にプライベート ストレージ アクセスを有効にする
仮想ネットワーク内で Azure Spring Apps インスタンスを作成する場合、プライベート ストレージ アクセスを有効にするには、次のコマンドを使用して引数 --enable-private-storage-access true
を渡します。 詳しくは、「仮想ネットワークに Azure Spring Apps をデプロイする」をご覧ください。
az spring create \
--resource-group "<resource-group>" \
--name "<Azure-Spring-Apps-instance-name>" \
--vnet "<virtual-network-name>" \
--service-runtime-subnet "<service-runtime-subnet>" \
--app-subnet "<apps-subnet>" \
--location "<location>" \
--enable-private-storage-access true
Azure Spring Apps インスタンス用のプライベート リンク リソースをホストするために、リソース グループがもう 1 つ、サブスクリプション内に作成されます。 このリソース グループの名前は ap-res_{service instance name}_{service instance region}
です。
リソース グループには、プライベート リンク リソースのセットが 2 つデプロイされていて、いずれも次の Azure リソースで構成されています。
- バックエンド ストレージ アカウントのプライベート エンドポイントを表すプライベート エンドポイント。
- サービス ランタイム サブネット内にプライベート IP アドレスを保持するネットワーク インターフェイス (NIC)。
- 仮想ネットワーク用にデプロイされたプライベート DNS ゾーン。この DNS ゾーン内のストレージ アカウント用に DNS A レコードも作成されます。
重要
リソース グループは、Azure Spring Apps サービスによって完全に管理されています。 これらのリソース グループ内のリソースを手動で削除または変更しないでください。
既存の Azure Spring Apps インスタンス用のプライベート ストレージ アクセスを有効または無効にする
プライベート ストレージ アクセスを有効または無効にするには、次のコマンドを使用して、既存の Azure Spring Apps インスタンスを更新します。
az spring update \
--resource-group "<resource-group>" \
--name "<Azure-Spring-Apps-instance-name>" \
--enable-private-storage-access <true-or-false>
中央 DNS 解決を使用する
一元化された DNS 管理アーキテクチャについては、「Private Link と DNS の大規模な統合」のハブ アンド スポーク ネットワーク アーキテクチャで説明されています。 このアーキテクチャでは、すべてのプライベート DNS ゾーンが、Azure Spring Apps サービス インスタンスとは異なる中央仮想ネットワークで一元的にデプロイおよび管理されます。 このアーキテクチャを使っている場合は、DNS の設定を適切に構成すると、プライベート ストレージ アクセスに対する中央 DNS 解決を有効にできます。 このセットアップにより、次のことが保証されます。
- プライベート エンドポイントが作成されると、対応する DNS レコードが一元化されたプライベート DNS ゾーンに自動的に追加されます。
- DNS レコードは、プライベート エンドポイントのライフサイクルに従って管理されます。つまり、プライベート エンドポイントが削除されると自動的に削除されます。
以下のセクションでは、中央仮想ネットワークにプライベート DNS ゾーン privatelink.blob.core.windows.net
が既に設定されているものとして、Azure Policy を使って Azure Storage BLOB の中央 DNS 解決を有効にする方法について説明します。 Azure Storage ファイルや、Private Link をサポートする他の Azure サービスにも、同じ原則が当てはまります。
ポリシー定義
プライベート DNS ゾーンに加えて、カスタム Azure Policy 定義を作成する必要があります。 詳しくは、「チュートリアル: カスタム ポリシー定義の作成」をご覧ください。 プライベート エンドポイントを作成すると、この定義によって、中央プライベート DNS ゾーンに必要な DNS レコードが自動的に作成されます。
サービス固有の groupId
を使ってプライベート エンドポイント リソースを作成すると、次のポリシーがトリガーされます。 groupId
は、このプライベート エンドポイントが接続する必要のあるリモート リソースまたはサービスから取得したグループの ID です。 この例では、Azure Storage BLOB の groupId
は blob
です。 他の Azure サービスの groupId
について詳しくは、「Azure プライベート エンドポイントのプライベート DNS ゾーンの値」の表の「サブリソース」列をご覧ください。
次に、ポリシーは、プライベート エンドポイント内で privateDNSZoneGroup
のデプロイをトリガーします。これにより、プライベート エンドポイントと、パラメーターとして指定されたプライベート DNS ゾーンが関連付けられます。 次の例では、プライベート DNS ゾーンのリソース ID は /subscriptions/<subscription-id>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/privateDnsZones/privatelink.blob.core.windows.net
です。
{
"mode": "Indexed",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Network/privateEndpoints"
},
{
"value": "[contains(resourceGroup().name, 'ap-res_')]",
"equals": "true"
},
{
"count": {
"field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
"where": {
"field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
"equals": "blob"
}
},
"greaterOrEquals": 1
}
]
},
"then": {
"effect": "deployIfNotExists",
"details": {
"type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
"evaluationDelay": "AfterProvisioningSuccess",
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],
"deployment": {
"properties": {
"mode": "incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"privateDnsZoneId": {
"type": "string"
},
"privateEndpointName": {
"type": "string"
},
"location": {
"type": "string"
}
},
"resources": [
{
"name": "[concat(parameters('privateEndpointName'), '/deployedByPolicy')]",
"type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
"apiVersion": "2020-03-01",
"location": "[parameters('location')]",
"properties": {
"privateDnsZoneConfigs": [
{
"name": "storageBlob-privateDnsZone",
"properties": {
"privateDnsZoneId": "[parameters('privateDnsZoneId')]"
}
}
]
}
}
]
},
"parameters": {
"privateDnsZoneId": {
"value": "[parameters('privateDnsZoneId')]"
},
"privateEndpointName": {
"value": "[field('name')]"
},
"location": {
"value": "[field('location')]"
}
}
}
}
}
}
},
"parameters": {
"privateDnsZoneId": {
"type": "String",
"metadata": {
"displayName": "privateDnsZoneId",
"description": null,
"strongType": "Microsoft.Network/privateDnsZones"
}
}
}
}
ポリシー割り当て
ポリシー定義をデプロイした後、Azure Spring Apps サービスのインスタンスをホストしているサブスクリプションでポリシーを割り当て、パラメーターとして中央プライベート DNS ゾーンを指定します。
中央プライベート DNS ゾーンと Azure Spring Apps サービス インスタンスは、異なるサブスクリプションでホストされている場合があります。 その場合は、プライベート DNS ゾーン内のプライベート エンドポイント DNS レコードの作成と管理を担当する、DeployIfNotExists
ポリシーの割り当てによって作成されたマネージド ID に、プライベート DNS ゾーンがホストされているサブスクリプションとリソース グループのプライベート DNS ゾーン共同作成者ロールを必ず割り当ててください。 詳しくは、「Azure Policy を使って準拠していないリソースを修復する」の「マネージド ID を構成する」セクションをご覧ください。
構成を終えた後、プライベート ストレージ アクセス機能を有効または無効にすると、プライベート エンドポイントの DNS レコードが、対応するプライベート DNS ゾーンに自動的に登録され、プライベート エンドポイントが削除されると削除されます。
追加のコスト
Azure Spring Apps インスタンスでは、この機能に対して料金は発生しません。 ただし、この機能をサポートする、サブスクリプション内でホストされているプライベート リンク リソースに対しては料金が発生します。 詳細については、「Azure Private Link の価格」と「Azure DNS の価格」を参照してください。
カスタム DNS サーバーを使用します。
カスタム ドメイン ネーム システム (DNS) サーバーを使用していて、Azure DNS IP 168.63.129.16
がアップストリーム DNS サーバーとして構成されていない場合、プライベート IP アドレスを解決するには、リソース グループ ap-res_{service instance name}_{service instance region}
に表示されているプライベート DNS ゾーンのすべての DNS レコードを手動でバインドする必要があります。