Closed2

Azure Container Apps のアドオン

Takeshi YaegashiTakeshi Yaegashi

Azure Container Apps の環境には、開発・テスト用途のデータベースなどの開発サービス (dev service) を簡単にデプロイできる「アドオン」という機能がある。

https://learn.microsoft.com/ja-jp/azure/container-apps/services

アドオンは Azure Portal でも操作できるが、すべての機能を活用するには Azure CLI (containerapp 拡張) や ARM テンプレートを使う必要がある。

az containerapp add-on --help を実行すると利用可能なアドオンの一覧を得ることができる。

$ az containerapp add-on --help

Group
    az containerapp add-on : Commands to manage add-ons available within the environment.
        This command group is in preview and under development. Reference and support levels:
        https://aka.ms/CLI_refstatus
Subgroups:
    kafka    : Commands to manage the kafka add-on for the Container Apps environment.
    mariadb  : Commands to manage the mariadb add-on for the Container Apps environment.
    milvus   : Commands to manage the milvus add-on for the Container Apps environment.
    postgres : Commands to manage the postgres add-on for the Container Apps environment.
    qdrant   : Commands to manage the qdrant add-on for the Container Apps environment.
    redis    : Commands to manage the redis add-on for the Container Apps environment.
    weaviate : Commands to manage the weaviate add-on for the Container Apps environment.

Commands:
    list     : List all add-ons within the environment.

To search AI knowledge base for examples, use: az find "az containerapp add-on"

このうち redispostgres にはチュートリアルの記事があるので、これを一通りやってみるとcontainerapp 拡張やリソースプロバイダ登録などのセットアップ手順について概ね把握することができる。

https://learn.microsoft.com/ja-jp/azure/container-apps/connect-services

https://learn.microsoft.com/ja-jp/azure/container-apps/tutorial-dev-services-postgresql

Takeshi YaegashiTakeshi Yaegashi

Azure Container Apps の環境でアドオンを作成すると、環境と同じリソースグループにコンテナアプリがデプロイされる。例えば redispostgres のアドオンがデプロイするのは一般的なデータベースのコンテナアプリであり、環境内部専用の TCP イングレスにより別のコンテナアプリからの接続を待つ。

アドオンのコンテナアプリが提供するのは開発サービス (dev service) であり、これを本番サービス向けに使うことは推奨されていない。レプリカのスケーリングは最小0・最大1に設定され、データはコンテナ内部の永続化ボリュームで保持する。開発サービスへの接続がない状態がしばらく続くとレプリカが自動的に0にスケールインするので、開発・テスト環境インフラの費用を効果的に抑えることができる。

なおレプリカの数が0になってコンテナアプリが停止してもデータが失われることはないので、Azure Container Appsの一般コンテナアプリでは使えない特殊な永続化ボリュームがアドオンでは使われているように思われる。アドオンのコンテナアプリのスペック変更はできず、コンソール接続も拒否されるので、詳細は不明である。

開発サービスは別のコンテナアプリにバインドできる。バインドにより開発サービスの接続情報が環境変数としてコンテナアプリに提供されるので、これを利用すればデータベースの接続設定などが簡単になる。

コンテナアプリ環境で myredis という名前の redis アドオンを追加:

az containerapp add-on redis create --resource-group <RG-NAME> --environment <ENV-NAME> -n myredis

コンテナアプリに myredis をバインド:

az containerapp update --resource-group <RG-NAME> --name <APP-NAME> --bind myredis

コンテナアプリで設定される環境変数の例:

REDIS_ENDPOINT=myredis:6379
REDIS_HOST=myredis
REDIS_PASSWORD=GTQ2e1E0XvotbgirhOUKhbZhUh5uBI55RBtcA9VPegVmM1tyvT75MPptWrphCcQcC6YfCWCYM0T17wTz5ICmWuojXLMgzYFYIQVmBHQ6RQRMhmz4kQA7j8iZIc6CSa3b
REDIS_PORT=6379
MYREDIS_REDIS_ENDPOINT=myredis:6379
MYREDIS_REDIS_HOST=myredis
MYREDIS_REDIS_PASSWORD=GTQ2e1E0XvotbgirhOUKhbZhUh5uBI55RBtcA9VPegVmM1tyvT75MPptWrphCcQcC6YfCWCYM0T17wTz5ICmWuojXLMgzYFYIQVmBHQ6RQRMhmz4kQA7j8iZIc6CSa3b
MYREDIS_REDIS_PORT=6379

--bind オプションで Azure Cache for Redis のようなマネージドサービスをバインドすることもできる。ただしこの方法を使う場合、マネージドサービスのリソースはコンテナアプリと同じリソースグループに存在しないといけないらしい。 --bind リソース名 の形式で指定するが、リソース名に - が含まれるとうまくいかないので、その場合は --bind リソース名:サービス名 の形式で別名を指定する。

az containerapp update --resource-group <RG-NAME> --name <APP-NAME> --bind redis1-cache:redis1_cache

マネージドサービス Azure Cache for Redis のバインドでコンテナアプリに設定される環境変数の例:

AZURE_REDIS_DATABASE=0
AZURE_REDIS_HOST=redis1-cache.redis.cache.windows.net
AZURE_REDIS_PASSWORD=ADCY93kEoCbIzQhgkpHlDsd2GAFPbj2R2AzCaFcRwDo=
AZURE_REDIS_PORT=6380
AZURE_REDIS_SSL=true

このように開発サービスをバインドした場合の環境変数とは名前が異なるが、それをうまく吸収するようにコンテナアプリを作れば、開発サービスと本番用マネージドサービスとで接続を簡単に切り替えられるようになる。サンプルアプリapp.go などが参考になる。

--bind オプションで Azure Database for PostgreSQL などのマネージドなデータベースをバインドする場合は、データーベース名・ユーザー名・パスワードを指定する必要がある。

az containerapp update --resource-group <RG-NAME> --name <APP-NAME> --bind redis1-psql:redis1_psql,database=<DATABASE>,username=<USERNAME>,password=<PASSWORD>

なお --bind オプションによるマネージドサービスのバインドがやることは、実際にはサービスコネクタの作成と同じである。

https://learn.microsoft.com/ja-jp/azure/service-connector/overview

az containerapp connection など通常の方法でサービスコネクタを作成すれば、同じリソースグループ内のリソースに限定されることなく、マネージドIDなどの安全な認証方式の選択や、環境変数名の変更といった細かいカスタマイズができる。

このスクラップは27日前にクローズされました