Worker サービスを Azure にデプロイする
この記事では、.NET Worker サービスを Azure にデプロイする方法について説明します。 Azure Container Registry (ACR) から Azure コンテナー インスタンス (ACI) として実行した Worker は、クラウド内のマイクロサービスとして機能することができます。 長時間実行されるサービスには多くのユース ケースがあり、Worker サービスはそのために存在します。
このチュートリアルで学習する内容は次のとおりです。
- Worker サービスを作成します。
- コンテナー レジストリ リソースを作成します。
- コンテナー レジストリにイメージをプッシュします。
- コンテナー インスタンスとしてデプロイします。
- Worker サービスの機能を確認します。
ヒント
".NET でのワーカー" のサンプル ソース コードはすべて、サンプル ブラウザーでダウンロードできます。 詳細については、コード サンプルの参照: .NET でのワーカーに関するページをご覧ください。
前提条件
- .NET 5.0 SDK 以降。
- Docker Desktop (Windows または Mac)。
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- 開発者環境の選択に応じて:
新しいプロジェクトを作成する
Visual Studio を使用して新しい Worker サービス プロジェクトを作成するには、[ファイル]>[新規]>[プロジェクト] を選択します。[新しいプロジェクトの作成] ダイアログで "Worker サービス" を検索し、Worker サービス テンプレートを選択します。 適当なプロジェクト名を入力し、適切な場所を選択して、[次へ] を選択します。 [追加情報] ページの [ターゲット フレームワーク] で .NET 5.0
を選択し、[Enable Docker]\(Docker を有効にする\) オプションをオンにして Docker のサポートを有効にします。 目的の Docker OS を選択します。
Visual Studio Code で新しい Worker サービス プロジェクトを作成するには、統合ターミナルから .NET CLI コマンドを実行できます。 詳細については、Visual Studio Code の統合ターミナルに関する記事を参照してください。
統合ターミナルを開き、dotnet new
コマンドを実行します。<Project.Name>
は目的のプロジェクト名に置き換えます。
dotnet new worker --name <Project.Name>
.NET CLI の new worker サービス プロジェクト コマンドの詳細については、「dotnet new worker」を参照してください。
.NET CLI を使用して新しい Worker サービス プロジェクトを作成するには、作業ディレクトリで好みのターミナルを開きます。 dotnet new
コマンドを実行し、<Project.Name>
を目的のプロジェクト名に置き換えます。
dotnet new worker --name <Project.Name>
.NET CLI の new worker サービス プロジェクト コマンドの詳細については、「dotnet new worker」を参照してください。
アプリケーションをビルドして、依存パッケージが復元され、エラーなしでコンパイルされることを確認します。
Visual Studio からアプリケーションをビルドするには、F6 キーを押すか、[ビルド]>[ソリューションのビルド] メニュー オプションを選択します。
Visual Studio Code からアプリケーションをビルドするには、統合ターミナル ウィンドウを開き、作業ディレクトリから dotnet build
コマンドを実行します。
dotnet build
.NET CLI の build コマンドの詳細については、「dotnet build
」を参照してください。
.NET CLI からアプリケーションをビルドするには、作業ディレクトリから dotnet build
コマンドを実行します。
dotnet build <path/to/project.csproj>
<path/to/project.csproj>
の値を指定します。これは、ビルドするプロジェクト ファイルへのパスです。 .NET CLI の build コマンドの詳細については、「dotnet build
」を参照してください。
Docker サポートの追加
新しい Worker プロジェクトを作成するときに [Enable Docker]\(Docker を有効にする\) チェック ボックスを正しくオンにした場合は、「Docker イメージを構築する」ステップに進みます。
このオプションをオンにしなかった場合でも、心配はありません。今でもまだ追加できます。 Visual Studio では、ソリューション エクスプローラーで "プロジェクト ノード" を右クリックし、[追加]>[Docker サポート] を選択します。 [ターゲット OS] の選択を求められたら、既定の OS を選んで [OK] を選択します。
Visual Studio Code では、Docker 拡張機能と Azure Account 拡張機能をインストールする必要があります。 コマンド パレットを開き、[Docker: Add Docker files to workspace]\(Docker: Docker ファイルをワークスペースに追加する\) オプションを選択します。 アプリケーション プラットフォームの選択を求めるメッセージが表示されたら、[.NET: Core Console]\(.Net: コア コンソール\) を選択します。 プロジェクト選択を求めるメッセージが表示されたら、作成した Worker サービス プロジェクトを選択します。 オペレーティング システムの選択を求めるメッセージが表示されたら、一覧の先頭にある OS を選択します。 オプションの Docker Compose ファイルを含めるかどうかを確認するメッセージが表示されたら、[いいえ] を選択します。
Docker のサポートには Dockerfile が必要です。 このファイルは、.NET Worker サービスを Docker イメージとして構築するための包括的な命令のセットです。 Dockerfile は、ファイル拡張子の "ない" ファイルです。 Dockerfile のコードの例を次に示します。これは、プロジェクト ファイルのルート ディレクトリに存在する必要があります。
CLI では、Dockerfile は自動的に作成されません。 この内容を、プロジェクトのルート ディレクトリにある Dockerfile という名前の新しいファイルにコピーします。
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["App.CloudService.csproj", "./"]
RUN dotnet restore "App.CloudService.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "App.CloudService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "App.CloudService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.CloudService.dll"]
Note
Dockerfile で、*App.CloudService を参照しているさまざまな行を更新する必要があります。これを実際のプロジェクトの名前に置き換えます。
公式の .NET イメージの詳細については、「Docker Hub: .NET Runtime (Docker Hub: .NET Runtime ランタイム)」と「Docker Hub: .NET SDK」を参照してください。
Docker イメージを構築する
Docker イメージをビルドするには、Docker エンジンが実行されている必要があります。
重要
Docker Desktop と Visual Studio を使用するとき、"ボリューム共有" に関連するエラーが発生しないようにするには、それが有効になっていることを確認します。
- Docker Desktop の [Settings]\(設定\) 画面で、[Shared Drives]\(共有ドライブ\) を選択します。
- プロジェクト ファイルが含まれるドライブを選択します。
詳細については、「Docker を使用した Visual Studio 開発のトラブルシューティング」を参照してください。
ソリューション エクスプローラーで Dockerfile を右クリックし、[Docker イメージのビルド] を選択します。 docker build
コマンドの進行状況を報告する [出力] ウィンドウが表示されます。
エクスプローラーで Dockerfile を右クリックし、[イメージのビルド] を選択します。 イメージに付けるタグの指定を求められたら、「appcloudservice:latest
」と入力します。 [Docker Task]\(Docker タスク\) 出力ターミナルが表示され、Docker ビルド コマンドの進行状況が報告されます。
Note
イメージにタグを付けるように "求められない" 場合は、Visual Studio Code が既存の tasks.json に依存している可能性があります。 使用されているタグが望ましくない場合は、docker-build
配列で dockerBuild/tag
構成項目の tasks
値を更新することで変更できます。 次のような構成セクションの例について考えます。
{
"type": "docker-build",
"label": "docker-build: release",
"dependsOn": [
"build"
],
"dockerBuild": {
"tag": "appcloudservice:latest",
"dockerfile": "${workspaceFolder}/cloud-service/Dockerfile",
"context": "${workspaceFolder}",
"pull": true
},
"netCore": {
"appProject": "${workspaceFolder}/cloud-service/App.CloudService.csproj"
}
}
Dockerfile のルート ディレクトリにあるターミナル ウィンドウを開き、次の docker コマンドを実行します。
docker build -t appcloudservice:latest -f Dockerfile .
docker build
コマンドを実行すると、Dockerfile の各行が命令ステップとして処理されます。 このコマンドでは、イメージがビルドされて、そのイメージを指す appcloudservice という名前のローカル リポジトリが作成されます。
ヒント
生成される Dockerfile は、開発環境によって異なります。 たとえば、Visual Studio から Docker のサポートを追加した場合、Visual Studio Code から Docker イメージをビルドしようとすると、Dockerfile の手順が異なるため、問題が発生する可能性があります。 1 つの "開発環境" を選択し、このチュートリアルを通してそれを使用することをお勧めします。
コンテナー レジストリを作成する
Azure Container Registry (ACR) リソースを使用すると、プライベート レジストリでコンテナー イメージと成果物をビルド、格納、管理できます。 コンテナー レジストリを作成するには、Azure portal で新しいリソースを作成する必要があります。
- [サブスクリプション] と対応する [リソース グループ] を選択します (または、新しく作成します)。
- [レジストリ名] を入力します。
- [場所] を選択します。
- 適切な [SKU] を選択します ([Basic] など)。
- [Review + create](レビュー + 作成) を選択します。
- 検証に合格したことを確認した後、[作成] を選択します。
重要
コンテナー インスタンスを作成するときにこのコンテナー レジストリを使用するには、管理者ユーザーを有効にする必要があります。 [アクセス キー] を選択し、[管理者ユーザー] を有効にします。
Azure Container Registry (ACR) リソースを使用すると、プライベート レジストリでコンテナー イメージと成果物をビルド、格納、管理できます。 Dockerfile のルート ディレクトリにあるターミナル ウィンドウを開き、次の Azure CLI コマンドを実行します。
重要
Azure CLI から Azure リソースを操作するには、ターミナル セッションで認証されている必要があります。 認証を行うには、az login
コマンドを使用します。
az login
複数のサブスクリプションがあり、既定のサブスクリプションが設定されていない場合は、ログインした後、az account set
コマンドを使用してサブスクリプションを指定します。
az account set --subscription <subscription name or id>
Azure CLI にサインインすると、セッションはリソースと対話できるようになります。
Worker サービスを関連付けるリソース グループがまだない場合は、az group create
コマンドを使用して作成します。
az group create -n <resource group> -l <location>
<resource group>
の名前と <location>
を指定します。 コンテナー レジストリを作成するには、az acr create
コマンドを呼び出します。
az acr create -n <registry name> -g <resource group> --sku <sku> --admin-enabled true
プレースホルダーを実際の適切な値に置き換えます。
<registry name>
: レジストリの名前。<resource group>
: 使用したリソース グループの名前。<sku>
: 使用できる値は Basic、Classic、Premium、Standard です。
上記のコマンドでは次のことが行われます。
- 指定したリソース グループに指定したレジストリ名で Azure コンテナー レジストリが作成されます。
- 管理者ユーザーが有効にされます。これは Azure Container Instances に必要です。
詳細については、Azure コンテナー レジストリを作成するクイックスタートに関する記事を参照してください。
コンテナー レジストリにイメージをプッシュする
.NET Docker イメージをビルドし、コンテナー レジストリリソースを作成したら、コンテナー レジストリにイメージをプッシュできます。
ソリューション エクスプローラーでプロジェクトを右クリックし、[発行] を選択します。 [発行] ダイアログが表示されます。 [ターゲット] で [Azure] を選択して、[次へ] を選択します。
[特定のターゲット] で [Azure Container Registry] を選択し、[次へ] を選択します。
次に、[Container Registry] で、ACR リソースの作成に使用したサブスクリプション名を選択します。 [コンテナー レジストリ] 選択領域で作成したコンテナー レジストリを選択し、[完了] を選択します。
これにより、イメージをコンテナー レジストリに発行するために使用できる発行プロファイルが作成されます。 [発行] ボタンを選択して、イメージをコンテナー レジストリにプッシュします。[出力] ウィンドウに発行の進行状況が報告され、正常に完了すると "正常に公開された" というメッセージが表示されます。
Visual Studio Code のアクティビティ バーから [Docker] を選択します。 [イメージ] ツリー ビュー パネルを展開し、appcloudservice
イメージ ノードを展開して、latest
タグを右クリックします。
統合ターミナル ウィンドウに、コンテナー レジストリへの docker push
コマンドの進行状況が表示されます。
コンテナー レジストリにイメージをプッシュするには、最初にレジストリにサインインする必要があります。
az acr login -n <registry name>
az acr login
コマンドを使用すると、Docker CLI からコンテナー レジストリにログインできます。 イメージをコンテナー レジストリにプッシュするには、az acr build コマンドを使用し、<registry name>
としてコンテナー レジストリ名を指定します。
az acr build -r <registry name> -t appcloudservice .
上記のコマンドでは次のことが行われます。
- ソースが tar ファイルにパックされます。
- それがコンテナー レジストリにアップロードされます。
- コンテナー レジストリにおいて、tar ファイルがアンパックされます。
- コンテナー レジストリ リソースで、Dockerfile に対して
docker build
コマンドが実行されます。 - コンテナー レジストリにイメージが追加されます。
イメージがコンテナー レジストリに正常にプッシュされたことを確認するには、Azure portal に移動します。 コンテナー レジストリ リソースを開き、[サービス] の [リポジトリ] を選択します。 イメージが表示されるはずです。
コンテナー インスタンスとしてデプロイする
Visual Studio Code で、アクティビティ バーの [Docker] を選択します。 [レジストリ] ノードを展開し、[コンテナー レジストリ] を選択します。 プロンプトが表示されたら [Azure] を選択し、必要に応じてサインインします。
重要
Visual Studio Code からのコンテナー インスタンスとしてのデプロイは、Mac では機能しなくなりました。 詳細については、「GitHub: Visual Studio Code の Docker 拡張機能について」を参照してください。
[レジストリ] ノードを展開し、[Azure] を選択し、サブスクリプション、コンテナー レジストリ、イメージを順に選択してタグを右クリックします。 [Deploy Image to Azure Container Instances]\(Azure Container Instances にイメージをデプロイする\) を選択します。
コンテナー インスタンスを作成するには、まず az container create
コマンドを使用してコンテナー グループを作成します。
az container create -g <resource group> \
--name <instance name> \
--image <registry name>.azurecr.io/<image name>:latest \
--registry-password <password>
適切な値を指定します。
<resource group>
: このチュートリアルで使用したリソース グループ名。<instance name>
: コンテナー インスタンスの名前。<registry name>
: コンテナー レジストリの名前。<image name>
: イメージの名前。<password>
: コンテナー レジストリのパスワード。これは、Azure portal で Container Registry リソースの [アクセス キー] から取得できます。
コンテナー インスタンスを作成するには、Azure portal で新しいリソースを作成する必要もあります。
- 前のセクションと同じサブスクリプションおよび対応するリソース グループを選択します。
- [コンテナー名] に「
appcloudservice-container
」と入力します。 - 前の [場所] の選択に対応する [リージョン] を選択します。
- [イメージ ソース] で [Azure Container Registry] を選択します。
- [レジストリ] で前のステップで指定した名前を選択します。
- [イメージ] と [イメージ タグ] を選択します。
- [Review + create](レビュー + 作成) を選択します。
- 検証に合格したら、[作成] を選択します。
リソースが作成されるまで少し時間がかかる場合があります。作成されたら、[リソースに移動] ボタンを選択します。
詳細については、Azure コンテナー インスタンスを作成するクイックスタートに関する記事を参照してください。
サービスの機能を確認する
コンテナー インスタンスは、作成されるとすぐに実行を開始します。
Worker サービスが正しく機能していることを確認するには、Azure portal に移動し、コンテナー インスタンス リソースで [コンテナー] オプションを選択します。
コンテナーとその現在の [状態] が表示されます。 ここでは、実行中です。 [ログ] を選択して、.NET Worker サービスの出力を表示します。
Worker サービスが正しく機能していることを確認するには、実行中のアプリケーションのログを表示できます。 az container logs
コマンドを使用する。
az container logs -g <resource group> --name <instance name>
適切な値を指定します。
<resource group>
: このチュートリアルで使用したリソース グループ名。<instance name>
: コンテナー インスタンスの名前。
.NET Worker サービスの出力ログが表示されます。これは、コンテナー化されたアプリが ACI に正常にデプロイされたことを意味します。
関連項目
.NET