Azure Cosmos DB アカウントの Azure Private Link を構成する

適用対象: NoSQL MongoDB Cassandra Gremlin Table

Azure Private Link を使用すると、プライベート エンドポイントを介して Azure Cosmos DB アカウントに接続できます。 プライベート エンドポイントは、仮想ネットワークのサブネットにある一組のプライベート IP アドレスです。 これで、プライベート IP アドレスを使用して Azure Cosmos DB アカウントへのアクセスを制限できるようになります。 Private Link を制限付き NSG ポリシーと結合することで、データ流出のリスクを軽減することができます。 プライベート エンドポイントの詳細については、「Azure Private Link とは」を参照してください。

Note

Azure Cosmos DB エンドポイントが、パブリック DNS で解決されることを Private Link が妨げることはありません。 受信した要求のフィルタリングは、トランスポート レベルでもネットワーク レベルでもなく、アプリケーション レベルで行われます。

Private Link を使用すると、ユーザーは仮想ネットワーク内から、またはピアリングされた任意の仮想ネットワークから Azure Cosmos DB アカウントにアクセスできます。 Private Link にマップされたリソースは、プライベート ピアリングを使用して、VPN または Azure ExpressRoute 経由でオンプレミスからアクセスすることもできます。

自動または手動の承認方法により、Private Link を使用して構成された Azure Cosmos DB アカウントに接続できます。 詳細については、Private Link のドキュメントの承認ワークフローに関するセクションを参照してください。

この記事では、Azure Cosmos DB トランザクション ストアのプライベート エンドポイントをセットアップする方法について説明します。 自動承認方法を使用していることを前提としています。 分析ストアを使用している場合は、分析ストアのプライベート エンドポイントの構成に関する記事を参照してください。

Azure portal を使用してプライベート エンドポイントを作成する

Azure portal を使用して、次の手順で既存の Azure Cosmos DB アカウント用のプライベート エンドポイントを作成します。

  1. Azure portal にサインインし、Azure Cosmos DB アカウントを選択します。

  2. 設定の一覧から [ネットワーク] を選択し、[プライベート アクセス] タブで [+ プライベート エンドポイント] を選択します。

    Azure portal でプライベート エンドポイントを作成するための選択のスクリーンショット

  3. [プライベート エンドポイントの作成 - 基本] ペインで次の詳細を入力または選択します。

    設定
    プロジェクトの詳細
    サブスクリプション サブスクリプションを選択します。
    Resource group リソース グループを選択します。
    インスタンスの詳細
    名前 プライベート エンドポイントの名前を入力します。 この名前が使用済みの場合は、一意の名前を作成します。
    リージョン Private Link をデプロイするリージョンを選択します。 仮想ネットワークが存在する場所と同じ場所にプライベート エンドポイントを作成します。
  4. [Next:リソース] を選択します。

  5. [プライベート エンドポイントの作成 - リソース] ペインで、次の情報を入力するか、または選択します。

    設定
    接続方法 [マイ ディレクトリ内の Azure リソースに接続します] を選択します。

    これで、いずれかのリソースを選択して Private Link を設定できるようになります。 または、他のユーザーがあなたと共有したリソース ID またはエイリアスを使用して、そのユーザーのリソースに接続できます。
    サブスクリプション サブスクリプションを選択します。
    リソースの種類 AzureCosmosDB/databaseAccounts を選択します。
    リソース Azure Cosmos DB アカウントを選択します。
    ターゲット サブリソース マップする Azure Cosmos DB API の種類を選択します。 既定では SQL 用 、MongoDB 用、Cassandra 用の API は、1 つしか選択できません。 Gremlin 用 と Table 用の API は、NoSQL 用 API と相互運用が可能であるため、NoSQL を選択することもできます。 NoSQL 用 API アカウント向けにプロビジョニングされた専用ゲートウェイ がある場合、SqlDedicated のオプションも表示されます。
  6. [次へ: 仮想ネットワーク] を選択します。

  7. [プライベート エンドポイントの作成 - 仮想ネットワーク] ペインで、次の情報を入力するか、または選択します。

    設定
    仮想ネットワーク 仮想ネットワークを選択します。
    Subnet サブネットを選択します。
  8. [次: DNS] を選びます。

  9. [プライベート エンドポイントの作成 - DNS] ペインで、次の情報を入力するか、または選択します。

    設定
    プライベート DNS ゾーンとの統合 [はい] を選択します。

    プライベート エンドポイントに非公開で接続するには、DNS レコードが必要です。 プライベート エンドポイントとプライベート DNS ゾーンを統合することをお勧めします。 また、独自の DNS サーバーを使用したり、仮想マシン上のホスト ファイルを使用して DNS レコードを作成したりすることもできます。

    このオプションで [はい] を選択すると、プライベート DNS ゾーン グループも作成されます。 DNS ゾーン グループは、プライベート DNS ゾーンとプライベート エンドポイント間のリンクです。 このリンクは、プライベート エンドポイントが更新されたときに、プライベート DNS ゾーンを自動更新するのに役立ちます。 たとえば、リージョンを追加または削除すると、プライベート DNS ゾーンが自動的に更新されます。
    構成名 サブスクリプションとリソース グループを選択します。

    プライベート DNS ゾーンは自動的に決定されます。 Azure portal を使用して変更することはできません。
  10. [次へ: タグ]>[確認と作成] の順に選択します。 [確認と作成] ページで、Azure によって構成が検証されます。

  11. "証に成功しました" というメッセージが表示されたら、 [作成] を選択します。

Azure Cosmos DB アカウントの Private Link を承認すると、Azure portal の [ファイアウォールと仮想ネットワーク] ペインにある [すべてのネットワーク] オプションは使用できなくなります。

API の種類とプライベート ゾーン名

プライベート ゾーンとプライベート エンドポイントの DNS 構成の詳細については、「Azure プライベート エンドポイントの DNS 構成」を参照してください。 次の表は、Azure Cosmos DB のさまざまな種類の API アカウント、サポートされているサブリソース、対応するプライベート ゾーン名間のマッピングを示しています。 NoSQL 用 API を使用して Gremlin および Table 用 API のアカウントにアクセスすることもできるため、これらの API には 2 つのエントリがあります。 専用ゲートウェイ を使用するアカウントの場合は、NoSQL 用 API の追加エントリもあります。

Azure Cosmos DB アカウント API の種類 サポートされているサブリソースまたはグループ ID プライベート ゾーン名
NoSQL Sql privatelink.documents.azure.com
NoSQL SqlDedicated privatelink.sqlx.cosmos.azure.com
Cassandra Cassandra privatelink.cassandra.cosmos.azure.com
Mongo MongoDB privatelink.mongo.cosmos.azure.com
Gremlin Gremlin privatelink.gremlin.cosmos.azure.com
Gremlin Sql privatelink.documents.azure.com
テーブル テーブル privatelink.table.cosmos.azure.com
テーブル Sql privatelink.documents.azure.com

プライベート IP アドレスを取り込む

プライベート エンドポイントがプロビジョニングされたら、IP アドレスにクエリを実行できます。 Azure portal から IP アドレスを表示するには、以下の手順に従います。

  1. 先ほど作成したプライベート エンドポイントを検索します。 この例では cdbPrivateEndpoint3 です。
  2. [概要] タブを選択して、DNS の設定と IP アドレスを表示します。

 Azure portal のプライベート IP アドレスのスクリーンショット

プライベート エンドポイントごとに複数の IP アドレスが作成されます。

  • Azure Cosmos DB アカウントのリージョンに依存しないグローバルなエンドポイント向け。
  • Azure Cosmos DB アカウントがデプロイされている各リージョン向け。

Azure PowerShell を使用してプライベート エンドポイントを作成する

次の PowerShell スクリプトを実行して、既存の Azure Cosmos DB アカウント用の MyPrivateEndpoint という名前のプライベート エンドポイントを作成します。 変数の値を実際の環境の詳細に置き換えます。

$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"

# Resource for the Azure Cosmos DB account: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin, or Table
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private endpoint to create
$PrivateEndpointName = "MyPrivateEndpoint"
# Location where the private endpoint can be created. The private endpoint should be created in the same location where your subnet or the virtual network exists
$Location = "westcentralus"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"

$privateEndpointConnection = New-AzPrivateLinkServiceConnection -Name "myConnectionPS" -PrivateLinkServiceId $cosmosDbResourceId -GroupId $CosmosDbSubResourceType
 
$virtualNetwork = Get-AzVirtualNetwork -ResourceGroupName  $ResourceGroupName -Name $VNetName  
 
$subnet = $virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq $SubnetName}  
 
$privateEndpoint = New-AzPrivateEndpoint -ResourceGroupName $ResourceGroupName -Name $PrivateEndpointName -Location $Location -Subnet  $subnet -PrivateLinkServiceConnection $privateEndpointConnection

プライベート エンドポイントとプライベート DNS ゾーンを統合する

プライベート エンドポイントを作成した後は、次の PowerShell スクリプトを使用して、プライベート DNS ゾーンと統合できます。

Import-Module Az.PrivateDns

# Zone name differs based on the API type and group ID you are using. 
$zoneName = "privatelink.documents.azure.com"
$zone = New-AzPrivateDnsZone -ResourceGroupName $ResourceGroupName `
  -Name $zoneName

$link  = New-AzPrivateDnsVirtualNetworkLink -ResourceGroupName $ResourceGroupName `
  -ZoneName $zoneName `
  -Name "myzonelink" `
  -VirtualNetworkId $virtualNetwork.Id  
 
$pe = Get-AzPrivateEndpoint -Name $PrivateEndpointName `
  -ResourceGroupName $ResourceGroupName

$networkInterface = Get-AzResource -ResourceId $pe.NetworkInterfaces[0].Id `
  -ApiVersion "2019-04-01"

# Create DNS configuration

$PrivateDnsZoneId = $zone.ResourceId

$config = New-AzPrivateDnsZoneConfig -Name $zoneName `
 -PrivateDnsZoneId $PrivateDnsZoneId

## Create a DNS zone group
New-AzPrivateDnsZoneGroup -ResourceGroupName $ResourceGroupName `
 -PrivateEndpointName $PrivateEndpointName `
 -Name "MyPrivateZoneGroup" `
 -PrivateDnsZoneConfig $config

プライベート IP アドレスを取り込む

プライベート エンドポイントがプロビジョニングされたら、次の PowerShell スクリプトを使用して、IP アドレスと FQDN のマッピングにクエリを実行できます。

$pe = Get-AzPrivateEndpoint -Name MyPrivateEndpoint -ResourceGroupName myResourceGroup
$networkInterface = Get-AzNetworkInterface -ResourceId $pe.NetworkInterfaces[0].Id
foreach ($IPConfiguration in $networkInterface.IpConfigurations)
{
    Write-Host $IPConfiguration.PrivateIpAddress ":" $IPConfiguration.PrivateLinkConnectionProperties.Fqdns
}

Azure CLI を使用してプライベート エンドポイントを作成する

次の Azure CLI スクリプトを実行して、既存の Azure Cosmos DB アカウント用の myPrivateEndpoint という名前のプライベート エンドポイントを作成します。 変数の値を実際の環境の詳細に置き換えます。

# Resource group where the Azure Cosmos DB account and virtual network resources are located
ResourceGroupName="myResourceGroup"

# Subscription ID where the Azure Cosmos DB account and virtual network resources are located
SubscriptionId="<your Azure subscription ID>"

# Name of the existing Azure Cosmos DB account
CosmosDbAccountName="mycosmosaccount"

# API type of your Azure Cosmos DB account: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin, or Table
CosmosDbSubResourceType="Sql"

# Name of the virtual network to create
VNetName="myVnet"

# Name of the subnet to create
SubnetName="mySubnet"

# Name of the private endpoint to create
PrivateEndpointName="myPrivateEndpoint"

# Name of the private endpoint connection to create
PrivateConnectionName="myConnection"

az network vnet create \
 --name $VNetName \
 --resource-group $ResourceGroupName \
 --subnet-name $SubnetName

az network vnet subnet update \
 --name $SubnetName \
 --resource-group $ResourceGroupName \
 --vnet-name $VNetName \
 --disable-private-endpoint-network-policies true

az network private-endpoint create \
    --name $PrivateEndpointName \
    --resource-group $ResourceGroupName \
    --vnet-name $VNetName  \
    --subnet $SubnetName \
    --private-connection-resource-id "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.DocumentDB/databaseAccounts/$CosmosDbAccountName" \
    --group-ids $CosmosDbSubResourceType \
    --connection-name $PrivateConnectionName

プライベート エンドポイントとプライベート DNS ゾーンを統合する

プライベート エンドポイントを作成した後は、次の Azure CLI スクリプトを使用して、プライベート DNS ゾーンと統合できます。

#Zone name differs based on the API type and group ID you are using. 
zoneName="privatelink.documents.azure.com"

az network private-dns zone create --resource-group $ResourceGroupName \
   --name  $zoneName

az network private-dns link vnet create --resource-group $ResourceGroupName \
   --zone-name  $zoneName\
   --name myzonelink \
   --virtual-network $VNetName \
   --registration-enabled false 

#Create a DNS zone group
az network private-endpoint dns-zone-group create \
   --resource-group $ResourceGroupName \
   --endpoint-name $PrivateEndpointName \
   --name "MyPrivateZoneGroup" \
   --private-dns-zone $zoneName \
   --zone-name "myzone"

Resource Manager テンプレートを使用してプライベート エンドポイントを作成する

Private Link を設定するには、仮想ネットワーク サブネットにプライベート エンドポイントを作成します。 これを実現するには、Azure Resource Manager テンプレートを使用します。

次のコードを使用して、PrivateEndpoint_template.json という名前の Resource Manager テンプレートを作成します。 このテンプレートでは、既存の仮想ネットワーク内にある既存の Azure Cosmos DB vAPI for NoSQL アカウント用のプライベート エンドポイントを作成します。

@description('Location for all resources.')
param location string = resourceGroup().location
param privateEndpointName string
param resourceId string
param groupId string
param subnetId string

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2019-04-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: subnetId
    }
    privateLinkServiceConnections: [
      {
        name: 'MyConnection'
        properties: {
          privateLinkServiceId: resourceId
          groupIds: [
            groupId
          ]
          requestMessage: ''
        }
      }
    ]
  }
}

output privateEndpointNetworkInterface string = privateEndpoint.properties.networkInterfaces[0].id

テンプレートのパラメーター ファイルを定義する

テンプレートのパラメーター ファイルを作成し、PrivateEndpoint_parameters.json という名前を付けます。 次のコードをパラメーター ファイルに追加します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateEndpointName": {
            "value": ""
        },
        "resourceId": {
            "value": ""
        },
        "groupId": {
            "value": ""
        },
        "subnetId": {
            "value": ""
        }
    }
}

PowerShell スクリプトを使用してテンプレートをデプロイする

次のコードを使用して、PowerShell スクリプトを作成します。 スクリプトを実行する前に、サブスクリプション ID、リソース グループ名、その他の変数値を実際の環境の詳細に置き換えます。

### This script creates a private endpoint for an existing Azure Cosmos DB account in an existing virtual network

## Step 1: Fill in these details. Replace the variable values with the details for your environment.
$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"
# API type of the Azure Cosmos DB account. It can be one of the following: "Sql", "SqlDedicated", "MongoDB", "Cassandra", "Gremlin", "Table"
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private endpoint to create
$PrivateEndpointName = "myPrivateEndpoint"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"
$VNetResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Network/virtualNetworks/$($VNetName)"
$SubnetResourceId = "$($VNetResourceId)/subnets/$($SubnetName)"
$PrivateEndpointTemplateFilePath = "PrivateEndpoint_template.json"
$PrivateEndpointParametersFilePath = "PrivateEndpoint_parameters.json"

## Step 2: Sign in to your Azure account and select the target subscription.
Login-AzAccount
Select-AzSubscription -SubscriptionId $subscriptionId

## Step 3: Make sure private endpoint network policies are disabled in the subnet.
$VirtualNetwork= Get-AzVirtualNetwork -Name "$VNetName" -ResourceGroupName "$ResourceGroupName"
($virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq "$SubnetName"} ).PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork | Set-AzVirtualNetwork

## Step 4: Create the private endpoint.
Write-Output "Deploying private endpoint on $($resourceGroupName)"
$deploymentOutput = New-AzResourceGroupDeployment -Name "PrivateCosmosDbEndpointDeployment" `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $PrivateEndpointTemplateFilePath `
    -TemplateParameterFile $PrivateEndpointParametersFilePath `
    -SubnetId $SubnetResourceId `
    -ResourceId $CosmosDbResourceId `
    -GroupId $CosmosDbSubResourceType `
    -PrivateEndpointName $PrivateEndpointName

$deploymentOutput

PowerShell スクリプトでは、GroupId 変数に 1 つの値のみを含めることができます。 この値は、アカウントの API の種類です。 使用できる値は、SqlSqlDedicatedMongoDBCassandraGremlinTable です。 一部の Azure Cosmos DB アカウントの種類は、複数の API を使用してアクセスできます。 次に例を示します。

  • NoSQL 用 API アカウントには、専用ゲートウェイ を使用するように構成されたアカウントのオプションが追加されています。
  • Gremlin 用 API アカウントには、Gremlin アカウントと NoSQL 用 API アカウントの両方からアクセスできます。
  • Table 用 API アカウントには、Table アカウントと NoSQL 用 API アカウントの両方からアクセスできます。

これらのアカウントについては、API の種類ごとに 1 つのプライベート エンドポイントを作成する必要があります。 SqlDedicated のプライベート エンドポイントを作成する場合、標準ゲートウェイを使用してアカウントに接続する場合は Sql の 2 つ目のエンドポイントを追加するだけで済みます。 対応する API の種類は GroupId 配列に指定されています。

テンプレートが正常にデプロイされると、次の図に示すような出力が表示されます。 プライベート エンドポイントが正しく設定されている場合、provisioningState 値は Succeeded です。

Resource Manager テンプレートのデプロイ出力のスクリーンショット。

テンプレートがデプロイされると、プライベート IP アドレスがサブネット内で予約されます。 Azure Cosmos DB アカウントのファイアウォール規則は、プライベート エンドポイントからの接続のみを受け入れるように構成されています。

プライベート エンドポイントとプライベート DNS ゾーンを統合する

次のコードを使用して、PrivateZone_template.json という名前の Resource Manager テンプレートを作成します。 このテンプレートでは、既存の仮想ネットワーク内にある既存の Azure Cosmos DB の NoSQL 用 API アカウントの DNS ゾーンを作成します。

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "type": "string"
        },
        "VNetId": {
            "type": "string"
        }        
    },
    "resources": [
        {
            "name": "[parameters('privateZoneName')]",
            "type": "Microsoft.Network/privateDnsZones",
            "apiVersion": "2018-09-01",
            "location": "global",
            "properties": {                
            }
        },
        {
            "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
            "apiVersion": "2018-09-01",
            "name": "[concat(parameters('privateZoneName'), '/myvnetlink')]",
            "location": "global",
            "dependsOn": [
                "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]"
            ],
            "properties": {
                "registrationEnabled": false,
                "virtualNetwork": {
                    "id": "[parameters('VNetId')]"
                }
            }
        }        
    ]
}

テンプレートのパラメーター ファイルを定義する

次の 2 つのパラメーター ファイルをテンプレートに作成します。 次のコードを使用して、PrivateZone_parameters.json を作成します。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "value": ""
        },
        "VNetId": {
            "value": ""
        }
    }
}

次のコードを使用して、PrivateZoneGroup_template.json という名前の Resource Manager テンプレートを作成します。 このテンプレートでは、既存の仮想ネットワーク内にある既存の Azure Cosmos DB の NoSQL 用 API アカウントのプライベート DNS ゾーン グループを作成します。

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "type": "string"
        },
        "PrivateEndpointDnsGroupName": {
            "value": "string"
        },
        "privateEndpointName":{
            "value": "string"
        }        
    },
    "resources": [
        {
            "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
            "apiVersion": "2020-06-01",
            "name": "[parameters('PrivateEndpointDnsGroupName')]",
            "location": "global",
            "dependsOn": [
                "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]",
                "[variables('privateEndpointName')]"
            ],
          "properties": {
            "privateDnsZoneConfigs": [
              {
                "name": "config1",
                "properties": {
                  "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]"
                }
              }
            ]
          }
        }
    ]
}

テンプレートのパラメーター ファイルを定義する

次の 2 つのパラメーター ファイルをテンプレートに作成します。 PrivateZoneGroup_parameters.json を作成します。 を、以下のコードに置き換えます。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "value": ""
        },
        "PrivateEndpointDnsGroupName": {
            "value": ""
        },
        "privateEndpointName":{
            "value": ""
        }
    }
}

PowerShell スクリプトを使用してテンプレートをデプロイする

次のコードを使用して、PowerShell スクリプトを作成します。 スクリプトを実行する前に、サブスクリプション ID、リソース グループ名、その他の変数値を実際の環境の詳細に置き換えます。

### This script:
### - creates a private zone
### - creates a private endpoint for an existing Azure Cosmos DB account in an existing VNet
### - maps the private endpoint to the private zone

## Step 1: Fill in these details. Replace the variable values with the details for your environment.
$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"
# API type of the Azure Cosmos DB account. It can be one of the following: "Sql", "SqlDedicated", "MongoDB", "Cassandra", "Gremlin", "Table"
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private zone to create
$PrivateZoneName = "myPrivateZone.documents.azure.com"
# Name of the private endpoint to create
$PrivateEndpointName = "myPrivateEndpoint"

# Name of the DNS zone group to create
$PrivateEndpointDnsGroupName = "myPrivateDNSZoneGroup"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"
$VNetResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Network/virtualNetworks/$($VNetName)"
$SubnetResourceId = "$($VNetResourceId)/subnets/$($SubnetName)"
$PrivateZoneTemplateFilePath = "PrivateZone_template.json"
$PrivateZoneParametersFilePath = "PrivateZone_parameters.json"
$PrivateEndpointTemplateFilePath = "PrivateEndpoint_template.json"
$PrivateEndpointParametersFilePath = "PrivateEndpoint_parameters.json"
$PrivateZoneGroupTemplateFilePath = "PrivateZoneGroup_template.json"
$PrivateZoneGroupParametersFilePath = "PrivateZoneGroup_parameters.json"

## Step 2: Login your Azure account and select the target subscription
Login-AzAccount 
Select-AzSubscription -SubscriptionId $subscriptionId

## Step 3: Make sure private endpoint network policies are disabled in the subnet
$VirtualNetwork= Get-AzVirtualNetwork -Name "$VNetName" -ResourceGroupName "$ResourceGroupName"
($virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq "$SubnetName"} ).PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork | Set-AzVirtualNetwork

## Step 4: Create the private zone
New-AzResourceGroupDeployment -Name "PrivateZoneDeployment" `
    -ResourceGroupName $ResourceGroupName `
    -TemplateFile $PrivateZoneTemplateFilePath `
    -TemplateParameterFile $PrivateZoneParametersFilePath `
    -PrivateZoneName $PrivateZoneName `
    -VNetId $VNetResourceId

## Step 5: Create the private endpoint
Write-Output "Deploying private endpoint on $($resourceGroupName)"
$deploymentOutput = New-AzResourceGroupDeployment -Name "PrivateCosmosDbEndpointDeployment" `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $PrivateEndpointTemplateFilePath `
    -TemplateParameterFile $PrivateEndpointParametersFilePath `
    -SubnetId $SubnetResourceId `
    -ResourceId $CosmosDbResourceId `
    -GroupId $CosmosDbSubResourceType `
    -PrivateEndpointName $PrivateEndpointName
$deploymentOutput

## Step 6: Create the private zone
New-AzResourceGroupDeployment -Name "PrivateZoneGroupDeployment" `
    -ResourceGroupName $ResourceGroupName `
    -TemplateFile $PrivateZoneGroupTemplateFilePath `
    -TemplateParameterFile $PrivateZoneGroupParametersFilePath `
    -PrivateZoneName $PrivateZoneName `
    -PrivateEndpointName $PrivateEndpointName`
    -PrivateEndpointDnsGroupName $PrivateEndpointDnsGroupName

カスタム DNS の構成

プライベート DNS ゾーンは、プライベート エンドポイントを作成したサブネット内で使用する必要があります。 各プライベート IP アドレスが DNS エントリにマップされるようにエンドポイントを構成します 前述の応答の fqdns プロパティを参照してください)。

プライベート エンドポイントを作成するときに、Azure のプライベート DNS ゾーンと統合できます。 代わりにカスタム DNS ゾーンを使用する場合は、プライベート エンドポイント用に予約されているすべてのプライベート IP アドレスの DNS レコードを追加するように構成する必要があります。

重要

要求の DNS 解決により、これらの要求がプライベート エンドポイントを経由するか、標準のパブリック ルートを利用するかが決まります。 プライベート エンドポイントによってマップされたプライベート IP アドレスをローカル DNS が正しく参照するようにしてください。

Private Link とファイアウォール規則を組み合わせて使用すると、次のような状況と結果になる可能性があります。

  • ファイアウォール規則を構成していない場合、既定では、すべてのトラフィックが Azure Cosmos DB アカウントにアクセスできます。

  • パブリック トラフィックまたはサービス エンドポイントを構成し、プライベート エンドポイントを作成する場合、さまざまな種類の受信トラフィックが、対応する種類のファイアウォール規則によって承認されます。 プライベート エンドポイントが、サービス エンドポイントも構成されているサブネットで構成されている場合は、次のようになります。

    • プライベート エンドポイントによってマップされたデータベース アカウントへのトラフィックは、プライベート エンドポイントを介してルーティングされます。
    • サブネットからの他のデータベース アカウントへのトラフィックは、サービス エンドポイントを介してルーティングされます。
  • パブリック トラフィックまたはサービス エンドポイントを構成せずにプライベート エンドポイントを作成する場合、Azure Cosmos DB アカウントにはプライベート エンドポイントからのみアクセスできます。 パブリック トラフィックまたはサービス エンドポイントを構成しない場合、すべての承認済みプライベート エンドポイントが拒否または削除されると、PublicNetworkAccessDisabled に設定されていない限り、アカウントはネットワーク全体に対して開かれます。

アカウントの作成中のパブリック ネットワーク アクセスのブロック

前のセクションで説明されているように、特定のファイアウォール規則が設定されていない限り、プライベート エンドポイントを追加すると、Azure Cosmos DB アカウントはそのプライベート エンドポイント経由でのみアクセス可能になります。 つまり、パブリック トラフィックから Azure Cosmos DB アカウントに到達できるのは、それが作成されてから、プライベート エンドポイントが追加されるまでの間になります。 プライベート エンドポイントの作成の前であってもパブリック ネットワーク アクセスが確実に無効になるようにするには、アカウントの作成中に publicNetworkAccess フラグを Disabled に設定することができます。 このフラグは、任意の IP または仮想ネットワーク規則よりも優先されることに注意してください。 このフラグが Disabled に設定されているとき、ファイアウォール構成でソース IP または仮想ネットワークが許可される場合でも、パブリックおよび仮想のネットワーク トラフィックはすべてブロックされます。

このフラグの使用方法を示す例については、この Azure Resource Manager テンプレートを参照してください。

ダウンタイムが発生しないように既存の Azure Cosmos DB アカウントにプライベート エンドポイントを追加する

既定では、プライベート エンドポイントを既存のアカウントに追加すると、約 5 分の短いダウンタイムが発生します。 このダウンタイムを回避するには、以下の手順に従います。

  1. IP または仮想ネットワークの規則をファイアウォール構成に追加し、クライアント接続を明示的に許可します。
  2. 構成が確実に更新されるよう、10 分間待ちます。
  3. 新しいプライベート エンドポイントを構成します。
  4. 手順 1 で設定したファイアウォール規則を削除します。

Note

Azure Cosmos DB SDK を使用してアプリケーションを実行している場合は、構成の更新中に一時的なタイムアウトが発生する可能性があります。 アプリケーションが一時的な接続エラーに対して回復性があるように設計されており、必要になったときのために再試行ロジックが設定されていることを確認します。

直接モードを使用する場合のポートの範囲

直接モード接続を介して Azure Cosmos DB アカウントで Private Link を使用している場合は、TCP ポートの全範囲 (0 から 65535) が開いていることを確認する必要があります。

リージョンの追加または削除時にプライベート エンドポイントを更新する

Azure Cosmos DB アカウントのデプロイのリージョンには、"米国西部"、"米国中部"、"西ヨーロッパ"の 3 つがあります。 アカウントのプライベート エンドポイントを作成すると、4 つのプライベート IP がサブネットで予約されます。 3 つのリージョンのそれぞれに 1 つの IP があり、リージョンに依存しないグローバル エンドポイントに 1 つの IP があります。 後で、Azure Cosmos DB アカウントに新しいリージョンを追加する場合があります。 プライベート DNS ゾーンは、次のように更新されます。

  • プライベート DNS ゾーン グループを使用する場合:

    プライベート DNS ゾーン グループを使用する場合、プライベート エンドポイントが更新されると、プライベート DNS ゾーンが自動的に更新されます。 前の例では、新しいリージョンを追加した後に、プライベート DNS ゾーンが自動的に更新されます。

  • プライベート DNS ゾーン グループを使用しない場合:

    プライベート DNS ゾーン グループを使用しない場合、Azure Cosmos DB アカウントにリージョンを追加するか、それを削除するには、そのアカウントの DNS エントリを追加または削除する必要があります。 リージョンが追加または削除された後で、サブネットのプライベート DNS ゾーンを更新し、追加または削除された DNS エントリとそれに対応するプライベート IP アドレスを反映できるようになります。

    前の例では、新しいリージョンを追加した後、プライベート DNS ゾーンまたはカスタム DNS のいずれかに、対応する DNS レコードを追加する必要があります。 リージョンを削除する際も同じステップを使用できます。 新しいリージョンを削除した後で、プライベート DNS ゾーンかカスタム DNS のどちらかから、対応する DNS レコードを削除する必要があります。

現在の制限

Azure Cosmos DB アカウントで Private Link を使用する場合、次の制限事項が適用されます。

  • 1 つの Azure Cosmos DB アカウントに 200 を超えるプライベート エンドポイントを設定することはできません。

  • ダイレクト モード接続を介して Azure Cosmos DB アカウントで Private Link を使用する場合、使用できるプロトコルは、TCP プロトコルのみです。 HTTP プロトコルは現在サポートされていません。

  • Azure Cosmos DB の MongoDB 用 API アカウントを使用する場合、プライベート エンドポイントは、サーバーのバージョンが 3.6 以降のアカウント (つまり、*.mongo.cosmos.azure.com 形式のエンドポイントを使用するアカウント) でのみサポートされます。 サーバーのバージョンが 3.2 のアカウント (*.documents.azure.com 形式のエンドポイントを使用するアカウント) では、Private Link はサポートされていません。 Private Link を使用するには、古いアカウントを新しいバージョンに移行する必要があります。

  • ご使用の Azure Cosmos DB の MongoDB 用 API アカウントに Private Link が存在する場合、適切に接続するためには、ツールおよびライブラリで SNI (Service Name Identification) をサポートするか、接続文字列から appName パラメーターを渡す必要があります。 一部の古いツールおよびライブラリは、Private Link 機能と互換性がない場合があります。

  • 自動承認されるプライベート エンドポイントを作成するには、Azure Cosmos DB アカウント スコープで少なくとも Microsoft.DocumentDB/databaseAccounts/PrivateEndpointConnectionsApproval/action アクセス許可がネットワーク管理者に付与されている必要があります。

  • 現時点では、拒否されたプライベート エンドポイント接続を承認できません。 かわりに、プライベート エンドポイントを作成し、プライベート接続を再開します。 Azure Cosmos DB プライベート リンク サービスは、再作成されたプライベート エンドポイントを自動的に承認します。

プライベート DNS ゾーンの統合に関する制限事項

プライベート DNS ゾーン グループを使用していない限り、プライベート エンドポイントを削除しても、または Azure Cosmos DB アカウントからリージョンを削除しても、プライベート DNS ゾーン内の DNS レコードは自動的には削除されません。 以下の操作の前に、DNS レコードを手動で削除する必要があります。

  • このプライベート DNS ゾーンにリンクされる新しいプライベート エンドポイントを追加する。
  • このプライベート DNS ゾーンにリンクされるプライベート エンドポイントがあるすべてのデータベース アカウントに新しいリージョンを追加する。

DNS レコードをクリーンアップしないと、予期しないデータ プレーンの問題が発生する可能性があります。 こうした問題には、プライベート エンドポイントの削除、リージョンの削除後に追加されたリージョンへのデータ停止などがあります。

次のステップ

Azure Cosmos DB のセキュリティ機能の詳細については、次の記事を参照してください。