Azure Container Appsのワークロードプロファイルを試す
Conatiner AppsとはAzureが提供するマイクロサービスアーキテクチャのサービスです。イメージとしてはKubernetes(k8s)の規模が小さいバージョンです。k8sは学習コストが高いしオーバースペックだけど、コンテナインスタンスではしょぼすぎる、という場合にまず検討してみたいサービスになります。ちなみにコンテナアプリも裏ではk8sが動いているので所々それらしい用語が出てきます。
試してみる事
コンテナアプリは「従量課金」と「ワークロードプロファイル」の2種類ありますが、色々な設定が出来るのはワークロードプロファイルの方です。なので今回はそれを使って以下の事を試します。
- サーバスペックをカスタマイズしたアプリ
- 仮想ネットワークからの通信のみを許可したアプリ
- 同じコンテナアプリ環境上にあるコンテナからの通信のみを許可したアプリ
- スケーリング規則の作成(次回の記事)
- Azure Filesをマウント(次回の記事)
サーバスペックをカスタマイズしたアプリ
何も設定しないと4vcpu-8GBのサーバでコンテナを動かすことになります。もう少し大きいやつで動かしたい時には以下のような設定をすることでスペックを変更する事が出来ます。
コンテナアプリの作成画面を開きます
Container Apps環境の「新規作成」を開き、順番に項目を設定します。

基本タブ
次にワークロードプロファイルタブです。今回のポイントです。

ワークロードプロファイルタブその1
ワークロードプロファイルにはデフォルトで一つ作られていますが、追加することで任意のスペックのサーバーを作ることが出来ます。「ワークロードプロファイルの追加」を押しましょう。
「サイズの選択」を押します。リージョンによって多少選べるものや料金が変わってきますが2024年6月現在、主に下記のスペックのサーバーを選ぶことが出来ます。
VMで御用達の安いBシリーズなどが使えないのが痛いですね。今回はDedicated-D4を選びました。
下図のように、ワークロードプロファイルが追加できました。これがコンテナアプリの作成時に選べますので後ほど。
次は監視タブです。好きなように設定しましょう。
次はネットワーク設定です。この先の項目のために、ここでは「自分の仮想ネットワーク」を選択します。無い場合はここで新規作成することも出来ます。ちなみにですが、仮想ネットワークが使えるのは同じリージョンにデプロイしているものに限ります。つまり、仮想ネットワークが東日本でコンテナアプリが米国東、というのは出来ません。V-net統合などをする必要があります。
続いてサブネットを作成します。サブネットはワークロードプロファイルと従量課金では選択できるサブネット範囲が異なります。ワークロードプロファイルの方がより小さくすることが出来ます(24オクテットなど)
仮想IPは今回は「内部」に設定します。こうする事で仮想ネットワーク内、もしくはコンテナアプリ内からのみの通信を許可することが出来ます。
上記が一通り設定出来たらコンテナアプリ環境の作成を終わり、再びコンテナアプリの作成に戻りましょう。
次はコンテナの設定です。Azure Container RegistoryでもDocker Hubでも好きなところからイメージを選択する事が出来ます。イメージを設定して、稼働させるコンテナサーバーの選択をします。ここで先ほど作成した4vcpu-16GBのワークロードプロファイルを選ぶことが出来ます。
最大スペックが4vcpu-16GBということなのでそれ以下に設定することも出来ます。メモリ16もいらないけど8じゃ小さいよ、って場合にも対応できる訳です。
と、いうわけで任意のスペックのサーバーをコンテナで使えるようにする作業は以上になります!
仮想ネットワーク内からの通信のみを許可する
引き続き上記のまま作成をしていきます。
「バインド」という項目がありますが今回は設定しないのでスキップします。
続いて「イングレス」です。イングレスとはkubernetesなどで使われる用語でネットワークに関わる話になります。
コンテナへの通信を制限するにはイングレスを「有効」にします。そして、Conatiner Apps環境に限定するか、仮想ネットワーク内からのみに限定するかを選びます。仮想ネットワーク内からのみの通信を許可する方がVMからの通信も許可できるので制限としては緩いです。その代わり別サブネットに配置したDBなども通信出来ます。コンテナアプリ環境からの通信は後ほど試します。
イングレスタイプはコンテナへどのポート番号で接続するかという事です。今回はHTTP(80番)を選びます。もし任意のポートで接続したい(http:~:8000/api/・・・)みたいなアクセスがしたい場合はTCPを選んでください。任意のポートを指定する事が出来ます。図の設定ではクライアント側で80番で接続するとコンテナの8080番へつないでくれます。
一通り設定できたので作成しましょう。
作成が出来ましたね。ではまず普通にアクセスできない事を確認しましょう。アプリケーションURLをクリックしてみてください。
こんな感じで接続は不可になります。
さて、それでは仮想ネットワーク内からの接続を試してみましょう。同じ仮想ネットワークにVMを作成します。これについては特筆することは無いので手順は省略します。ただし、必ず同じ仮想ネットワーク内(サブネットは別でも大丈夫です)に作成してください。
・・・と、実はここからがポイントになります。実は単純に同じ仮想ネットワーク内のVMからアクセス出来るかというと大間違いで、なんとプライベートDNS設定をする必要があります。
以下がプライベートDNSゾーンの作成手順になります。登録するゾーンは先ほどアクセスを試みたURL(https://container-apps.thankfulme******-dcbc6156.westus.azurecontainerapps.io 一部ぼかします)のthanks~以下を登録します。つまり、コンテナアプリ名よりも右にあるドメインを登録します。※ちなみに以下では打ち間違えてhanks~となっていますが正しくはthanks~です。後で作り直しました汗
作成が出来たら、仮想ネットワークリンクを設定します。これはDNSゾーンを設定した仮想ネットワークで参照できるようにする設定です。
コンテナアプリが配置されている仮想ネットワークを選択します。自動登録はオンにしてください。仮想マシンで自動的にDNSを参照してくれます。
リンクが作成できたらコンテナアプリのURLのAレコードを登録します。IPアドレスはコンテナアプリの「カスタムドメイン」欄から確認出来ます。
コンテナアプリのAレコードを設定しました。vmとあるのは同じ仮想ネットワーク内に作ったVMの事です。
ここまで出来たら、いよいよVMから先ほどのコンテナアプリのURLにアクセスしてみましょう。うまくできていればアクセス後の画面が出るはずです。
やりましたね! これで同じ仮想ネットワーク内にあるサーバからのみリクエストを受け付ける事ができるコンテナが作成できました。
同じコンテナアプリ環境上のコンテナからの通信のみを許可したアプリ
続いては、もう少し通信を制限します。同じコンテナアプリ環境上のコンテナからのみの通信だけを許可し、仮想ネットワークからの通信も拒否します。
では追加でもう一つコンテナアプリを作成します。名前はconatiner-apps2とでもしておきましょうか。設定は先に作ったものと全く同じで良いですが、
ここの設定は「Conatainer Apps環境に限定」にします。では作成。
さて作成が出来たら、まずはコンテナアプリのURLを同じようにプライベートDNSのAレコードに追加します。
そして同じようにVMからアクセスすると・・・
だめでしたね。という事で先ほどと違い同じ仮想ネットワーク内であっても拒否されている事が分かります。
という事でコンテナアプリからのアクセスを試みます。
んでここまで来て気づいたのですが、僕が用意したコンテナは単にGETでhello worldを返すだけなので、今回の検証で単にURL叩くだけでは使えません。(こういうのが検証出来るように変えときゃよかった)
なので工夫が必要です。具体的には一番最初に作ったコンテナアプリのコンソール画面に入って、そこからcurlコマンドでリクエストを送ります。
先に作っておいたconatiner-apps(仮想ネットワークの通信を許可する方です)からbin/bashでコンソールに入ります。ただし、たいていのコンテナには不要なパッケージが入っていないのでcurlもありません。なのでcurlをインストールします。(初めにapt upadateとかしないとダメかもしれないのでやっとくといいね)
で、curlがインストールできたらいよいよcurl https://conatiner-apps2~のコンテナアプリ2のURLをたたくと・・・
おわかりいただけただろうか・・・?「hello world」とちゃんとレスポンスがかえって来ています。つまり、同じコンテナアプリ環境上の別のアプリからであれば通信が出来ているという事になります。
と、いう事でコンテナアプリでの通信を色々と制限しながら作成をしてみました。思いのほか記事が長くなってしまったので、試したいことの後半は次の記事に回します!
※余談ですがコンソールに入れたパッケージは一度シャットダウンしてしまうと消えてしまうので、あくまで一時作業用の環境と思っておくとがっかりしないで済みます。