このエントリは2026/11/12現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する可能性があります。
問い合わせ
いつもの主から、以下のような問いが届いた。
現在ACA (Azure Container Apps) を2個作成してClientとServerとし、両アプリをPrivate Endpoint経由で通信させようとしている。
- 通信は成功する?
- 追加Ingressを構成した場合も影響ない?
- 構成上注意点はある?
「HTTP通るんですし(TCPですし)🍣」という気持ちはあれど、確認しておいて損はしないので、やってみた。
検証トポロジー
非常にシンプルなものである。
- app-bはパブリックネットワークからのHTTPアクセスを待ち受け、Query parameterで指定されたポートに対してリクエストを投げる。
- app-aは、app-bから送信されたTCP通信のメッセージに対して応答を返す
ネットワーク構成は以下の通り。
- 各ACAアプリはカスタムVNetにデプロイされていて、両VNETはPeeringしていない
- app-bをホストするACAが属するVNETから、app-aをホストするACA (厳密にはACE) に対してPrivate Endpointを構成済み
- 最初はapp-aではtcp/18192のみをIngressで公開する。公開スコープはVNet。
- 検証後、tcp/28192、tcp/38192を追加Ingressで公開する。これらの公開スコープもVNet。

アプリケーションのしくみ
まず、app-bに対してリクエストを投げる。
https://{app-bのFQDN}/api/tcp?port={port}
これで、app-aのtcp/18192に対してメッセージを投げる。このメッセージは以下のよう。
Hello {port}, how are you?
app-aは、app-bからの上記メッセージに対して応答を返す。
Acknowledged {request} This message is sent from {port}!
app-bは、上記応答をHTTP responseとして返す。
テスト
確認してみた。
(1) tcpリスニングポートへの通信
curlで呼び出したところ、応答は問題なく通っている。

ログからも、app-bからapp-aに向けた通信も問題なく通っていることがわかる。

ログに見えるIPアドレスは?
ログにPrivate IPレンジのIPアドレスがあるが、これは、ACA Workload Profileで内部用に予約している IP 範囲のもの。以下のドキュメントに、予約アドレスの記載がある。
- 100.100.0.0/17
- 100.100.128.0/19
- 100.100.160.0/19
- 100.100.192.0/19
Subnet – Configure Virtual Networks in Azure Container Apps Environments | Microsoft Learn
Private Link では送信元 IP が NAT IP に変わり、アプリケーション(今回で言えばapp-a)には、実際のクライアントIPではなく、このNAT IPが見える。
Getting connection Information using TCP Proxy v2 – What is Azure Private Link service? | Microsoft Learn
NAT IP configuration (ipConfigurations) – What is Azure Private Link service? | Microsoft Learn
これらのことから、TCP ingress では実際のクライアント IP は取れないので、予約範囲を自分の VNET で使わず、アクセス制御は PE サブネットの NSG や PE 接続の承認で行う必要がある。
コードなど
以下のリポジトリに設定ならびにコードを公開中。
コメントをどうぞ