🌐

Azure Container Apps における Ingress の構成パターン例 2 (マイクロサービス)

に公開

はじめに

この記事は、Azure Container Apps における Ingress の構成パターンを実際に構築してみて触ってみた記録です。

https://zenn.dev/georgeosddev/articles/azure-container-apps-ingress-architecture-patterns

この記事ではパターン②を取り上げます。

構成

作成した環境は以下の通りです。今回は上記mermaidに含まれる(任意)のコンポーネントは省略しています。
前回パターン①で作成した環境で、aca-without-vnet の Ingress を環境内に限定します。

https://zenn.dev/georgeosddev/articles/azure-container-apps-ingress-pattern-1

Container Apps

aca-without-vnet

Ingress の構成でトラフィックを環境内に限定にすることで、FQDN に .internal. が表示されるようになります。
※ パターン①で試しましたが、.internal. FQDNは、環境内のトラフィックに限定しない状態でも利用可能です。

app-ingress-limited

$ az containerapp show -g zenn-aca-without-vnet -n aca-without-vnet \
  --query "properties.{environmentId: environmentId,
                       configuration: {ingress: configuration.ingress},
                       latestRevisionFqdn: latestRevisionFqdn,
                       outboundIpAddresses: outboundIpAddresses}" \
  -o json

{
  "configuration": {
    "ingress": {
      "additionalPortMappings": null,
      "allowInsecure": false,
      "clientCertificateMode": "Ignore",
      "corsPolicy": null,
      "customDomains": null,
      "exposedPort": 0,
      "external": false, // ★★★ external が false
      "fqdn": "aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io", // ★★★ FQDNに .internal.が追加される
      "ipSecurityRestrictions": null,
      "stickySessions": {
        "affinity": "none"
      },
      "targetPort": 80,
      "targetPortHttpScheme": null,
      "traffic": [
        {
          "latestRevision": true,
          "weight": 100
        }
      ],
      "transport": "Auto"
    }
  },
  "environmentId": "/subscriptions/<サブスクリプションID>/resourceGroups/zenn-aca-without-vnet/providers/Microsoft.App/managedEnvironments/aca-env-without-vnet",
  "latestRevisionFqdn": "aca-without-vnet--internal.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io",  // ★★★ FQDNに .internal.が追加される
  "outboundIpAddresses": [
    "20.210.72.88",
    "20.210.72.103",
    "135.149.35.113",

    ・・・//省略 合計 70件のパブリックIPが含まれる。

  ]
}

アプリケーションへのルーティングの確認

Env 外のクライアントからのアクセス

aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io に対するHTTPリクエストは Env の staticIp である 130.33.219.240 に解決されますが、404 応答となります。

この応答はパターン①で確認した存在しない App 名を指定した場合と同様の応答になります。

404

$ curl -v https://aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io/
*   Trying 130.33.219.240:443...
* Connected to aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io (130.33.219.240) port 443 (#0)

<省略>

> GET / HTTP/2
> Host: aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io
> user-agent: curl/7.81.0
> accept: */*
>
<!DOCTYPE html>
<html>
<head>
    <title>Azure Container App - Unavailable</title>

<省略>

<div id="feature">
    <div id="content">
        <h1 id="unavailable">Error 404 - This Container App is stopped or does not exist.</h1>
        <p id="tryAgain">The Container App you have attempted to reach is currently stopped or does not exist.</p>
        <p id="toAdmin">If you are the Container App administrator, please visit <a href="https://portal.azure.com/">Azure Portal</a>.</p>
    </div>
</div>
</body>
</html>
* Connection #0 to host aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io left intact

aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io についても同様に 404 となり、Env 外からはアクセスできません。

$ curl -I https://aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io/
HTTP/2 404
content-type: text/html; charset=utf-8
content-length: 1946
date: Wed, 07 Jan 2026 08:09:00 GMT

Env 内からのアクセス

前回と同様に Nginx コンテナから試してみます。

デフォルト FQDN(.internal.なし) でのアクセス

パブリックIPに解決されて 404 となります。これは Env 外からアクセスしたことと同等といえます。

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# nslookup aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io
Server:         127.0.0.11
Address:        127.0.0.11#53

Non-authoritative answer:
Name:   aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io
Address: 130.33.219.240

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# curl -I https://aca-without-vnet.whitemoss-043fed62.japaneast.azurecontainerapps.io/
HTTP/2 404
content-type: text/html; charset=utf-8
content-length: 1946
date: Wed, 07 Jan 2026 08:17:24 GMT

.internal. FQDN でのアクセス

プライベートIP に解決され 200 応答を得ることができます。

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# nslookup aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io
;; Got recursion not available from 127.0.0.11
Server:         127.0.0.11
Address:        127.0.0.11#53

Name:   aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io
Address: 100.100.0.210
;; Got recursion not available from 127.0.0.11

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# curl -I https://aca-without-vnet.internal.whitemoss-043fed62.japaneast.azurecontainerapps.io/
HTTP/2 200
accept-ranges: bytes
content-length: 4332
content-type: text/html; charset=utf-8
last-modified: Mon, 13 Oct 2025 15:12:40 GMT
date: Wed, 07 Jan 2026 08:17:51 GMT

<AppName> でのアクセス

プライベートIP に解決され 200 応答を得ることができます。

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# nslookup aca-without-vnet
;; Got recursion not available from 127.0.0.11
Server:         127.0.0.11
Address:        127.0.0.11#53

Name:   aca-without-vnet.k8se-apps.svc.cluster.local
Address: 100.100.241.104
;; Got recursion not available from 127.0.0.11

root@aca-without-vnet-2--0000002-77756d5fdc-hdcwc:/# curl -I http://aca-without-vnet
HTTP/1.1 200 OK
accept-ranges: bytes
content-length: 4332
content-type: text/html; charset=utf-8
last-modified: Mon, 13 Oct 2025 15:12:40 GMT
date: Wed, 07 Jan 2026 08:18:36 GMT

まとめ

無事想定通り aca-without-vnet にデプロイされたアプリケーションに対して、外部からアクセスできないようにすることができました。

この構成を使ったサンプルとして以下が公開されていました。

また下記の workshop の Module 2 においても同様の構成をしています。

今回の構成では、Env 内の App 間の通信は FrontApp のコンソールから curl を用いていますが、アプリ内でHTTP通信を実装していると言い換えることができます。
直接アプリとして通信する以外には、Dapr のサービス間呼び出しを利用する方法もあります。別記事で検証予定。

Discussion