• ASP.NET Core2.1で作る• VS, VSCodeのどっちでもいいけど個人認証ありでプロジェクトを作る• dotnet new mvc --auth Individual (VSCodeの場合)Webクライアントを作るJWTJWTValidateOpenId Connect JWTNextscape Inc. 104
リビジョンNextscape Inc. 142•Revisionを作成すると、Revsion番号が新しく発番されて、;rev=<num>という文字列が入った新しいURLが作成されるWebAppsのスロット同じ目的の機能と理解すればいいURLの例https://<resourceName>.azure-api.net/echo;rev=2/resource• 特定のRevisionをメインに切り替えると、;rev=<num>の付与も切り替わるメインURL(Revision=1)https://<resourceName>.azure-api.net/echo/resourceRevision=2のURLhttps://<resourceName>.azure-api.net/echo;rev=2/resourceRevision=1のURLhttps://<resourceName>.azure-api.net/echo;rev=1/resourceメインのURLhttps://<resourceName>.azure-api.net/echo/resourceRevision=2をメインに切り替え
141.
リビジョンNextscape Inc. 143•Revsionが入ったURLは、知っていれば誰でもアクセスできてしまうので、サブスクリプションキー必須にするなどしてAPIを守るようにすることリビジョン使用時の注意• 本番で稼働しているAPI定義やPoliciyに影響を与えることなく、安全に変更することができる• APIM定義をPublishする前に稼働確認ができる• 切り替え時に変更点を記載すると開発者ポータルに表示できるため、開発者に対して何をしたのかアナウンスできる• リビジョンの切り替えがすぐ反映されるので、問題があったらすぐにロールバックできる(即時反映なので、DNS切り替えではないみたい)リビジョンを使用する理由
Nextscape Inc. 158docsでは透過的バージョンアップという手法が提案されている• https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-cache-by-key#transparent-versioning• APIM側のバージョンアップにクライアントが合わせるのではなく、クライアントに合わせてAPIM側がバージョンを切り替えるやり方のことらしいクライアントに影響を与えないバージョンアップ戦略APIAPIM通常はクライアントがバージョンを選択するAPIAPIM透過的バージョンアップはAPIMがバージョンを選択するBackendAPIv1v2v3v1v2v3BackendAPIv1v2v3
157.
Nextscape Inc. 159docsに記載されているサンプルの図解•どのクライアントがアクセスしてきたのかをSubscriptionKeyで判定する方法透過的バージョンアップの構成APIAPIMBackendAPIv1v2v31.HeaderにSubscriptionKeyを入れてRequestバージョン管理2. SubscriptionKeyをキーにキャッシュにデータがあるかを確認3. データがキャッシュがなかったら、SubscriptionKeyをキーに外部からバージョンを取得し、キャッシュへ格納4.BackendAPIのURLを取得したバージョンに書き換えキャッシュにはSubscriptionKeyをキーにバージョンが格納されているKeyValueのキャッシュ機能がAPIMにはある(フラグメントキャッシュ)
158.
Nextscape Inc. 160docsの日本語が難しいが、恐らくこういうことが言いたいんだと思われる• https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-cache-by-key#tenant-isolationバックエンドの障害対応と段階的ロールアウトAPIAPIMBackendAPIv1BackendAPIv1BackendAPIv1v1同じバージョンのBackendAPIを複数用意しておき、クライアントがどのBackendAPIにアクセスするのかをAPIMが判定するように設計する• 設定方法は透過的バージョンアップとほぼ同じ• BackendAPIのハードウェア障害が起こった時に、影響があるクライアントが限定される• BackendAPIのハードウェアごとにバージョンアップをしていくことで段階的にロールアウトが可能となる(似非カナリアリリース)
API Management のエラー処理NextscapeInc. 162• API Mamagementでいうエラーは、Policyで発生したエラーと、Backend APIで発生したエラーと二種類あることを意識しておくことPolicyInOutErrAPI(Backend)(Publisher)Client(FrontEnd)(Consumer)BackendBackendAPIのResponseが4xx, 5xxの場合<outbound>でエラーハンドリングPolicyがエラーをThrowの場合<on-error>でハンドリングAPI Management
Nextscape Inc. 189パフォーマンスへの影響•BackendAPIは元のリージョンに1つだけだと、プライマリリージョン以外にデプロイされたAPIMはアクセスがある度に異なるリージョンのBackendAPIを叩きに行くため、パフォーマンスが悪い解決方法は2つ• BackendAPIも各リージョンへデプロイし、APIMがデプロイされている場所に応じてBackendAPIを切り替えるようにポリシーを作成する• キャッシュを使う(キャッシュのセクションを参照)複数リージョンへのデプロイの懸念点
Nextscape Inc. 211•Open API形式を選んだ場合、こんな内容ファイルがダウンロードされるAPI の Export / Import{"swagger": "2.0","info": {"title": "Echo API","version": "1.0"},"host": "nsuesaka2.azure-api.net","basePath": "/echo","schemes": ["https"],…"paths": {"/resource": {"get": {"description": "A demonstration of a GET call on a sample resource. …","operationId": "retrieve-resource","summary": "Retrieve resource","parameters": [{"name": "param1","in": "query","description": "A sample parameter that is required and has …","required": true,
Nextscape Inc. 217•Import した APIの定義を見てみるAPI の Export / Import{"swagger": "2.0","info": {"title": "Echo API2","version": "1.0"},"host": "nsuesaka2.azure-api.net","basePath": "/fuga","schemes": ["https"],…"paths": {"/resource": {"get": {"description": "A demonstration of a GET call on a sample resource. …","operationId": "retrieve-resource","summary": "Retrieve resource","parameters": [{"name": "param1","in": "query","description": "A sample parameter that is required and has …",API作成時につけた API URL suffix