ぼたんぽちぽちで .NET アプリケーションを Azure Container Apps (Dapr) 上で動かしてみる
サンプルの API と Service を用意して Azure Container Apps 上で動くところまで試す。まずは gRPC で。次に Dapr 経由でやり取りできるように修正する。可能な限りぼたんぽちぽちで。
サンプル Service を準備する
Visual Studio のテンプレートから ASP.NET Core gRPC サービス を選択。
ソリューション名を Sample
、プロジェクト名を Sample.Service
とします。
以下で作成。
Sample.Service をデプロイする
今回は Visual Studio 上から実施。
Sample.Service を右クリックして発行を選択。
Azure を選択。
Azure Container Apps を選択。
新規作成を選択。
以下の内容で作成を選択。リソースグループ・Container Apps 環境も新規作成して追加。
先ほど作成したものを選択した状態で次へ。
新規作成を選択。
以下の内容で作成を選択。
先ほど作成したものを選択した状態で完了。
準備が完了したら発行。
Azure Portal にログインしてリソースができていることを確認。
デプロイした Sample.Service コンテナアプリのイングレス設定を変更する。(転送を自動からHTTP2に)
サンプル API を準備する
先程作ったソリューションに対してプロジェクトを追加。
テンプレートから ASP.NET Core Web API を選択。
プロジェクト名を Sample.Api
とします。
以下で作成。
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 の WeatherForecastController
の Get
メソッドを以下のように修正。
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();
Sample.Api をデプロイする
Sample.Api を右クリックして発行を選択。
Azure を選択。
Azure Container Apps を選択。
新規作成を選択。
以下の内容で作成を選択。
先ほど作成したものを選択した状態で次へ。
新規作成を選択。
以下の内容で作成を選択。
先ほど作成したものを選択した状態で完了。
準備が完了したら発行。
Azure Portal にログインしてリソースができていることを確認。
デプロイしたサンプルアプリの動作確認をする
Azure Protal から Sample.Api コンテナアプリの URL を取得。
取得した URL + /swagger/index.html
でアクセス。
Name に任意の値を入れて Execute ボタンを押す。
Hello + Name に入力した文字列
でレスポンスが返ってきていれば、Azure Container Apps 上の API と Service が gRPC でやり取りできている。
サンプルアプリを 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 をデプロイ。
修正したサンプルアプリの動作確認をする
再度 Sample.Api の Swagger を開いて処理を実行。意図したレスポンスが返ってきていれば Dapr 経由でやり取りできている。