Closed9

ぼたんぽちぽちで .NET アプリケーションを Azure Container Apps (Dapr) 上で動かしてみる

takasetakase

サンプルの API と Service を用意して Azure Container Apps 上で動くところまで試す。まずは gRPC で。次に Dapr 経由でやり取りできるように修正する。可能な限りぼたんぽちぽちで。

takasetakase

サンプル Service を準備する

Visual Studio のテンプレートから ASP.NET Core gRPC サービス を選択。

ソリューション名を Sample、プロジェクト名を Sample.Service とします。

以下で作成。

takasetakase

Sample.Service をデプロイする

今回は Visual Studio 上から実施。

Sample.Service を右クリックして発行を選択。

Azure を選択。

Azure Container Apps を選択。

新規作成を選択。

以下の内容で作成を選択。リソースグループ・Container Apps 環境も新規作成して追加。

先ほど作成したものを選択した状態で次へ。

新規作成を選択。

以下の内容で作成を選択。

先ほど作成したものを選択した状態で完了。

準備が完了したら発行。

Azure Portal にログインしてリソースができていることを確認。

デプロイした Sample.Service コンテナアプリのイングレス設定を変更する。(転送を自動からHTTP2に)

takasetakase

サンプル API を準備する

先程作ったソリューションに対してプロジェクトを追加。
テンプレートから ASP.NET Core Web API を選択。

プロジェクト名を Sample.Api とします。

以下で作成。

takasetakase

Sample.Api を修正する

.proto ファイルと NuGet パッケージを追加する

以下を実施

  • Sapmle.Api プロジェクトに Protos フォルダを追加
  • Protos フォルダに greet.proto ファイルを追加
  • greet.proto ファイルに以下を記述(ほぼ Service の proto ファイルと同じ)
syntax = "proto3";

option csharp_namespace = "Sample.Api";

package greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

  • 以下の NuGet パッケージを追加
    • Google.Api.CommonProtos
    • Grpc.Net.Client
    • Grpc.Tools
  • Sample.Api の csproj に以下の記述を追加
  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Clinet" />
  </ItemGroup>

こんな感じになるはず。

Controller から Sample.Service を呼び出す処理を追加する

Azure Portal 上で先程デプロイした Sample.Service の URL を取得しておく。

一旦 gRPC で呼べるようにしたいので Sample.Api の WeatherForecastControllerGet メソッドを以下のように修正。

public async Task<IActionResult> Get(string name)
{
	using var channel = GrpcChannel.ForAddress(`Sample.Service の URL`);
	var client = new Greeter.GreeterClient(channel);
	var response = await client.SayHelloAsync(new HelloRequest() { Name = name });

	return Ok(response.Message);
}

Program.cs を修正する

デプロイ後の動作確認で Swagger を使用できるように以下の部分を修正。

//if (app.Environment.IsDevelopment())
//{
//	app.UseSwagger();
//	app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI();
takasetakase

Sample.Api をデプロイする

Sample.Api を右クリックして発行を選択。

Azure を選択。

Azure Container Apps を選択。

新規作成を選択。

以下の内容で作成を選択。

先ほど作成したものを選択した状態で次へ。

新規作成を選択。

以下の内容で作成を選択。

先ほど作成したものを選択した状態で完了。

準備が完了したら発行。

Azure Portal にログインしてリソースができていることを確認。

takasetakase

デプロイしたサンプルアプリの動作確認をする

Azure Protal から Sample.Api コンテナアプリの URL を取得。

取得した URL + /swagger/index.html でアクセス。

Name に任意の値を入れて Execute ボタンを押す。

Hello + Name に入力した文字列 でレスポンスが返ってきていれば、Azure Container Apps 上の API と Service が gRPC でやり取りできている。

takasetakase

サンプルアプリを Dapr 用に修正する

Sample.Service の Dapr を有効にする

Azure Protal から Sample.Service コンテナアプリの Dapr 設定を開いて以下のように修正する。

Sample.Api の Dapr を有効にする

Sample.Api を修正する

NuGet パッケージを追加する

  • 以下の NuGet パッケージを追加
    • Dapr.Client

Controller を修正する

Controller の Service 呼び出し部を修正する。

//using var channel = GrpcChannel.ForAddress("Sample.Service の URL");
var invoker = DaprClient.CreateInvocationInvoker("sample-service");
var client = new Greeter.GreeterClient(invoker);
var response = await client.SayHelloAsync(new HelloRequest() { Name = name });

return Ok(response.Message);

修正した Sample.Api をデプロイする

再度発行を押して Sample.Api をデプロイ。

takasetakase

修正したサンプルアプリの動作確認をする

再度 Sample.Api の Swagger を開いて処理を実行。意図したレスポンスが返ってきていれば Dapr 経由でやり取りできている。

このスクラップは2023/12/10にクローズされました