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) は必要な機能のための重要な役割を果たします。
次の図は、このシナリオのネットワーク接続の概要を示しています。
プライベート エンドポイントを作成する
まず、仮想ネットワークに新しいサブネットを作成し、そのサブネットの中に Azure SQL Database プライベート エンドポイントを作成します。
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
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 レコードを持つこのドメイン用のプライベート ゾーンを作成します。
次の
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 を使用することでデータベースにアクセスするため、これらにとっては何の変化も起きていません。
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