Service Mesh endpoint needs features such as the Logging feature, the Hardware abstraction feature, Authentication and Authorization and so on, these features are provided several cloud venders as a service, or also can use the Envoy server and the Istio service mesh pilot feature. But creating the service mesh endpoint with ASP.NET Cor Web API minimal template is efficient to learn these cloud native architecture.
7. 物理層
永続化層
Service mesh control plane
Service mesh data plane
Micro
service
Micro
service
Micro
service
抽象化
認証認可
構成
ロギング
プロキシ
サービスメッシュ・エンドポイン
サービス複製管理
ネットワーク通信暗号化
呼び出し回数管理
ネットワーク密集度
サービス通過数管理
サービス反復管理
ネットワーク経路管理
サービスメッシュ・エンドポイント特有の役割
サービスメッシュ・エンドポイントとしての役
NSG: Network Security Group
サービスメッシュ・パターンとコンテナ
Micro
service
Micro
service
8. 物理層
永続化層
Service mesh control plane
Service mesh data plane
Micro
service
Micro
service
Micro
service
サービスメッシュ・エンドポイン
サービス間通信を行うコンテナ
NSG: Network Security Group
コンテナとサービスメッシュの通信
Micro
service
Micro
service
チケットサービス
決済サービス
シネマサービス
スクリーン情報サービス
作品情報サービス
Micro
service
スケールアウト
28. 汎用ホストは多数のミドルウェアを追加しカスタマイズすること可
能であり、
エンドポイントの構築を行うのであれば、ASP.NET Core Web API
minimal
テンプレートから必要なミドルウェアを追加していく方法が効果的
サービスメッシュ・エンドポイントに必要なデータプレーン機能は、
ASP.NET Core Web API minimalテンプレートで組み込まれる汎用ホ
ストが既定でサポートしている機能であり、カスタマイズすること
でクラウド・ソリューション・アーキテクチャの基本的なスキルを
身に付けることが可能
各クラウドベンダーが推奨するWell-architected frameworkは、クラ
29. Dream Wallpapers: このプレゼンテーションの背景
https://wallpaperaccess.com/dream
保護された Web API: アプリの登録 – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/scenario-protected-web-api-app-registration
Microsoft ID プラットフォーム アクセス トークン – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/access-tokens
Swashbuckle.AspNetCore: NuGet Gallery
https://www.nuget.org/packages/Swashbuckle.AspNetCore/
Google Cloud アーキテクチャ フレームワーク
https://cloud.google.com/architecture/framework?hl=ja
AWS Well-Architected
https://aws.amazon.com/jp/architecture/well-architected/
Microsoft Azure Well-Architected Framework – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/architecture/framework/
クイックスタート:Microsoft ID プラットフォームを使用して Web API を保護する – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/web-api-quickstart?source=recommendations&pivots=devlang-aspnet-core
Microsoft.Identity.Web.UI : NuGet Gallery
https://www.nuget.org/packages/Microsoft.Identity.Web.UI
30. Microsoft Identity Web 認証ライブラリ – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/microsoft-identity-web
Web API を呼び出す Web API:コード構成 – Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/scenario-web-api-call-api-app-configuration?tabs=aspnetcore
Microsoft.Identity.Web.MicrosoftGraph
https://www.nuget.org/packages/Microsoft.Identity.Web.MicrosoftGraph
Web API を呼び出す Web API:運用環境に移行する – Microsoft Docs
https://learn.microsoft.com/ja-jp/azure/active-directory/develop/scenario-web-api-call-api-production
Azure-Samples / active-directory-dotnet-native-aspnetcore-v2
https://github.com/Azure-Samples/active-directory-dotnet-native-aspnetcore-v2/tree/master/2.%20Web%20API%20now%20calls%20Microsoft%20Graph
ASP.NET Core の静的ファイル – Microsoft Docs
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/static-files?view=aspnetcore-6.0
Extended Log File Format
https://www.w3.org/TR/WD-logfile.html
Microsoft.Extensions.Logging: NuGet Gallery
https://www.nuget.org/packages/Microsoft.Extensions.Logging
W3CLogger in ASP.NET Core – Microsoft Docs
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/w3c-logger/?view=aspnetcore-6.0
31. W3CLoggingFields 列挙型 – Microsoft Docs
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.httplogging.w3cloggingfields?view=aspnetcore-6.0
.NET でのログ プロバイダー – Microsoft Docs
https://learn.microsoft.com/ja-jp/dotnet/core/extensions/logging-providers#built-in-logging-providers
Getting started with ASP.NET Core 6
https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6
Minimal API の概要: ASP.NET Core のミドルウェア - Microsoft Docs
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0#aspnet-core-middleware
Azure Kubernetes Service (AKS) のネットワーク ポリシーを使用したポッド間のトラフィックの保護
https://learn.microsoft.com/ja-jp/azure/aks/use-network-policies
fluentd
https://www.fluentd.org/
Google Anthos
https://cloud.google.com/anthos/
AWS Outposts
https://aws.amazon.com/jp/outposts/
Azure Stack
https://azure.microsoft.com/ja-jp/products/azure-stack/
Hinweis der Redaktion
これまで.NETラボでお話ししてきたように、ASP.NET Core Web APIのminimalテンプレートは、既定でいくつかのサービスをあらかじめ組み込んであるWeb APIスタックです。このWebスタックでは、前回のお話しのようにWebアプリにもDesktop Nativeアプリにも使える汎用ホストを使ってます。Web APIのホストビルダーが提供する汎用ホストには、既定でSwagger、ロギング、構成のサービスが組み込んであり、アプリケーションのライフサイクル管理の機能があらかじめ用意されています。これらは汎用ホストが持つDependency Injectionの機能によってアプリケーション・ホストを構成できるようになっており、IHostedServiceを実装するサービスであれば同じように開発者がいくつかのサービスの組合せをカスタマイズすることができるようになっているのでWebアプリもDesktop Nativeアプリもホストすることができます。
一方、サービスメッシュ・エンドポイントに必要な機能は、各サービスの認証機能であり、ネットワークのロードバランシング(レート上限管理)やフォールトトレラント(サービスの複製管理)、通信の暗号化、サービスの呼び出し回数の管理、クラスタ係数などを使ったネットワーク密集度の管理、分散トレーシングとしてサービス通過数や反復の管理、経路の管理(トポロジ)が必要です。
これらのすべての実装をお話するわけではありませんが、ASP.NET Core Web APIのminimalテンプレートにいくつかのサービスを組み合わせてサービスメッシュエンドポイントを作成することで、サービスメッシュエンドポイントの各種機能を、クラウドベンダーが提供するAzureのAPI Management、Google CloudのAPI ゲートウェイ、AWSのAPI Managementなどを使って簡単に構築できることを理解できます。これは、istioを使ってメッシュを構成してEnvoyでプロキシを構築する場合も同じです。
サービスメッシュエンドポイントを自作するコストと各クラウドベンダーが提供するAIP管理サービスのコストを考慮してクラウドネイティブなソリューションを計画することは重要で、単にサービスのオペレーションだけを覚えるのでなく、サービスメッシュ・エンドポイントのメカニズムを理解し、各クラウドプロバイダーのAPI管理機能やEnvoy、自作のメッシュなどを組み合わせた柔軟な設計を行います。
Minimal Web APIの汎用ホストは構成、認証、Swaggerのサービスを既定で組み込んだプロジェクトをテンプレートで作成できますので、ロギングとハードウェア抽象化の部分を作っていきます。ただし、今回はプロキシと認証の部分を外して作成します。
【クリック】プロキシや認証を外す理由なのですが、プロキシは、ご覧の通り非常に広範な話をする必要があります。Envoyサーバーや各クラウドベンダーが提供する管理サービスとの費用対効果、トレードオフ、コラボレーションなど、このセッションとは分離する必要があると考えましたので、またの機会にお話します。
認証はAzure Active Directoryアプリケーションを作成する必要があり、Web API向けの認証については、ユーザーログインでなくスコープによるアプリケーションログインをするためのロールを作成する必要があります。つまり、スコープとロールを結び付けたAADアプリケーションを使ったMicrosoft ID プラットフォームでの認証を行いますので、これについても解説を分けてまたの機会にお話しします。認証についてはこの後、構築の流れだけお話しします。
Minimal Web APIの汎用ホストは構成、認証、Swaggerのサービスを既定で組み込んだプロジェクトをテンプレートで作成できますので、ロギングとハードウェア抽象化の部分を作っていきます。ただし、今回はプロキシと認証の部分を外して作成します。
【クリック】プロキシや認証を外す理由なのですが、認証はAzure Active Directoryアプリケーションを作成する必要があり、Web API向けの認証については、ユーザーログインでなくスコープによるアプリケーションログインをするためのロールを作成する必要があります。つまり、スコープとロールを結び付けたAADアプリケーションを使ったMicrosoft ID プラットフォームでの認証を行いますので、これについては解説を分けてまたの機会にお話しします。今回はその流れだけお話しします。
認証部分の作成の流れとしては、「>dotnet new webapi -minimal true -au SingleOrg」でプロジェクトを作成した後に、appsettings.jsonを開きます。JSON Commentのエラーが出る場合はVisual Studio Codeの右下のJsonをクリックしてコマンドバーを表示しjsoncとタイプしてJSON with Commentsを選択してください。
または、設定を開いて検索ボックスで「files.asso」と入力して「*.json」「jsonc」と設定しておいてもエラーを非表示にします。
認証部分の作成の流れとしては、「>dotnet new webapi -minimal true -au SingleOrg」でプロジェクトを作成した後に、appsettings.jsonを開きます。JSON Commentのエラーが出る場合はVisual Studio Codeの右下のJsonをクリックしてコマンドバーを表示しjsoncとタイプしてJSON with Commentsを選択してください。
Swagger UIのブラウズの後に、ルートのIndexを参照すると認証していないのでエラーがブラウザに表示されます。
Microsoft ID プラットフォームで認証するために、Azure Active Directory Applicationを作らなければいけないのですが、テンプレートのappsettings.jsonのコメント部分のURLをクリックすると、「プロジェクトから作成、IDEからAADアプリケーションを作る」という流れの作成方法が載っています。
【クリック】ただし、.NET 5.0対象のツールを使う方法なので、このツールを使わない方法の解説へのリンクがあります。コメントのURLをクリックして開く「vs2019-16.9-how-to-use.md」というマークダウンファイルの最下部です。
【クリック】この資料の巻末にもリンクは載せてありますが、WEB APIのリンクを選択して表示されるページの言語をja-jpにして参照することもできます。
Azure Active Directoryアプリケーションを作成したら、APIの公開-Scopeの追加を選択します。続いてそのまま「保存してから続ける」を選択してスコープを設定します。スコープ名は「access_as_user」、管理者とユーザーが同意できるようにしておきます。同意の表示名と説明は管理者、ユーザーとも設定します。今回はこのスコープを要求するのはアプリケーションに割り当てるロールなのでユーザーの認証は行いません。
もう少し設定は必要ですが、この段階ではここまでで大丈夫です。Visual Studio Codeに戻ってappsettings.jsonを開き、Domainを入力してから、Azureポータルから「TenantId」と「ClientId」をコピーします。入力はこの2つですが、Scopesを確認してください。先ほど作成した「access_as_user」がテンプレートとして指定されています。それから「program.cs」を開いてGetメソッド「weatherforecast」を確認してください。
このapp.MapGetメソッドの最後に「.RequireAuthorization()」メソッドを呼び出しているところが認証を強制しているところになります。そのため、先ほどのルートの「Index」がエラーを表示するということになります。それでは、このルート呼び出し部分を認証を必要としない表示にしておいて、ユーザー(実際はアプリケーション)がログインできるようにします。
もう少し設定は必要ですが、この段階ではここまでで大丈夫です。Visual Studio Codeに戻ってappsettings.jsonを開き、Domainを入力してから、Azureポータルから「TenantId」と「ClientId」をコピーします。入力はこの2つですが、Scopesを確認してください。先ほど作成した「access_as_user」がテンプレートとして指定されています。それから「program.cs」を開いてGetメソッド「weatherforecast」を確認してください。
【クリック】このapp.MapGetメソッドの最後に「.RequireAuthorization()」メソッドを呼び出しているところが認証を強制しているところになります。ルートの「Index」のGetメソッドを作成し、がエラーを表示しないようにするためには、ルート呼び出し部分を認証を必要としない設定にしておいて、ユーザー(実際はアプリケーション)がログインできるようにしておくことでログインのUIを持つサービスを呼び出すことができるように構成することも可能です。
まず、ルート「/」にGetメソッドを設置して「.AllowAnonymous()」メソッドを最後に呼ぶようにします。エラーが表示されなくなったことを確認してください。ここまでが認証の流れになります。サービスメッシュエンドポイントで認証を行うのではなく、UIを持つWeb Appからメッシュエンドポイントを経由して他のサービスを呼ぶように構成すると思いますので、実際の認証はもう少し複雑になります。具体的には、このような代理認証を行うMicrosoft.AspNetCore.Authentication ミドルウェアを作成するのでなく、UIを持つWeb Appで認証、認証済みトークンをサービスメッシュエンドポイントで検証して他のサービスを代理呼び出しを行うといったことが行われるかと思います。このような方法としてマイクロソフトのドキュメント(巻末リンク参照)「Web API を呼び出す Web API:運用環境に移行する」の「次のステップ」にあるリンク先に汎用ホストに登録できるMicrosoft ID プラットフォームのWeb API認証サービスが持つEnableTokenAcquisitionToCallDownstreamApiメソッドを使う方法が記載されています。このDownstreamApiはWeb AppからWeb APIに認証情報をわたすこともでき、Web APIからWeb APIに認証情報をわたすこともできます。