Azure認定資格 WEB問題集&徹底解説

AZ-104:Microsoft Azure Administrator

正解 A問題
分野3:Azure コンピューティングリソースのデプロイと管理 タスクステートメント3.3:Azure portal でのコンテナーのプロビジョニングと管理 タスクステートメント3.1:ARM テンプレートまたは Bicep ファイルによるリソースデプロイの自動化
合格に向けて、もっと深く学習する
豊富な問題と詳細なAzureサービス解説を、1 時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
印刷会社トキワ印刷は、次の ARM テンプレートを使用して Azure Container Instances のコンテナーグループ aci-tokiwa-report をデプロイしました。デプロイは正常に完了し、コンテナーは実行中です。
{
  "type": "Microsoft.ContainerInstance/containerGroups",
  "apiVersion": "2023-05-01",
  "name": "aci-tokiwa-report",
  "location": "japaneast",
  "properties": {
    "containers": [
      {
        "name": "report-api",
        "properties": {
          "image": "tokiwa.azurecr.io/report-api:linux",
          "ports": [
            { "protocol": "TCP", "port": 80 }
          ],
          "resources": {
            "requests": { "memoryInGB": 1, "cpu": 1 }
          }
        }
      }
    ],
    "restartPolicy": "Always",
    "ipAddress": {
      "type": "Public",
      "ports": [
        { "protocol": "TCP", "port": 80 }
      ]
    },
    "osType": "Linux"
  }
}
ただし、report-api のイメージに含まれるアプリケーションは、テンプレートの宣言とは異なり TCP 8080 番で待ち受けています。インターネットからこのコンテナーグループへのアクセスについて、正しい記述はどれですか。
  • パブリック IP のポート 80 番へアクセスしても、report-api コンテナーは 8080 番でしかリッスンしていないため、接続を確立できない
  • パブリック IP のポート 8080 番へアクセスすると、report-api に到達できる
  • ipAddress.type が Public に設定されているため、コンテナー側で明示していないポートも含めてすべて外部公開される
  • Azure Container Instances がパブリック IP の 80 番への通信を report-api の 8080 番へ自動的に転送するため、80 番で report-api に到達できる
解説 頻出度★★★★★
この問題は、「グループ IP で開いているポート(ipAddress.ports)× コンテナーの公開ポート × アプリが実際に待ち受けているポート」の 3 つを突き合わせ、ACI にはポートマッピングが無く、IP のポートは同じ番号のコンテナーポートへ届くだけと判断できるかがポイント
正解

A. パブリック IP のポート 80 番へアクセスしても、report-api コンテナーは 8080 番でしかリッスンしていないため、接続を確立できない

パブリック IP で開いているのは ipAddress.ports の TCP 80 番だけです。ACI にはポートマッピングが無いため、80 番への通信はコンテナーグループの同じ 80 番にそのまま届きます。

ところが report-api のアプリは8080 番でしか待ち受けておらず、80 番には受け手がいません。テンプレートでコンテナーの ports に 80 を宣言していても、それはアプリの待ち受けポートを変えるものではないため、接続は確立できません。よってこの記述が正解です。

B. パブリック IP のポート 8080 番へアクセスすると、report-api に到達できる

アプリは確かに 8080 番で待ち受けていますが、外部クライアントがグループ内のコンテナーに到達するには、そのポートをグループの IP アドレス側(ipAddress.ports)でも公開する必要があります。

このテンプレートの ipAddress.ports には80 番しか無いため、インターネットから 8080 番への通信はコンテナーまで届きません。8080 番は、同じグループ内の他のコンテナーから localhost 経由で使えるだけです。

C. ipAddress.type が Public に設定されているため、コンテナー側で明示していないポートも含めてすべて外部公開される

ipAddress.type を Public にする設定は、コンテナーグループにパブリック IP を割り当てるという指定にすぎません。外部に開くのは ipAddress.ports に列挙したポートだけで、すべてのポートが公開されるわけではありません。

本問で外部に開いているのは TCP 80 番のみであり、「明示していないポートも含めてすべて公開」という記述は誤りです。

D. Azure Container Instances がパブリック IP の 80 番への通信を report-api の 8080 番へ自動的に転送するため、80 番で report-api に到達できる

Docker の -p 80:8080 のようなポート変換を ACI に期待した誤答です。ACI のコンテナーグループにはポートマッピングの仕組みが無く、IP の 80 番への通信は同じ 80 番に届くだけで、8080 番へ書き換えられることはありません。

外部の 80 番でアプリに到達させたいなら、アプリ自体を 80 番で待ち受けるように直すか、80 番で待ち受けるリバースプロキシを同じグループに置いて localhost:8080 へ中継するなど、構成側で対処する必要があります。

これだけ覚える(記憶フック)
ACI は「外の番号=中の番号」。80→8080 の変換は無いので、届いた番号で待ち受けていなければつながらない。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
ipAddress.ports に TCP 80 のみ(type は Public) パブリック IP から到達できるのは列挙された 80 番だけ。8080 番は外から届かない
→選択肢(B)を消す
ipAddress.type が Public であることの意味 パブリック IP を割り当てるだけで、全ポートを開放する設定ではない
→選択肢(C)を消す
外部の 80 番とアプリの 8080 番の食い違い ACI にはポートマッピングが無い。80 番への通信は同じ 80 番に届くだけで 8080 番へは転送されない
→選択肢(D)を消す
アプリは TCP 8080 番で待ち受け(80 番は待ち受けなし) 80 番に届いた通信には受け手がいないため接続は確立できない
→選択肢(A)が正解
ひっかけポイント
  • コンテナーの ports に 80 と書いてあっても、それは公開ポートの宣言であってアプリの待ち受けポートを変えない。テンプレートの宣言と、イメージ内のアプリが実際に listen しているポートを分けて読む
  • 選択肢 D は Docker の -p 80:8080 の感覚でポート変換を期待するひっかけ。ACI のグループ IP のポートは、同じ番号のコンテナーポートへ届くだけ
  • 選択肢 B は「アプリが 8080 番で待っているなら 8080 番で入れる」と考えると選びたくなるが、IP 側(ipAddress.ports)で開いていないポートには外から届かない
  • 選択肢 C の「Public だから全部公開」は誤解。開くのは ipAddress.ports に列挙したポートだけ
出題バリエーション 同じ知識が本番では条件を変えて出題されます。
問題文がこう変わったら 正解はこう変わる
「アプリを80 番で待ち受けるように修正した」 テンプレートはそのままで、パブリック IP の 80 番から report-api に到達できる。
「コンテナーの ports と ipAddress.ports を両方とも 8080 に変更した」 アプリの待ち受けと一致するので、クライアントはパブリック IP の 8080 番で接続できる(80 番では接続できない)。
「コンテナーの ports が 8080、ipAddress.ports が 80 だった(どのコンテナーも 80 を公開していない)」 ipAddress のポートをどのコンテナーも使っていない構成としてデプロイ時に拒否される(「Following ports '…' in the 'ipAddress' are not used by any container in container group」のエラー)。
「アプリは変更できないが、外部には80 番で公開したい」 ACI に変換機能は無いので、80 番で待ち受けるリバースプロキシのコンテナーを同じグループに追加し、localhost:8080 へ中継するなど構成で対処する。
「同じグループ内の別コンテナーから report-api を呼び出したい」 グループ内のコンテナーは、IP やコンテナーで公開していないポートでも localhost:8080 で到達できる。
関連サービスの解説 Azure Container Instances (ACI)
リファレンス この問題を解くために必要な知識を扱う公式ドキュメントです。
知識項目 公式ドキュメント
外部クライアントが到達するには IP アドレスのポートをコンテナーから公開する必要があること・グループ内は localhost で任意ポートに到達できること コンテナー グループの概要 - Azure Container Instances
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 0%
No.15 解説
印刷会社トキワ印刷は、次の ARM テンプレートを使用して Azure Container Instances のコンテナーグループ aci-tokiwa-report をデプロイしました。デプロイは正常に完了し、コンテナーは実行中です。
{
  "type": "Microsoft.ContainerInstance/containerGroups",
  "apiVersion": "2023-05-01",
  "name": "aci-tokiwa-report",
  "location": "japaneast",
  "properties": {
    "containers": [
      {
        "name": "report-api",
        "properties": {
          "image": "tokiwa.azurecr.io/report-api:linux",
          "ports": [
            { "protocol": "TCP", "port": 80 }
          ],
          "resources": {
            "requests": { "memoryInGB": 1, "cpu": 1 }
          }
        }
      }
    ],
    "restartPolicy": "Always",
    "ipAddress": {
      "type": "Public",
      "ports": [
        { "protocol": "TCP", "port": 80 }
      ]
    },
    "osType": "Linux"
  }
}
ただし、report-api のイメージに含まれるアプリケーションは、テンプレートの宣言とは異なり TCP 8080 番で待ち受けています。インターネットからこのコンテナーグループへのアクセスについて、正しい記述はどれですか。
  • パブリック IP のポート 80 番へアクセスしても、report-api コンテナーは 8080 番でしかリッスンしていないため、接続を確立できない
  • パブリック IP のポート 8080 番へアクセスすると、report-api に到達できる
  • ipAddress.type が Public に設定されているため、コンテナー側で明示していないポートも含めてすべて外部公開される
  • Azure Container Instances がパブリック IP の 80 番への通信を report-api の 8080 番へ自動的に転送するため、80 番で report-api に到達できる

(会員限定)当問題の評価をお願いします。改善に活用します。