Azure Private Link を使用してサービスにアクセスする

完了

通常は、インターネット経由でパブリック IP アドレスを使用することで、パブリック エンドポイントを持つ Azure のサービスとしてのプラットフォーム (PaaS) サービスにアクセスできます。 多くの Azure サービスは、特定の仮想ネットワーク内からのみ Azure サービスに到達可能となる、プライベート エンドポイントの作成もサポートしています。

顧客の API の背後にある Azure SQL データベースは、パブリック IP アドレスで公開されます。 このデータベースは、Azure Container Instances コンテナーのみがアクセスできるように、Azure SQL ファイアウォール規則によって保護されます。 ただし、セキュリティを強化するために、API とデータベースの間でプライベート IP アドレス指定のみを使用するように通信をさらに制限できます。

このユニットでは、Azure Private Link を使用して、アプリケーションの Azure SQL データベース用のプライベート エンドポイントを作成し、コンテナーがエンドポイントに到達できるようにします。 アプリケーションをホストしているコンテナーは、Azure SQL 完全修飾ドメイン名 (FQDN) をパブリック IP ではなくプライベート IP に解決する必要があるため、ドメイン ネーム システム (DNS) は必要な機能のための重要な役割を果たします。

次の図は、このシナリオのネットワーク接続の概要を示しています。

Diagram that shows a topology overview of the network connections.

プライベート エンドポイントを作成する

まず、仮想ネットワークに新しいサブネットを作成し、そのサブネットの中に Azure SQL Database プライベート エンドポイントを作成します。

  1. Azure portal の Cloud Shell で、次のコードを実行してエンドポイントを作成します。

    # Create new subnet for the SQL private endpoint
    sql_subnet_name=sql
    sql_subnet_prefix=192.168.3.0/24
    az network vnet subnet create --resource-group $rg --vnet-name $vnet_name \
        --name $sql_subnet_name --address-prefix $sql_subnet_prefix \
        --disable-private-endpoint-network-policies true
    # SQL Server private endpoint
    sql_endpoint_name=sqlep
    sql_server_id=$(az sql server show --name $sql_server_name --resource-group $rg --output tsv --query id)
    az network private-endpoint create --name $sql_endpoint_name --resource-group $rg \
        --vnet-name $vnet_name --subnet $sql_subnet_name \
        --private-connection-resource-id $sql_server_id --group-id sqlServer \
        --connection-name sqlConnection
    
  2. Azure は、プライベート エンドポイントをネットワーク インターフェイス カード (NIC) として表現します。 az network nic コマンドを使用して、プライベート エンドポイントに割り当てられている IP アドレスを確認します。

    # Get endpoint's private IP address
    sql_nic_id=$(az network private-endpoint show --name $sql_endpoint_name \
        --resource-group $rg --query 'networkInterfaces[0].id' -o tsv)
    sql_endpoint_ip=$(az network nic show --ids $sql_nic_id \
        --query 'ipConfigurations[0].privateIpAddress' -o tsv) && echo $sql_endpoint_ip
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "nslookup ${sql_server_name}.database.windows.net"
    

プライベート DNS ゾーンの作成

上記の nslookup コマンドの結果では、Azure SQL データベースの FQDN が、まだ仮想ネットワーク内のパブリック IP アドレスに解決されていることがわかります。 仮想ネットワーク内のリソースが、Azure SQL データベースのプライベート IP アドレスを使用することを強制するためには、プライベート DNS ゾーンを作成します。

プライベート リンクが構成された Azure SQL データベースは、中間ドメインである privatelink.database.windows.net を使用します。 Azure SQL プライベート エンドポイントの IP アドレスの A レコードを持つこのドメイン用のプライベート ゾーンを作成します。

  1. 次の az network private-endpoint dns-zone-group create コマンドを実行して、プライベート DNS ゾーンを持つプライベート エンドポイントに接続し、正しい IP アドレスを持つ A レコードを自動的に作成します。

    # Create Azure DNS private zone and record
    dns_zone_name=privatelink.database.windows.net
    az network private-dns zone create --name $dns_zone_name --resource-group $rg 
    az network private-dns link vnet create --resource-group $rg --zone-name $dns_zone_name \
        --name myDnsLink --virtual-network $vnet_name --registration-enabled false
    az network private-endpoint dns-zone-group create --endpoint-name $sql_endpoint_name \
        --resource-group $rg --name zonegroup --zone-name zone1 --private-dns-zone $dns_zone_name
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "nslookup ${sql_server_name}.database.windows.net"
    

    これで仮想ネットワーク内の仮想マシン (VM) が、Azure SQL データベースの FQDN をプライベート エンドポイントのプライベート IP アドレスに解決するようになったはずです。

    Note

    前のユニットのコンテナー インスタンスを削除した場合は、前と同じ YAML ファイルを使用することでそれらを再作成できます。 コンテナー インスタンスは、引き続き同じ FQDN を使用することでデータベースにアクセスするため、これらにとっては何の変化も起きていません。

  2. api/healthcheck エンドポイントを使用してコンテナー インスタンスが実行中であることを確認します。 api/dns エンドポイントで、プライベート IP アドレスへの正しい名前解決を確認し、api/sqlversion および api/sqlsrcip エンドポイントで、データベースの到達可能性を確認します。

    # Test
    aci_ip=$(az container show --name $aci_name --resource-group $rg \
        --query 'ipAddress.ip' --output tsv) && echo $aci_ip
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -ks https://$aci_ip/api/healthcheck"
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -ks https://$aci_ip/api/dns?fqdn=${sql_server_name}.database.windows.net"
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -ks https://$aci_ip/api/sqlversion"
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -ks https://$aci_ip/api/sqlsrcip"
    

    前のコマンドの出力は、Azure SQL API がプライベート IP アドレスを使用してコンテナー インスタンスにアクセスできるようになったことを示します。

Note

プライベート エンドポイントが存在する場合、一部の Azure サービスはパブリックエンド ポイントを自動的に無効にしますが、すべてがそうではありません。 Azure SQL Database では、プライベート エンドポイントを構成した後も、パブリック エンドポイントはアクティブなままです。 インターネット経由のデータベース アクセスを無効にするには、さらに Azure SQL ファイアウォール設定を構成する必要があります。 ファイアウォールはパブリック エンドポイントを保護するためだけに使用されるので、この演習ではファイアウォール規則を変更する必要はありません。

リソースをクリーンアップする

次のユニットに進む前に、Azure リソース グループを削除することでコンテナー インスタンスを削除します。

# Clean up unit 5
az container delete --name $aci_name --resource-group $rg --yes