はじめに
先日取り組んでいた案件でApplicationGateway→PrivateEndpoint→Azure Storage(Blob)といった経路でAzure Storageへの通信経路を用意するという要件があり、その際にAzureの仕様で躓いたときの備忘録です。個人的には頻繁に使われるような構成ではないかなと考えています。
やりたかったこと&躓いたところ
下図のような構成でBlobコンテナへの導線を構築し、クライアントからhttps://test.com/blob/<Blobコンテナ名>/<ファイル名>でファイルアクセスできるようにしようと考えていました。
※test.comはApplicationGatewayの架空のFQDNです。
実際にこのような設定をし、クライアントからApplicationGateway経由でBlobコンテナにアクセスしようとしたところ、ApplicationGateway側で502エラーが出力されてしまいました。つまりApplicationGatewayまで通信は到達しているが、バックエンドのBlobコンテナに通信を渡す際に問題が発生したようでした。ちなみに、ApplicationGatewayで設定している正常性プルーブでは不具合は起きていなかったため、正常性プルーブが原因でBlobコンテナへの通信が遮断されているというわけではなさそうでした。
原因
原因はBlobコンテナにアクセスする際のFQDNにありました。
参考記事として記載しているMSのブログ[1]には以下のような記載がありました。
プライベート エンドポイントは仮想ネットワーク上にエンドポイントを構成することで、Azure PaaS にプライベート IP アドレスで接続する機能を提供していますが、クライアントが接続する際の FQDN は変わりません。
Blobコンテナにパブリックアクセスする際のFQDNは<ストレージアカウント名>.blob.core.windows.netになります。バックエンドプールのターゲットとして登録していたFQDNは<ストレージアカウント名>.privatelink.blob.core.windows.netでしたので、確かにFQDNは異なるようです。
ただ今回はあくまでPrivateEndpoint経由でのアクセスが必須となるため、ここを<ストレージアカウント名>.blob.core.windows.netに書き換えてしまうと、PrivateEndpoint経由でのアクセスではなくなってしまうと予想されます。
またクライアントからアクセスする際にはApplicationGatewayのFQDNでアクセスするため、こちらも影響がありそうです。
以上から今回は次のような対応を実施しました。
実施した対応
ApplicationGatewayの書き換えセットを使い、Azure Storageへのアクセスがあった際に、リクエストのホストヘッダーを<ストレージアカウント名>.blob.core.windows.netに書き換えを実施しました。
これによりApplication Gateway経由でBlobにアクセスできるようになりました。
補足事項
PrivateEndpointがデプロイされているVnet内にVMを配置し、そこからnslookupで<ストレージアカウント名>.blob.core.windows.netがどのような名前解決が行われるか確認したところ,以下のような結果が返ってきました。
> nslookup <ストレージアカウント名>.blob.core.windows.net
権限のない回答:
名前: <ストレージアカウント名>.privatelink.blob.core.windows.net
Address: <プライベートエンドポイントのプライベートIPアドレス>
Aliases: <ストレージアカウント名>.blob.core.windows.net
これをみると、ストレージアカウントのFQDNでBlobコンテナにアクセスを試みるとプライベートエンドポイント経由でのアクセスになるようDNSの名前解決が行われることがわかります。
最後に
ApplicationGateway × AppServiceのときにも似たような理由で対象サービスにアクセスできない遭遇したことがあるので、ApplicationGateway経由で各種Azureサービスにアクセスする際には、アクセスする際に使っているFQDNの確認が重要になりそうです。
参考記事
[1] MSブログ プライベート エンドポイントをご利用いただく上でのポイント
注意事項
本ブログに掲載している内容は、私個人の見解であり、所属する組織の立場や戦略、意見を代表するものではありません。あくまでエンジニアとしての経験や考えを発信していますので、ご了承ください。

