Worker サービスを Azure にデプロイする

この記事では、.NET Worker サービスを Azure にデプロイする方法について説明します。 Azure Container Registry (ACR) から Azure コンテナー インスタンス (ACI) として実行した Worker は、クラウド内のマイクロサービスとして機能することができます。 長時間実行されるサービスには多くのユース ケースがあり、Worker サービスはそのために存在します。

このチュートリアルでは、以下の内容を学習します。

  • Worker サービスを作成します。
  • コンテナー レジストリ リソースを作成します。
  • コンテナー レジストリにイメージをプッシュします。
  • コンテナー インスタンスとしてデプロイします。
  • Worker サービスの機能を確認します。

ヒント

".NET でのワーカー" のサンプル ソース コードはすべて、サンプル ブラウザー でダウンロードできます。 詳細については、コード サンプルの参照: .NET でのワーカーに関するページをご覧ください。

前提条件

新しいプロジェクトを作成する

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] を選択します。

Docker ファイルのオプション

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:5.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:5.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"]

注意

Dockerfile で、*App.CloudService を参照しているさまざまな行を更新する必要があります。これを実際のプロジェクトの名前に置き換えます。

公式の .NET イメージの詳細については、「Docker Hub: .NET Runtime (Docker Hub: .NET Runtime ランタイム)」と「Docker Hub: .NET SDK」を参照してください。

Docker イメージを構築する

Docker イメージをビルドするには、Docker エンジンが実行されている必要があります。

重要

Docker Desktop と Visual Studio を使用するとき、"ボリューム共有" に関連するエラーが発生しないようにするには、それが有効になっていることを確認します。

  1. Docker Desktop の [Settings](設定) 画面で、 [Shared Drives](共有ドライブ) を選択します。
  2. プロジェクト ファイルが含まれるドライブを選択します。

詳細については、「Docker を使用した Visual Studio 開発のトラブルシューティング」を参照してください。

ソリューション エクスプローラーDockerfile を右クリックし、 [Docker イメージのビルド] を選択します。 docker build コマンドの進行状況を報告する [出力] ウィンドウが表示されます。

エクスプローラーDockerfile を右クリックし、 [イメージのビルド] を選択します。 イメージに付けるタグ の指定を求められたら、「appcloudservice:latest」と入力します。 [Docker Task](Docker タスク) 出力ターミナルが表示され、Docker ビルド コマンドの進行状況が報告されます。

注意

イメージにタグを付けるように "求められない" 場合は、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 で新しいリソースを作成する必要があります。

  1. [サブスクリプション] と対応する [リソース グループ] を選択します (または、新しく作成します)。
  2. [レジストリ名] を入力します。
  3. [場所] を選択します。
  4. 適切な [SKU] を選択します ( [Basic] など)。
  5. [Review + create](レビュー + 作成) を選択します。
  6. 検証に合格 したことを確認した後、 [作成] を選択します。

重要

コンテナー インスタンスを作成するときにこのコンテナー レジストリを使用するには、管理者ユーザー を有効にする必要があります。 [アクセス キー] を選択し、 [管理者ユーザー] を有効にします。

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>: 使用できる値は BasicClassicPremiumStandard です。

上記のコマンドでは次のことが行われます。

  • 指定したリソース グループに指定したレジストリ名で Azure コンテナー レジストリが作成されます。
  • 管理者ユーザーが有効にされます。これは Azure Container Instances に必要です。

詳細については、Azure コンテナー レジストリを作成するクイックスタートに関する記事を参照してください。

コンテナー レジストリにイメージをプッシュする

.NET Docker イメージをビルドし、コンテナー レジストリリソースを作成したら、コンテナー レジストリにイメージをプッシュできます。

ソリューション エクスプローラー でプロジェクトを右クリックし、 [発行] を選択します。 [発行] ダイアログが表示されます。 [ターゲット][Azure] を選択して、 [次へ] を選択します。

Visual Studio: [発行] ダイアログ - [Azure] を選択します

[特定のターゲット][Azure Container Registry] を選択し、 [次へ] を選択します。

Visual Studio: [発行] ダイアログ - コンテナー レジストリを選択します

次に、 [Container Registry] で、ACR リソースの作成に使用した サブスクリプション名 を選択します。 [コンテナー レジストリ] 選択領域で作成したコンテナー レジストリを選択し、 [完了] を選択します。

Visual Studio: [発行] ダイアログ - コンテナー レジストリの詳細を選択します

これにより、イメージをコンテナー レジストリに発行するために使用できる発行プロファイルが作成されます。 [発行] ボタンを選択して、イメージをコンテナー レジストリにプッシュします。 [出力] ウィンドウに発行の進行状況が報告され、正常に完了すると "正常に公開された" というメッセージが表示されます。

Visual Studio Code の アクティビティ バー から [Docker] を選択します。 [イメージ] ツリー ビュー パネルを展開し、appcloudservice イメージ ノードを展開して、latest タグを右クリックします。

Visual Studio Code: Docker - イメージをプッシュします

統合ターミナル ウィンドウに、コンテナー レジストリへの 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 - Docker: レジストリに接続します

[レジストリ] ノードを展開し、 [Azure] を選択し、サブスクリプション、コンテナー レジストリ、イメージを順に選択して、タグを右クリックします。 [Deploy Image to Azure Container Instances](Azure Container Instances にイメージをデプロイする) を選択します。

Visual Studio Code - Docker: 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 で新しいリソースを作成する必要があります。

  1. 前のセクションと同じ サブスクリプション および対応する リソース グループ を選択します。
  2. [コンテナー名] に「appcloudservice-container」と入力します。
  3. 前の [場所] の選択に対応する [リージョン] を選択します。
  4. [イメージ ソース][Azure Container Registry] を選択します。
  5. [レジストリ] で前のステップで指定した名前を選択します。
  6. [イメージ][イメージ タグ] を選択します。
  7. [Review + create](レビュー + 作成) を選択します。
  8. 検証に合格 したら、 [作成] を選択します。

リソースが作成されるまで少し時間がかかる場合があります。作成されたら、 [リソースに移動] ボタンを選択します。

詳細については、Azure コンテナー インスタンスを作成するクイックスタートに関する記事を参照してください。

サービスの機能を確認する

コンテナー インスタンスは、作成されるとすぐに実行を開始します。

Worker サービスが正しく機能していることを確認するには、Azure portal に移動し、コンテナー インスタンス リソースで [コンテナー] オプションを選択します。

Azure portal: 実行しているコンテナー インスタンス

コンテナーとその現在の [状態] が表示されます。 この例では、 [実行中] になっています。 [ログ] を選択して、.NET Worker サービスの出力を表示します。

Worker サービスが正しく機能していることを確認するには、実行中のアプリケーションのログを表示できます。 次の az container logs コマンドを使用します。

az container logs -g <resource group> --name <instance name>

適切な値を指定します。

  • <resource group>: このチュートリアルで使用したリソース グループ名。
  • <instance name>: コンテナー インスタンスの名前。

.NET Worker サービスの出力ログが表示されます。これは、コンテナー化されたアプリが ACI に正常にデプロイされたことを意味します。

関連項目