チュートリアル:Azure Container Apps で Python Web アプリの継続的デプロイを構成する
この記事は、Azure Container Appsを
このチュートリアルでは、次の操作を行います。
- GitHub Actions ワークフローを使用して、コンテナー アプリの継続的デプロイを構成します。
- サンプル リポジトリのコピーに変更を加えて、GitHub Actions ワークフローをトリガーします。
- 継続的デプロイの構成で発生する可能性がある問題のトラブルシューティングを行います。
- チュートリアル シリーズの終了時に不要なリソースを削除します。
継続的デプロイは、アプリ開発ワークフローの自動化である継続的インテグレーションと継続的デリバリー (CI/CD) の DevOps プラクティスに関連しています。
次の図は、このチュートリアルのタスクを示しています。
前提 条件
継続的デプロイを設定するには、次のものが必要です。
前のチュートリアルで作成したリソース (およびその構成) には、Azure Container Registry のインスタンスと、Azure Container Apps内のコンテナー アプリが含まれます。
サンプル コード (Django または Flask) をフォークし、Azure Container Apps から接続できる GitHub アカウント。 (フォークではなくサンプル コードをダウンロードした場合は、ローカル リポジトリを GitHub アカウントにプッシュしてください)。
必要に応じて、開発環境に Git インストール
してコードを変更し、GitHub のリポジトリにプッシュします。 または、GitHub で直接変更を行うことができます。
コンテナーの継続的デプロイを構成する
前のチュートリアルでは、Azure Container Apps でコンテナー アプリを作成して構成しました。 構成の一部は、Azure Container Registry インスタンスから Docker イメージをプルすることでした。 コンテナー イメージは、コンテナー リビジョンの作成時 (コンテナー アプリを初めて設定したときなど) にレジストリからプルされます。
このセクションでは、GitHub Actions ワークフローを使用して継続的デプロイを設定します。 継続的デプロイでは、トリガーに基づいて新しい Docker イメージとコンテナー リビジョンが作成されます。 このチュートリアルで説明しているトリガーは、リポジトリの メイン ブランチでの変更、例えばプル要求による変更です。 ワークフローがトリガーされると、新しい Docker イメージが作成され、Azure Container Registry インスタンスにプッシュされ、新しいイメージを使用してコンテナー アプリが新しいリビジョンに更新されます。
Azure CLI コマンドは、Azure Cloud Shell
Windows コンピューター上の Git Bash シェルでコマンドを実行している場合は、続行する前に次のコマンドを入力します。
export MSYS_NO_PATHCONV=1
az ad sp create-for-rbac コマンドを使用して、サービス プリンシパルを作成します。
az ad sp create-for-rbac \ --name <app-name> \ --role Contributor \ --scopes "/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>"
コマンド内で:
- <アプリ名> は、サービス プリンシパルのオプションの表示名です。
--name
オプションをオフにすると、表示名として GUID が生成されます。 - <subscription-ID> は、Azure のサブスクリプションを一意に識別する GUID です。 サブスクリプション ID がわからない場合は、az account show コマンドを実行し、出力の
id
プロパティからコピーできます。 - <resource-group-name> は、Azure Container Apps コンテナーを含むリソース グループの名前です。 ロールベースのアクセス制御 (RBAC) は、リソース グループ レベルにあります。 前のチュートリアルの手順に従った場合、リソース グループの名前は
pythoncontainer-rg
。
次の手順のために、このコマンドの出力を保存します。 特に、クライアント ID (
appId
プロパティ)、クライアント シークレット (password
プロパティ)、テナント ID (tenant
プロパティ) を保存します。- <アプリ名> は、サービス プリンシパルのオプションの表示名です。
az containerapp github-action add コマンドを使用して GitHub Actions を構成します。
az containerapp github-action add \ --resource-group <resource-group-name> \ --name python-container-app \ --repo-url <https://github.com/userid/repo> \ --branch main \ --registry-url <registry-name>.azurecr.io \ --service-principal-client-id <client-id> \ --service-principal-tenant-id <tenant-id> \ --service-principal-client-secret <client-secret> \ --login-with-github
コマンド内で:
- <リソース グループ名> は、リソース グループの名前です。 このチュートリアルでは、
pythoncontainer-rg
です。 - <https://github.com/userid/repo> は、GitHub リポジトリの URL です。 このチュートリアルでは、
https://github.com/userid/msdocs-python-django-azure-container-apps
またはhttps://github.com/userid/msdocs-python-flask-azure-container-apps
です。 これらの URL では、userid
は GitHub ユーザー ID です。 - レジストリ名
は、前のチュートリアルで作成した既存の Azure Container Registry インスタンス、または使用できるインスタンスです。 - <クライアント ID> は、前の
az ad sp create-for-rbac
コマンドのappId
プロパティの値です。 ID は、00000000-0000-0000-0000-00000000
フォームの GUID です。 - <tenant-id> は、前の
az ad sp create-for-rbac
コマンドのtenant
プロパティの値です。 ID は、クライアント ID に似た GUID でもあります。 - <クライアント シークレット> は、前の
az ad sp create-for-rbac
コマンドのpassword
プロパティの値です。
- <リソース グループ名> は、リソース グループの名前です。 このチュートリアルでは、
継続的デプロイの構成では、サービス プリンシパル によって、GitHub Actions が Azure リソースにアクセスして変更できるようになります。 サービス プリンシパルに割り当てられたロールは、リソースへのアクセスを制限します。 サービス プリンシパルには、コンテナー アプリを含むリソース グループに対する組み込みの 共同作成者 ロールが割り当てられました。
ポータルの手順に従うと、サービス プリンシパルが自動的に作成されます。 Azure CLI の手順に従った場合は、継続的デプロイを構成する前にサービス プリンシパルを明示的に作成しました。
GitHub Actions を使用して Web アプリを再デプロイする
このセクションでは、サンプル リポジトリのフォークされたコピーを変更します。 その後、変更が Web サイトに自動的にデプロイされることを確認できます。
まだ作成していない場合は、サンプル リポジトリの フォーク を作成します (Django または Flask)。 GitHub または開発環境で直接、Git を使用してコマンド ラインからコードを変更できます。
サンプル リポジトリのフォークに移動し、"メイン" ブランチから開始します。
変更を加えます。
- /templates/base.html ファイルに移動します。 (Django の場合、パスは restaurant_review/templates/restaurant_review/base.html です)。
- [編集] を選択し、フレーズ
Azure Restaurant Review
をAzure Restaurant Review - Redeployed
に変更します。
編集中のページの下部で、[メイン ブランチに直接コミットする] が選択されていることを確認します。 次に、[変更のコミット]ボタンを選択します。
コミットによって GitHub Actions ワークフローが開始されます。
手記
このチュートリアルでは、メイン ブランチを直接変更する方法を示しています。 一般的なソフトウェアワークフローでは、 メイン以外のブランチ
GitHub Actions について
ワークフロー履歴の表示
ワークフロー履歴を表示する必要がある場合は、次のいずれかの手順を使用します。
ワークフロー シークレット
リポジトリに追加された .github/workflows/<ワークフロー名>.yml ワークフロー ファイルには、ワークフローのビルドおよびコンテナー アプリの更新ジョブに必要な資格情報のプレースホルダーが含まれています。 資格情報情報は、リポジトリの [
資格情報情報が変更された場合は、ここで更新できます。 たとえば、Azure Container Registry パスワードを再生成する場合は、REGISTRY_PASSWORD
値を更新する必要があります。 詳細については、GitHub ドキュメントの 暗号化されたシークレット を参照してください。
OAuth によって承認されたアプリ
継続的デプロイを設定するときは、GitHub アカウントの承認された OAuth アプリとして Azure Container Apps を指定します。 Container Apps では、承認されたアクセスを使用して、.github/workflows/<workflow-name>.ymlで GitHub Actions YAML ファイルを作成します。 [統合]>[アプリケーション]で、承認されたアプリを表示し、アカウントのアクセス許可を取り消すことができます。
トラブルシューティング
Azure CLI を使用してサービス プリンシパルを設定しているときにエラーが発生する
このセクションは、Azure CLI az ad sp create-for-rba
コマンドを使用して、サービス プリンシパルの設定中に発生するエラーのトラブルシューティングに役立ちます。
"InvalidSchema: 接続アダプターが見つかりませんでした" というエラーが表示された場合:
実行しているシェルを確認します。 Bash シェルを使用している場合は、
MSYS_NO_PATHCONV
変数をexport MSYS_NO_PATHCONV=1
として設定します。詳細については、Git Bash シェルから Azure CLI でサービス プリンシパルを作成できない
GitHub の問題を参照してください。
"複数のアプリケーションが同じ表示名を持つ" というエラーが表示される場合:
- サービス プリンシパルの名前は既に取得されています。 別の名前を選択するか、
--name
引数を省略します。 GUID は表示名として自動的に生成されます。
GitHub Actions ワークフローに失敗しました
ワークフローの状態を確認するには、リポジトリの [アクション] タブに移動します。
- 失敗したワークフローがある場合は、ワークフロー ファイルの詳細を確認します。 ビルドとデプロイという 2 つのジョブが必要です。 失敗したジョブの場合は、ジョブのタスクの出力を調べて問題を探します。
- "TLS ハンドシェイク タイムアウト" を含むエラー メッセージがある場合は、ワークフローを手動で実行します。 リポジトリの [アクション] タブで、[自動デプロイのトリガー] を選択して、タイムアウトが一時的な問題であるかどうかを確認します。
- このチュートリアルに示すようにコンテナー アプリの継続的デプロイを設定すると、ワークフロー ファイル (.github/workflows/<workflow-name>.yml) が自動的に作成されます。 このチュートリアルでは、このファイルを変更する必要はありません。 変更した場合は、変更を元に戻し、ワークフローを試してください。
メイン ブランチでマージした変更が Web サイトに表示されない
GitHub で次の手順を実行します。
- GitHub Actions ワークフローが実行されていること、およびワークフローをトリガーするブランチに変更をチェックインしたことを確認します。
Azure portal で次の手順を実行します。
Azure Container Registry インスタンスを調べて、ブランチに変更した後にタイムスタンプを使用して新しい Docker イメージが作成されたかどうかを確認します。
コンテナー アプリのログを調べて、プログラミング エラーがあるかどうかを確認します。
- コンテナー アプリに移動し、リビジョン管理><アクティブなコンテナー>>リビジョンの詳細>コンソール ログに移動します。
- 列の表示順序を選択して、生成時刻、Stream_s、および Log_sを設定します。
- 最新のログを並べ替え、Stream_s 列で Python
stderr
とstdout
メッセージを探します。 Python のprint
出力はstdout
メッセージです。
Azure CLI で次の手順を実行します。
- az containerapp logs show コマンドを使用します。
継続的デプロイを停止したい
継続的デプロイを停止するということは、コンテナー アプリをリポジトリから切断することを意味します。
Azure portal で次の手順を実行します。
- コンテナー アプリに移動します。 サービスメニューで、[継続的デプロイ] を選択し、[切断] を選択します。
Azure CLI で次の手順を実行します。
- az container app github-action remove コマンドを使用します。
切断した後:
- .github/workflows/<workflow-name>.yml ファイルがリポジトリから削除されます。
- シークレット キーはリポジトリから削除されません。
- Azure Container Apps は、GitHub アカウントの承認された OAuth アプリとして残ります。
- Azure では、コンテナーは最後にデプロイされたコンテナーのままにされます。 新しいコンテナー リビジョンが最新のイメージを取得できるように、コンテナー アプリを Azure Container Registry インスタンスに再接続できます。
- Azure では、継続的デプロイに作成して使用したサービス プリンシパルは削除されません。
リソースの削除
チュートリアル シリーズを使い終えて、追加のコストを発生させたくない場合は、使用したリソースを削除します。
リソース グループを削除すると、グループ内のすべてのリソースが削除され、リソースを最も簡単に削除できます。 リソース グループを削除する方法の例については、「Containerize tutorial cleanup」を参照してください。
関連コンテンツ
このチュートリアルを基に構築する場合は、次の手順を実行できます。
- Azure Container Apps でスケーリング 規則を設定する
- Azure Container Apps でカスタム ドメイン名と証明書をバインドする
- Azure Container Apps でアプリを監視する