VNetに引き込んだAzure Functionsに対する成果物のデプロイに失敗する

このエントリは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を返す。

NameTypeValueRemark
mywebapp.azurewebsites.netCNAMEmywebapp.privatelink.azurewebsites.net
mywebapp.privatelink.azurewebsites.netCNAMEclustername.azurewebsites.windows.net
clustername.azurewebsites.windows.netCNAMEcloudservicename.cloudapp.net
cloudservicename.cloudapp.netA40.122.110.154Private Endpoint構成時はこのPublic IPを使って呼び出しても403を返す

プライベートDNSゾーンでこの mywebapp.privatelink.azurewebsites.net を解決できるよう構成する必要がある。

NameTypeValueRemark
mywebapp.azurewebsites.netCNAMEmywebapp.privatelink.azurewebsites.netAzure Public DNSに追加されたCNAMEと同じく、privatelinkを含むFQDNを指すようにCNAMEが構成されている
mywebapp.privatelink.azurewebsites.netA10.10.10.8Private 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。

NameTypeValue
mywebapp.privatelink.azurewebsites.netAPrivateEndpointIP
mywebapp.scm.privatelink.azurewebsites.netAPrivateEndpointIP

他にやるべきことは?

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デプロイできることを確認した」との回答をもらった。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中