このエントリは2022/11/21現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
以前の問い合わせ主とは違うところ(最近の問い合わせはこの別の主からの問い合わせが多かったりする)から以下のような問い合わせが来た。
いまAzure Functionsを使ってREST APIを作成しようとしている。このAzure FunctionsはVNetに引き込んでおり、外部からは直接アクセスできないようにしている。Azure PortalやAzure CLIなどで構成したものの、肝心のアプリケーションをデプロイできない、という状態に陥った。デプロイできるようにするにはどうすればよいのか?
よくわからなかったので、もうちょっと突っ込んで聞いてみた。
- Azure VNetへのアクセスはP2S VPNを構成済み。Bastionも使えるようにはしている。
- Azure FunctionsはPrivate EndpointでVNetから接続されている。
- VNet Integrationも構成済みで、デフォルトゲートウェイはVNetに向いている。
- 作業用&踏み台用にVMをVNet内に配置している。
- デプロイはZipデプロイができればよい。パッケージ実行についてはこだわりはない。
どうやら以下のような構成のよう。

何が問題だったのか?
- Private Endpointは作成したものの、Kudu REST APIでアクセスする先のFQDNのAレコードがプライベートDNSに登録されていなかった。
- VPN接続するPCで、Kudu REST APIでアクセスする先のFQDNの名前解決ができていなかった。
FunctionsはApp Service上に構成されているものなので、基本的にApp Serviceと同じ。そのため、App ServiceでPrivate Endpointにハマった方であればすぐにわかったかもしれない。
どうすればよかったのか?
Private EndpointのDNSに関するドキュメントに記載の通り、Private Endpointでは外部からのアクセスができないようになっていて、FunctionsのFQDNはPrivate EndpointのIPアドレスを指すように構成する必要がある。
DNS
https://learn.microsoft.com/azure/app-service/networking/private-endpoint#dns
以下は上記ドキュメントに記載のAzureのPublic DNSの例だが、Private Endpoint構成時は mywebapp.privatelink.azurewebsites.net
というCNAMEが追加される。この mywebapp.privatelink.azurewebsites.net
はPublic DNSではなく、Private DNSゾーンで解決される。そのため、当然ながらPublic IPでアクセスしようとしても403を返す。
Name | Type | Value | Remark |
---|---|---|---|
mywebapp.azurewebsites.net | CNAME | mywebapp.privatelink.azurewebsites.net | |
mywebapp.privatelink.azurewebsites.net | CNAME | clustername.azurewebsites.windows.net | |
clustername.azurewebsites.windows.net | CNAME | cloudservicename.cloudapp.net | |
cloudservicename.cloudapp.net | A | 40.122.110.154 | Private Endpoint構成時はこのPublic IPを使って呼び出しても403を返す |
プライベートDNSゾーンでこの mywebapp.privatelink.azurewebsites.net
を解決できるよう構成する必要がある。
Name | Type | Value | Remark |
---|---|---|---|
mywebapp.azurewebsites.net | CNAME | mywebapp.privatelink.azurewebsites.net | Azure Public DNSに追加されたCNAMEと同じく、privatelinkを含むFQDNを指すようにCNAMEが構成されている |
mywebapp.privatelink.azurewebsites.net | A | 10.10.10.8 | Private EndpointのIPを指すようにプライベートDNSゾーン内でAレコードを管理する必要がある |
そして、Kudu REST APIでアクセスする先のFQDNもまたPrivate Endpointの影響を受けるため、 mywebapp.scm.privatelink.azurewebsites.net
というAレコードを追加する必要がある。このPrivate Endpoint IPは上記の例だと10.10.10.8、つまりFunctionsのPrivate EndpointのIP。
Name | Type | Value |
---|---|---|
mywebapp.privatelink.azurewebsites.net | A | PrivateEndpointIP |
mywebapp.scm.privatelink.azurewebsites.net | A | PrivateEndpointIP |
他にやるべきことは?
VNetをプライベートDNSに紐付けしていないと、VNet上のVMからFQDNを解決できないので、VNetリンクを構成しておく必要がある。
仮想ネットワーク リンクとは / What is a virtual network link?
https://learn.microsoft.com/azure/dns/private-dns-virtual-network-links
Private Endpointを構成している場合、Functionsの背後にあるStorage accountに対してもPrivate Endpointを構成しておくべきである。そのためには、FunctionsからVNetへのルート、そしてVNetからStorage Accountへのルートを確保する必要があり、結果としてFunctionsに対してVNet Integrationも構成する必要が出てくる。
お使いのストレージ アカウントを仮想ネットワークに制限する / Restrict your storage account to a virtual network
https://learn.microsoft.com/azure/azure-functions/functions-networking-options?#restrict-your-storage-account-to-a-virtual-network
このあたりは、Azure Portalから作成していると、Wizard形式で尋ねてくれる。

あとは、オンプレミスからのアクセスにあたり、AzureのプライベートDNSのレコードをhostsに追加したくない、ということであれば、Private DNS Resolverを使ってAレコードを転送するというのも一つのオプションではあるが、ここはご自由に。
対策後
問い合わせ主からは、「Kudu REST APIアクセス用のAレコードを追加して、DNSをVNetにリンクさせたところ、踏み台のVMからデプロイできた。また、P2S VPNを構成したオンプレミスPCからは、一旦hostsに書き込むことによりZipデプロイできることを確認した」との回答をもらった。