しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure App Service / Azure Functions で Inbound IPv6 (Public Preview) がサポートされたので試した

タイトルの通りですが、少し前に App Service が Public Preview として Inbound IPv6 に対応しました。Build 2023 のタイミングで発表されていた内容なので、結構公開されるまでに時間がかかったという印象です。

現時点の制約としてはマルチテナントの App Service のみ対応していて、Premium SKU と Consumption そして Functions Premium で IPv6 が利用できるようになっています。Consumption への対応は少し意外でしたが、正直 Dedicated SKU なら対応するのではと思っています。

リリースされた当初は Azure CLI での変更が必須だった記憶がありますが、最近は Azure Portal から変更できるようになったのでこれまでよりも簡単に試すことが出来ます。

設定項目としては IPv4 / IPv6 / IPv4AndIPv6 が用意されていますが、現実的には IPv4AndIPv6 を選ぶのが大半だと思われます。流石に IPv6 のみ有効化するのはまだ厳しいはずです。

早速 App Service でホストしているサイトの Inbound IP mode を IPv4AndIPv6 に変更してみると、nslookup で問い合わせた時のホスト名が明らかに IPv4 と IPv6 に対応したものに変化しました。

ちなみに VMSS Worker に移行したタイミングで azurewebsites.windows.net から cloudapp.azure.com というホスト名に変わっていたはずなのですが、IPv6 対応のために再度利用するようになったようです。

このように App Service の設定で IPv6 を有効化するだけで、デフォルトドメインは AAAA レコードによって IPv6 アドレスが返ってくるようになりますが、カスタムドメインを設定している場合にはそちらにも AAAA レコードを追加しないと意味がありません。

Public Preview あるあるですが、現状では Resource Manager 側に Inbound IPv6 の値は含まれていないので、nslookup などを叩いて返ってきた IPv6 アドレスを設定する必要があります。Azure DNS を使っている場合には以下のように AAAA レコードを追加して対応します。

個人的には App Service に対しても Alias record set が利用できるとかなり便利だと思うのですが、基本的に IP アドレスは固定だから不要という判断なのかもしれません。

Azure DNS でカスタムドメインに対して AAAA レコードを追加したので、適当に nslookup を叩いて確認すると IPv4 と IPv6 の両方が返ってくることが分かります。

ブラウザの開発ツールを使ってリモートアドレスを確認してみると、IPv6 が使われていることが確認出来ます。これで App Service でホストしているアプリケーションの IPv6 対応が完了です。

当然ながら Inbound IPv6 を有効化すると Service Endpoint を利用した IP ファイアウォールの設定は、IPv6 向けに修正する必要があるので注意が必要です。以前から App Service は IPv6 の制限に対応していたので、この辺りは知っていれば修正は簡単なはずです。

ここまでは Dedicated な App Service に対して Inbound IPv6 を有効化して試していましたが、Azure Functions の Consumption Plan でも有効化出来るのが気になったので、最後に簡単に試しました。

現状では Azure Functions の場合は Azure Portal に設定が出てこないので、Azure CLI を使って IPv6 を有効化します。この az resource update は覚えておいて損はないコマンドです。

az resource update --name <app-name> --set properties.ipMode="IPv4AndIPv6" -g <resource-group-name> --resource-type "Microsoft.Web/sites"

Consumption Plan に対して有効化してみると、App Service とは異なるホスト名が返ってくるようになりました。この辺りは Dedicated と Consumption でアーキテクチャが異なっているようです。実際 Consumption には複数 Stamp に跨る可能性によると思われる制約もありました。

実際のところ Azure Functions で直接 IPv6 アドレスを持つ必要がどのくらいあるのかは分かりませんが、Consumption については少し挙動が異なっている点は気を付けたいですね。