1
0

Azure Cloud Shellでの複数コンテナーApp Service作成

Last updated at Posted at 2024-07-14

image.png
作成日:2024年7月15日(月)

1.はじめに

AzureでDocker Composeを使用して様々なアプリケーションを手軽に動作させる環境を構築するため、ACI(Azure Container Instances)を調べていました。
しかし、ACIをクライアントPCから構築する際に、個人環境では問題ありませんが、企業プロキシ環境でも同じ手順で動作するのか不安になってきました。

そこで、調べを進めたところACIはAzure Cloud Shellからも構築できることが分かりました。
Azure Cloud ShellはAzureポータル上でCloudShell用マシンを立ち上げ、そのマシンからAzure CLIやAzure Developer CLIなどのAzureの操作を行える環境です。

このページではAzure Cloud ShellでDocker Composeを動作させるまでを前提に調べた内容を整理します。

2.Azure Cloud Shellとは

Azure Cloud Shellは、Azureポータルから直接アクセスできるブラウザベースのシェル環境です。
Azureポータルの右上の「プロンプトアイコン」をクリックすることでAzure Cloud Shellを起動することができます。
Azure Cloud Shellを使用するとローカルPCでAzure CLIなどの環境を設定することなく、Azureの管理やスクリプトの実行が可能です。
Cloud ShellにはBashとPowerShellの2つの環境があり、用途に応じて使い分けることができます。
正直に言うと、Visual Studio Codeの拡張機能のAzure AccountやAzure App Serviceなどのツールの方が使いやすいですが、
Visual Studio Codeの拡張機能のAzure Accountは何故か企業プロキシ環境で正しく動作してくれません。
従って、企業プロキシ環境に依存しない、Azure Cloud Shellは選択肢としてはありです。

AzureCloudShellIcon.png

3.特徴

No 特徴 説明
1 ブラウザベース Azure Cloud Shellはブラウザ上で、インターネットに接続された任意のデバイスからAzureポータル経由でアクセスできます。インストール不要で、どこからでもAzureリソースの管理が可能です。
2 統合シェル BashシェルとPowerShellの両方をサポートしています。ユーザーは自身のニーズに合わせてシェル環境を選択できます。
永続ストレージ Azure Cloud Shellに永続的なクラウドストレージ(Azure File Share)を割り当てると、ユーザーのファイルやスクリプトを保存して再利用できます。このストレージはシェル環境を再起動してもデータが保持されます。
4 Azureツールのプリインストール Azure CLI、Azure PowerShellモジュール、Terraform、Kubernetes CLI (kubectl)など、さまざまなAzure管理ツールが事前にインストールされています。これにより、ユーザーはすぐに作業を開始できます。
5 セキュリティ Azure Cloud ShellはAzureの認証メカニズムを使用しており、セキュアなアクセスを提供します。また、ブラウザ上のセッションは自動的にタイムアウトし、セキュリティが強化されています。

4.機能

Azure Cloud Shellにプリインストールされているツールの最新は「Azure Cloud Shell の機能とツール」ページで確認が可能です。
Docker Composeでアプリケーションを構築する際は、通常GitHubなどからGitコマンドでデプロイし、Docker Composeコマンドでコンテナーを実行するため、必要なコンポーネントは予め揃っているようです。

No カテゴリ プリインストールされているツール 備考
1 Azure ツール Azure CLI, Azure PowerShell, Azure Functions Core Tools
2 プログラミング言語 .NET Core, Python, Node.js, Java, Ruby, Go
3 データベースツール MySQL クライアント, PostgreSQL クライアント, SQL Server クライアント
4 開発ツール Git, Visual Studio Code (Cloud Shell エディター)
5 コンテナツール Docker, Kubernetes (kubectl) Docker Composeも含まれているようです
6 テキストエディタ vim, nano, emacs
7 ユーティリティ jq (JSONプロセッサ), sed, grep, awk
8 その他 Terraform, Ansible

ストレージ アカウントを使用するように Cloud Shell を構成した場合は、独自のツールをインストールできます。 ルート アクセス許可を必要としない任意のツールをインストールできます。 たとえば、Python モジュール、PowerShell モジュール、Node.js パッケージ、およびwget を使用してインストールできるほとんどのパッケージをインストールできます。

5.設定

No 項目 説明 備考
1 シェル環境 Cloud Shell では、 Bash または PowerShell を選択できます。 この設定はCloud Shell ツール バーの環境セレクターを使用していつでも変更できます。直近で使用した環境が、次のセッションの既定になります。
2 ストレージアカウント ストレージ アカウントは、BLOBやファイル、キュー、テーブルなどのAzure Storageデータオブジェクトを含む、一意の名前空間を提供するクラウドストレージの管理単位です
3 ファイル共有 ファイル共有は、クラウド上でSMBプロトコルを使用してアクセス可能な共有ファイルストレージサービスです

Azure Cloud Shell設定後に作成されるリソース

No 項目 説明
1 ストレージアカウント Production-cs [Azureポータル]⇒[ストレージアカウント]で確認できます。
2 共有ファイル pft-cloud-shell [Azureポータル]⇒[ストレージアカウント]⇒<作成したストレージアカウント>⇒[データストレージ]⇒[ファイル共有]で確認できます。

5.1 シェル環境

Azure Cloud Shellへようこそ.png

5.2 ストレージアカウントと仮想ネットワーク

Azure Cloud Shellでは永続ストレージを割り当てることでShellスクリプトやdocker-compose.yamlファイルなどの永続維持が可能となります。
永続ストレージを割り当てる際には「ストレージアカウントをマウント」するを選択する必要があります。

ACS_作業の開始.png

ここで「既存のプライベート仮想ネットワークを使用する」にチェックを入れると、ストレージアカウント名、仮想ネットワーク、ネットワークプロファイル、リレー名前空間の選択を求められます。
新規の場合は「既存のプライベート仮想ネットワークを使用する」のチェックはいれないことをお勧めします。

仮想ネットワークの構成の選択.png

5.3 ストレージアカウント

Azure Cloud Shellのウィザードでストレージアカウントを作成すると「ストレージアカウント」配下にSMBプロトコルを使用してアクセス可能な「ファイル共有」という「共有ファイルストレージサービス」を作成します。

ACS_ストレージアカウントの作成.png

No 項目 記入例 説明 備考
1 サブスクリプション Azure subscription サブスクリプション名を選択します。
2 リソースグループ Producetion-RG リソースグループ名を選択します。
3 リージョン (アジア太平洋)東南アジア リージョンは以下の7つから選択する必要があります。
アメリカ合衆国
 ①米国東部、②米国中南部、③米国西部
ヨーロッパ
 ④北ヨーロッパ、⑤西ヨーロッパ
アジア太平洋
 ⑥インド中部、⑦東南アジア
4 ストレージアカウント名 ptfcloudshell Cloud Shell用のストレージアカウント名を指定します。 ハイフンやアンダースコアは指定できません
5 共有ファイル pft-cloud-shell Cloud Shell用の共有ファイル名を指定します。 共有ファイルには[Azureポータル]⇒[ストレージアカウント]⇒<作成したストレージアカウント>⇒[データストレージ]⇒[ファイル共有]⇒<作成した共有ファイル>⇒左側ペインの[参照]からアクセスできます。
参照画面でアップロードも可能です。

ACS_デプロイが進行中です.png

ACS_Disk.png

hogehoge [ ~ ]$ pwd
/home/hogehoge
hogehoge [ ~ ]$ df -k
Filesystem                                            1K-blocks    Used Available Use% Mounted on
overlay                                                51606304     604  48967876   1% /
tmpfs                                                     65536       0     65536   0% /dev
shm                                                       65536       0     65536   0% /dev/shm
/dev/sdc                                               51606304     604  48967876   1% /etc/hosts
tmpfs                                                   1843444       0   1843444   0% /sys/fs/cgroup
//ptfcloudshell.file.core.windows.net/ptf-cloud-shell   6291456 5242880   1048576  84% /usr/csuser/clouddrive
/dev/loop0                                              5150368     132   4888092   1% /home/portfolio997
hogehoge [ ~ ]$ 
hogehoge [ ~ ]$ ls -l
total 0
lrwxrwxrwx 1 hogehoge hogehoge 22 Jul 14 02:07 clouddrive -> /usr/csuser/clouddrive
hogehoge[ ~ ]$ 

この例では/home/hogehoge/clouddriveに6,291,456 K blocks=約6 GiB(6,291,456 ÷ 1024 ÷ 1024)のストレージが割り当たりました。

1か月の維持費はPerplexity AIで以下のように約20円と算出できました。

6GiBは約6.44GB(1GiB = 1.074GB)なので、計算すると:
6.44GB * 0.02 USD/GB/月 ≈ 0.13 USD/月
したがって、6GiBのストレージを1か月維持するための概算コストは約0.13 USD(約20円)となります。

6.使い方

Azure Cloud ShellでAzure App Serviceのプレビュー版の複数コンテナー(multi-container)を操作することができます。
ここではAzure App Serviceの複数コンテナー(multi-container)でDockerイメージベースのDocker Composeを動作させる方法をまとめます。

6.1 Azure App Service プランの作成

①App Serviceプランの作成

az appservice plan create --name ptfappplan2 --resource-group Production-RG --sku B1 --is-linux --location japaneast
No 項目 引数 説明 備考
1 サブコマンド appservice plan create App Service プランを作成する。
2 アプリプラン名 --name ptffafppplan2 新しい App Service プランの名前。
3 リソースグループ名 --resource-group Production-RG リソース グループの名前。
az group list --output tableのNameで確認できるリソースグループ名
4 SKU --sku B1 価格レベル (例: F1(Free)、D1(Shared)、B1(Basic Small)、B2(Basic Medium)、B3(Basic Large)、S1(Standard Small)、P1V2(プレミアム V2 Small)、PC2 (プレミアム Container Small)、PC3 (プレミアム Container Medium)、PC 4 (プレミアム Container Large)、I1 (Isolated Small)、I2 (Isolated Large)、I3 (Isolated Large)、I1v2 (Isolated V2 Small)、I2v2 (Isolated V2 Medium)、I3v2(Isolated V2 Large) K1(Kubernetes)。 B2の趣味レーションで月額27.01 USDと表示されます。
5 プラットフォーム --is-linux --hyper-v
 WindowsコンテナーでWebアプリをホストします。
--is-linux
 Linux workerでWebアプリをホストします。
6 リージョン --location japaneast az account list-locations --output tableのNameで確認できるリージョンを指定

App_SKU価格.png

②作成したApp Serviceプランの確認

 az appservice plan list --output table

portfolio997 [ ~/clouddrive/growi ]$ az appservice plan list --output table
ElasticScaleEnabled    FreeOfferExpirationTime     HyperV    IsSpot    IsXenon    Kind    Location    MaximumElasticWorkerCount    MaximumNumberOfWorkers    Name         NumberOfSites    NumberOfWorkers    PerSiteScaling    Reserved    ResourceGroup    Status    TargetWorkerCount    TargetWorkerSizeId    ZoneRedundant
---------------------  --------------------------  --------  --------  ---------  ------  ----------  ---------------------------  ------------------------  -----------  ---------------  -----------------  ----------------  ----------  ---------------  --------  -------------------  --------------------  ---------------
False                  2024-08-13T09:21:09.360000  False     False     False      linux   Japan East  1                            3                         ptfappplan   1                1                  False             True        Production-RG    Ready     0                    0                     False
False                  2024-08-13T09:42:51.883333  False     False     False      linux   Japan East  1                            3                         ptfappplan2  0                1                  False             True        Production-RG    Ready     0                    0                     False
portfolio997 [ ~/clouddrive/growi ]$ 

6.2 Docker Composeアプリの作成

ここではMicrosoftの「Docker Compose 構成を使用してマルチコンテナー (プレビュー) アプリを作成する」ページで紹介されている複数コンテナーのWordPressを動作させてみます。

①git clone

 AzureポータルのAzure Cloud Shellの共有ファイル(/home/hogehoge/clouddrive)にGitHubのhttps://github.com/Azure-Samples/multicontainerwordpressをデプロイします。

コマンド

**git clone https://github.com/Azure-Samples/multicontainerwordpress**

実行例

hogehoge [ ~/clouddrive ]$ pwd
/home/hogehoge/clouddrive
hogehoge [ ~/clouddrive ]$ git clone https://github.com/Azure-Samples/multicontainerwordpress
Cloning into 'multicontainerwordpress'...
remote: Enumerating objects: 83, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 83 (delta 25), reused 23 (delta 23), pack-reused 50
Receiving objects: 100% (83/83), 28.49 KiB | 162.00 KiB/s, done.
Resolving deltas: 100% (35/35), done.
hogehoge  [ ~/clouddrive ]$ 

②Docker Compose Webアプリの作成

AzureポータルのAzure Cloud ShellのAzure CLIを使用してAzure App Serviceの複数コンテナー(multi-container)を作成します。

コマンド

**az webapp create --resource-group Production-RG --plan ptgappplan2 --name ptf-wordpress --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml**

実行例

portfolio997 [ ~/clouddrive ]$ pwd
/home/portfolio997/clouddrive
portfolio997 [ ~/clouddrive ]$ cd multicontainerwordpress
portfolio997 [ ~/clouddrive/multicontainerwordpress ]$ az webapp create --resource-group Production-RG --plan ptgappplan2 --name ptf-wordpress --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

※Azure App Serviceの複数コンテナーアプリを作成するとアプリケーションは自動起動されるのですが、これには数分の時間を要します。
https://github.com/Azure-Samples/multicontainerwordpressの場合、最初にMySQLより先にWordPressサービスが立ち上がってくるため、最初はDB接続エラーとなりますが、しばらくすると正常に動作します。

6.3 Docker Composeの動作確認

Azure App ServiceのマネージドサービスであるKuduに接続してLog stream、Bashで確認
※Kuduにアクセスするさいにパスワード認証を求められる場合は[Azureポータル]⇒[App Service]⇒<作成したサービス>⇒[デプロイセンター]⇒[発行プロファイルの管理]で「発行プロファイルのダウンロード」を行い
 ダウンロードしたprofile.publishsettingsのXML中に書かれているuserName、userPWDを用いてKuduサイトにアクセスします。


[https://ptf-wordpress.scm.azurewebsites.net/](https://ptf-wordpress.scm.azurewebsites.net/api/logs/docker)

ブラウザの別タグでhttps://ptf-wordpress.azurewebsites.net/にアクセス後
Kuduサイト(https://ptf-wordpress.scm.azurewebsites.net/api/logs/docker)のLog streamで起動されたことをLogで確認します。

App_kudu_Logstream.png

Kuduサイト(https://ptf-wordpress.scm.azurewebsites.net/api/logs/docker)のBashでサインインできます。

但し/home/LogFilesでDockerのログは確認できるものの、Docker
App_kudu_Bash.png
App_kudu_Bash_prompt.png

6.4 Azure-Samples/multicontainerwordpressへの接続確認

実際に登録したhttps://github.com/Azure-Samples/multicontainerwordpressのサービスにアクセスして接続確認を行います。

①サービスサイトにアクセスします。

https://ptf-wordpress.azurewebsites.net/

wp_install_language.png

「日本語」を選択して「次へ」をクリックします。

wp_install_account.png

wp_install_success.png

ユーザ登録を行い「ログイン」をクリックします。

wp_signin.png

登録したユーザでログインします。
wp_screen.png

7.その他の複数コンテナーアプリケーション

Microsoftのサンプルが動作したので、目的のGrowiやDifyを動かしたみました。
結果は以下の通りで残念な結果となりました。

No アプリケーション 状況 備考
1 Growi DockerFileによるbuildが必要なため、動作せず
2 Dify docker-compose.yamlファイルの4,000文字制限に引っ掛かり動作せず コメントや不要な定義を削ってみましたが、4,000文字

8.制限事項

No 制限 説明 備考
1 認証/認可 IDプロバイダーを登録する「認証」メニューは非活性となっていいます。
2 マネージドID
3 CORS
4 仮想ネットワーク統合(VNet統合) App ServiceからVnetへの通信を司るVNet統合機能は利用不可です。
ログサーバやAIの知識データベースなどをVNetに配置することができません。
5 Docker Compose構成ファイルの4,000文字制限 docker-compose.ymlファイルの文字数が4,000文字に制限されています。 Difyはdocker-compose.yamlファイルが4000文字を超えるため、「Linux Version is too long. It cannot be more than 4000 characters.」エラーとなりました(*1)
6 DockerFileによるbuild Dockerイメージの作成は未サポートです。 growiなどはbuildがあるためApplication Errorとなりました
7 Docker Compose構成ファイルのdepend_on 無視されます
8 Docker Compose構成ファイルのnetwork 無視されます
9 Docker Compose構成ファイルのsecrets 無視されます
10 Docker Compose構成ファイルのports 無視されます
11 Docker Compose構成ファイルの環境変数 docker とは異なる、$variable and ${variable} のような既定の環境変数

(*1)GitHubのissues#22022での見解
https://github.com/Azure/azure-cli(GitHub)のissues#22022ではこの問題を現状の仕様としてクローズしています。
https://github.com/Azure/azure-cli/issues/22022

8.感想

  • Azure App Serviceの複数コンテナーは1アプリケーション
    Azure App Serviceの単一コンテナーでは1サービスあたり、1コンテナーだったのに対し、複数コンテナーは1サービスあたり、複数コンテナーを実現しています。
    従って、Azure App Serviceの課金も1サービスとしての課金となります。
    1つのアプリケーションを複数の単一コンテナーで起動することも検討しましたが、これではApp Serviceの低価格というメリットが半減してしまいます。
    このことはメリットに感じました。
  • Azure Cloud ShellのDocker Clientについて
    Azure App Serviceの複数コンテナーはプレビューなので今後に期待ですが、
    Azureポータル経由でセキュリティを確保しているAzure Cloud ShellでDocker Clientが実装されているのにも関わらず宝の持ち腐れ感があります。
    Dockerはサーバー・クライアントモデルですので、App Service内のDocker Daemon(Docker Engine)にAzure Cloud Shellから接続させて欲しかったです。
    期待はAzure Cloud ShellでDOCKER_HOSTで指定したApp Service内のDocker Daemonを「docker compose ps」などで状態確認したかったです。
    実際にDOCKER_HOSTをApp Serviceに向けて接続をここと見ましたが接続できませんでした。(証明書やアクセスコントロールの課題があるのだと思います)
    DockerコマンドやDocker Composeコマンドが利用できないことでアプリが動作しなかったときのデバッグの難易度が上がります。
  • Azure App Serviceの複数コンテナーについて
    制限事項が多すぎます。
    致命的なのはDockerFileによるbuildの未サポート、Docker Compose構成ファイルの4,000文字制限です。
    Dockerイメージでの配布も多くなってきましたが、GitHubの多くのアプリケーションはDockerFileによるbuildを伴うものです。
    Azure Cloud Shellでbuildができないため、クライアントPCなどでbuildしたDockerイメージをACR(Azure Container Registry)などにアップしなければ実行できません。
    結局のとことローカルPC環境が必要となります。
    私はDify-0.6.13を動作させたかったのですが、Docker Compose構成ファイルの4,000文字制限にひっかかり動作を断念しています。
  • クローズド環境での動作
    Azure App Serviceの閉域化にはプライベートエンドポイントと仮想ネットワーク統合(VNet統合)が必要不可欠ですが、2024年7月15日時点で仮想ネットワーク統合(VNet統合)が制限で使用できません。
    これでは会社の環境で使用できないため、残念で仕方がありません。
  • 認証/認可
    Azure App Serviceの利点である、App Service内臓のリバースプロキシによる認証/認可機能が使用できないため、IDプロバイダーを指定したアクセスコントロールができません。
    アプリケーション層での認証/認可の実装はかなり面倒なプログラム開発となるため、この機能が使えないと非常に困ります。
    現状はアプリケーション層でIDaaS(IDプロバイダー)に対応しているアプリに限定されてしまいそうです。

9.留意事項

  • プレビュー版のApp Serviceの複数コンテナーは現状用途を限定されてしまう
    Azure Cloud ShellのDocker Clientの問題、Azure App Serviceの複数コンテナーの制限事項、VNet統合・認証プロバイダーの未サポートといった理由によりまだまだ発展途上です。
    AWS Lightsail程度の動作を期待していただけに残念でした。
    PaaSはOSセキュリティパッチなどの作業を低減できるため、活用していきたいのですが、Azureでは現状IaaSを選択するしかなさそうです。

10.参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0