SlideShare a Scribd company logo
1 of 230
Azure API Management
2020/03
上坂 貴志(@takashiuesaka)
俺的マニュアル
2020/03 更新
自己紹介
上坂貴志
• うえさかたかし
Twitter
• @takashiuesaka
• Facebookは開店休業状態
Microsoft MVP
• Microsoft Azure 2015年~
仕事
• マネージャー、プリ
セールス、エバンジェ
リスト
最近の興味
• Agile、DDD、
DevOps、.NET Core、
React.js
Nextscape Inc. 2
NEXTSCAPE
3
いわゆる枯れた技術を使った低リスクなSIはやりません
技術的なチャレンジないとつまんないじゃん?
SIerだけどAgileに積極的にチャレンジしています
お客様も自分たちも幸せで楽しい開発を実現したい!
SIerです
(ほぼ)100%自社請案件です(SESなし)
Nextscape Inc.
Nextscape Inc. 4
今日の内容
API Managementとは
What is API Management?
• HTTPベースのAPIを外部に公開する時に必要な仕組みを一通り揃えたPaaSです。
• APIとそれを呼び出すClientとの間に挟み込むようにDeployします。
API Managementとは
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
API
Management
Nextscape Inc. 6
• 一般的にAPI公開時に求められる以下のようなシナリオに対応できます。
API Managementとは
外部の開発者に対して
APIごとに使用許可を制
御したい
APIの使用を無料ユー
ザー用や有料ユーザーな
どに分けて制御したい
APIのバージョンを簡単
に管理したい
外部の開発者がAPIを呼
び出してテストできる
ページを用意したい
• さらにAzure環境ならではのこんな要求にも対応できます。
VNETで守られたVMで立てたAPI
を外部に公開したい
VNET内部だけで公開するAPIに
対して上記一般的なシナリオ
(バージョン管理やテストペー
ジの用意など)に対応したい
Nextscape Inc. 7
API Management 全体像
Overview
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Subscription
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 9
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 10
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Subscription
API:
API Managementから到達できるAPIであればなんでも登録
できる。まずはここへ API を登録するところからスタート。
PolicyではRequest/Response/Errorに対して処理をC#で書
くことができる。
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 11
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Subscription
Products(製品/成果物):
docsでは「成果物」もしくは「製品」と記載されている。
Portalでは「製品」となっているので注意。
APIに対してアクセス制御を行うのが主な役割。
APIと成果物はN:Nの関係性。APIは複数のProductsに登録が
できる。
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 12
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Group:
Developerは複数の(Custom)グループに所属することがで
きる。ユーザー登録したDeveloperは必ずDevelopersグループ
に所属する。(ユーザー登録はいろんなシナリオで可能)
Productsのアクセス制御にGroupを登録することで、その
Groupに所属する開発者はその成果物を使用することができる
ようになる。(※Subscription使用による例外あり)
GroupとProductsはN:Nで紐づけることができる。
Subscription
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 13
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Policyでできること(やること)の代表格
セキュリティ&アクセス制限
• API キー、JWT トークン、証明書、その他の資格情報を検証
• 使用量クォータとレート制限を適用
• IPアドレスやユーザーIDで接続を制限・スロットリング
キャッシュ
• Backend APIのResponseをキャッシュ
その他
• Request/Reponseログを転送
• 外部サービスをHttpで呼び出し
Subscription
Policy:
PolicyはBackend APIへRequestを投げる前後に処理を入れることができる。処理
はC#で実装する。
PolicyはBackend APIが公開する複数の操作(Operation)ごとに設定もできるし、
Backend API全てに共通の設定もできるなど、スコープが4段階ある。
(操作の例: /id)
実に多彩な処理の実装が可能。テンプレートもあるが、外部にReqeustを投げるこ
とができるので独自実装を頑張ればかなりのことができる。
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 14
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Policyによるアクセス制限:
ProductsにもPolicyが設定できる。API単位より
上のスコープでの設定と思えばOK。
例えば使用量上限があるプランのAPI群を公開し
たい場合、そのプラン用の成果物を作成して使用
量クォータによる制限のPolicy実装をここに設定
することになる。
Subscription
アクセス制御:
アクセス制御はProductsとグループを紐づけること
で可能となる。
ここでいうアクセス制御とは、Developer(User)に
対してのものであることに注意。(APIを外部から使
用するClientに対する制御ではない)
Developers Guests
Custom
Admins
API Management Overview
API Management
Group
API
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
Developer(User)
N:N
Operations
In
Out
Err
Policy
N:N
Developer Portal
Nextscape Inc. 15
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Products(製品)
N:N
Subscription:
俗にいうAPIキー。このキーをHeaderに入れないと
Requestが失敗する。 ProductsとDeveloperを紐
づけた設定の場合、Developer(User)からの利用許
諾の申請を必須とすることができる。
【重要Update】
従来、SubscriptionはProductsとDeveloper
を紐づけなければならなかったが、大きな仕
様追加がある。詳しくは「サブスクリプショ
ン」を参照
Subscription
超基本の使い方
Basic usage of API Management
APIを追加する
Nextscape Inc. 17
• Blank APIを選ぶと、自分でOperationを追加する必要がある
• 他のやつは定義を読んで自動的にメソッドを追加してくれる
• OpenAPI(Swagger)の仕様を公開しておくのが一般的(AzureならApp Servcie、
Azure以外ならOpenAPIを選択することになる)
APIを追加したあとの「API」画面
Nextscape Inc. 18
外部からRequestを
受ける入口の設定
バックエンドAPIの
設定
バックエンドAPIへRequest
を投げる前のカスタム処理
バックエンドAPIからのResponse
を返す前のカスタム処理
Products(製品)へAPIを登録する(オプション)
どれか選ぶ
もしくは事前に作っておく
APIを選ぶ
Nextscape Inc. 19
• Products (製品)メニューからAPIを登録する
APIの画面から成果物に登録できるようになれば素敵なんだけどなー
Update!
従来は必須だったが、Subscriptionの仕様追加によっ
て、Productsへの登録をしなくてもAPIを使用するこ
とは可能になりました。詳しくは『サブスクリプショ
ン』の章を参照
• APIを登録しただけだと動かない!
• missing subscription key というエラーが出たときの原因は大抵コレ
Products(製品)へAPIを登録する(オプション)
Nextscape Inc. 20
GroupA
グループ
アクセス制御
開発者(ユーザー)成果物(製品)API
既存API
新規API
Productsに紐づけないと、
開発者からは見えない。
自分がAdminsグループに
所属する管理者の場合、
Portalからは見えるが実行
時はエラーになる。
成果物に紐づいていないので実
行するとエラーになる
従来の仕様によるエラーの説明
最新の仕様は『サブスクリプション』の章を参照
• 外部ツール使ってもいいけど、APIManagementのテストツールを使ったほうが便利
• 自動的にサブスクリプションキーを入れてくれる
• Policy実装時には、このツールのTrace機能が必須(詳しくは「ポリシー」の最後にて)
• 設定すれば、外部IDProviderのOAuth2.0, OpenIdConnectのTokenを取得させることもできるので、認証が必須のAPIの設
定確認やPolicyの実装結果を確認する時に重宝する
試しにAPIMを叩く
Nextscape Inc. 21
大変残念なことにテストツール
の実行履歴が一切保存されない。
Policyの実装時にはちょっと辛い
認証結果の検証
• Policyにて実装
エラーハンドリング
• Policyにて実装
ログの出力
• Policyにて実装
スケーリング
• Portal/Powershell/Cliで設
定
バックアップ
• Portal/Powershellにて設
定
キャッシュ
• Portal/Powershellにて設
定
必要なら追加設定する
Nextscape Inc. 22
Nextscape Inc. 23
• OpenAPI(Swagger)を公開していなくてもメソッド追加してくれそうな予
感がする。
APIの追加時にApp Serviceを選ぶと?
• 実際にやってみるとこんな感じで必ず8つメ
ソッドが追加される
• メソッド名は適当な名前。AppServiceで公開し
ているAPIを読んで作成していないことがわか
る
• 表示名(DisplayName)は変えられるが、メソッド
のシステム名(name)は変えられない。
PowerShellやAzure Cliなどで扱う時に困る
• 素直にApp ServiceはOpenAPIを公開しておけっ
てことだ
ポリシー
Policy of API Management
• ポリシーはXML形式。4ブロックに分かれている
ポリシーの基本形
<policies>
<inbound>
<!–- Backend APIを叩く前に呼びたい処理 -->
<base />
</inbound>
<backend>
<!–- Policyは1つだけしか実装できない。Backend APIを叩くための
Poilicyがデフォルトで実装されている -->
<base />
</backend>
<outbound>
<base />
<!–- Backend APIからのreponseを返す前に呼びたい処理 -->
</outbound>
<on-error>
<base />
</on-error>
</policies>
Nextscape Inc. 25
詳細は後述
詳細は後述
• C#の実装方法は2つの形式がある。
• どちらも括弧の前に@付ける
XMLの属性値にC#で実装していく
<set-variable name=“date1" value="@(context.Timestamp.ToString("R"))" />
<set-variable name=“date2" value="@{
var results = DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss.fffff”);
return results;
}" />
Nextscape Inc. 26
単文の場合は@()
複文の場合は@{}
• ポリシー式で使用できる .NET framework の型は決まっているため、usingは不要
• 保存時に名前空間を解決してくれているっぽい(解決できないとエラーになる)
• 言い換えると外部dll を読み込ませることができない(Nugetもできない)
っていうかこれラムダ式だわ インテリセンスが効かないんだよね・・・
• Reqeust/Response含めたあらゆる情報はこいつが持っている
暗黙的なオブジェクト context
Nextscape Inc. 27
Context
Timestamp: DateTime
Variables: IReadOnlyDictionary<string, object>
Response
Request
LastError
Headers: IReadOnlyDictionary<string, string[]>
IpAddress: string
Body
※一部抜粋
アクセス日時
<set-variables>でセットされた値を保持
Requestのヘッダー値
Request元のIPAddress
RequestのBody
• contextは、docsの
› 「操作方法ガイド」
› ポリシーの定義
› ポリシー式
› 「コンテキスト変数」セクション
• に情報がある
contextの中身を知らないと実装できない
Nextscape Inc. 28
• ちょっと見方にコツがいる。
• まず、英語に切り替える!
• url の ja-jp を en-us にすればいい
• 例:Requestの情報がほしい
• まず、contextから探す。
• context.Requestというプロパティが
あるのでリンクをクリック
contextの中身を知らないと実装できない
Nextscape Inc. 29
• context.Requestという項目に飛ぶ(ページ内リンク)。
• このようにすべての情報はこの画面内にある。
contextの中身を知らないと実装できない
• さらにここからUrlの型であるIurlのリンクをクリックしてみると・・・
Nextscape Inc. 30
• IUrlの情報を得ることができる。
• context.Request.Url.Path と書くことで、リクエスト時のURLを取得できるこ
とがわかった
• プロパティ名は大文字小文字区別する(Case-Sensitive)
contextの中身を知らないと実装できない
Nextscape Inc. 31
• サブスクリプションごとに指定期間あたりの呼び出しレートを指定数に制限
利用を制限するポリシー
<inbound>
<rate-limit
calls="5“
renewal-period="60" />
<base />
</inbound>
Nextscape Inc. 32
<inbound>
<quota
calls="100“
bandwidth="40000“
renewal-period="604800" />
<base />
</inbound>
• サブスクリプションごとに呼び出し回数と帯域幅クォータの両方またはそのどちらかで制限
KBytes
Seconds
1分に5回まで
1週間に100回、
もしくは
40,000KBまで
• キーごとに指定期間あたりの呼び出しレートを指定数に制限
利用を制限するポリシー
<inbound>
<rate-limit-by-key
calls=“5”
renewal-period=“60“
counter-key=“@(context.Request.IpAddress)” />
<base />
</inbound>
Nextscape Inc. 33
<inbound>
<quota
calls=“100“
bandwidth=“40000“
renewal-period=“604800”
counter-key=“@(context.Request.IpAddress)” />
<base />
</inbound>
• サブスクリプションごとに呼び出し回数と帯域幅クォータの両方またはそのどちらかで制限
IPAddress毎に1
分に5回まで
IPAddress毎に
1週間に100回、
もしくは
40,000KBまで
counter-keyへのセットは文字列なんでもOK
• オブジェクトをディクショナリへ格納する
• 何かしらの処理の結果を格納する時に使う
set-variablesは多用する
Nextscape Inc. 34
<set-variable
name="putDate“
value="@(context.Timestamp.ToString("R"))" />
• ディクショナリはcontext.Variables : IReadOnlyDictionary<string, object>
• オブジェクトの取り出し方(GenericsではないのでCast必要)
• (cast)context.Variables[“keyName”]
putDateはディク
ショナリのKey名
• 同期リクエストの場合は<send-request>
• Responseを取得できる
• 非同期リクエストの場合は< send-request-one-way >
• Responseは取得できない
外部へリクエストを投げるポリシー
• <send-request>のResponseは、指定した変数名でcontext.Variablesディク
ショナリに格納される
<send-request mode="new" response-variable-name="testResponse" timeout="5" ignore-
error="true">
・・・
</send-request>
Nextscape Inc. 35
• Blob SDKが使えないのでREST Apiで実装
• ログを書く処理は非同期にしたいので、 send-request-one-way使用したい
• でもエラーでまくって辛かった。どうやってデバッグするか悩んだ
• 編み出したやり方は以下
• まずはsend-requestで実装。
• send-reqeustにはresponseを変数に入れる機能がある
• responseは、IReseponseクラス。
• responseの中身を見るために、set-variableの実行結果をTraceで見ることに(詳しくはこの後)
追加Blobにログを書くPolicy作ってみた
<set-variable name="test" value="@{
var hoge = ((IResponse)context.Variables["testResponse"]).Body.As<string>();
return hoge;
}" />
<send-request mode="new" response-variable-name="testResponse" timeout="5" ignore-
error="true">
・・・
</send-request>
Nextscape Inc. 36
responseを格納する変数
変数値をTraceで表示させるために意味なく
他の変数にセットする
• これを埋めていく
追加Blobにログを書くPolicy作ってみた
<inbound>
<base />
<set-variable name="version" value="@("2015-04-05")" />
<set-variable name="putDate" value="@(context.Timestamp.ToString("R"))" />
<set-variable name="logData" value="@{
// ログに出力する内容を作る
return something;
}" />
<set-variable name="authorizationHeader" value="@{
// BlobのBearer Authorizationヘッダーを作る
return authorizationHeader;
}" />
<send-one-way-request mode="new">
// 非同期のリクエストを投げる
</send-one-way-request>
</inbound>
Nextscape Inc. 37
• 非同期のリクエストを投げる実装(他は省略)
追加Blobにログを書くPolicy作ってみた
<send-one-way-request mode="new">
<set-url>https://{{logstorageName}}.blob.core.windows.net/test/append-
blob.log?comp=appendblock</set-url>
<set-method>PUT</set-method>
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["version"])</value>
</set-header>
<set-header name="x-ms-date" exists-action="override">
<value>@((string)context.Variables["putDate"])</value>
</set-header>
<set-header name="Authorization" exists-action="override">
<value>@((string)context.Variables["authorizationHeader"])</value>
</set-header>
<set-body>@((string)context.Variables["logData"])</set-body>
</send-one-way-request>
Nextscape Inc. 38
• テストツールのTraceを見れば、リクエスト先が返したエラー情報が見え
る。
• Ocp-Apim-Traceヘッダにtrueという値を入れておく必要があるが、デフォルトで設
定済みなのであまり気にしなくて大丈夫
Policyのデバッグ方法
Nextscape Inc. 39
デフォルトはMessageタブが
表示されているので、Trace
に切り替える
この例では、<set-varialble>に設定されたポ
リシー式を評価した(実行した)結果を表
示している。
Globalレベル(API の All APIsに設定する)
成果物レベル(製品)
API レベル(API の All Operationsに設定する)
各Operationsレベル
ポリシーには階層がある
• 上から順に評価される。
Nextscape Inc. 40
Globalレベル
成果物レベル
APIレベル
各Operationsレベル
ポリシーには階層がある
• 上位のPolicyは<base />と記載してある箇所に適用される
• <base />を消せば、上位のPolicyは無視したことになる
Nextscape Inc. 41
<policies>
<inbound>
<base />
<authentication-certificate thumbprint="3B262F5910138…" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
• この実装が API レベルにされている場合、<inbound>の<base />はGlobalと成
果物レベルの<inbound>の処理を意味している
• <backend>だけはデフォルトでグローバルレベルに<forward-request>が実装
されている。こいつがBackend Apiを呼び出すタグ。
<backend>について
Nextscape Inc. 42
成果物、API、Operationsの全てのレ
ベルのデフォルト実装の<backend>の
<base />は、削除するとBackend APIが
呼び出されなくなるので注意してね
Operationsレベルの例
グローバルレベルの例
• <backend>には1つだけしかPolicyを実装できない制約がある!
<backend>について
Nextscape Inc. 43
<backend>
<retry condition="@(context.Response.StatusCode == 500)" count="3" interval="1">
<forward-request />
</retry>
</backend>
<backend>
<base />
<retry condition="@(context.Response.StatusCode == 500)" count="3" interval="1">
</retry>
</backend>
エラーとなってしまう例
入れ子にして回避
上位スコープに
<forward-request />
が設定されているため必要
<base />を削除
• Visual Studio Code用のスニペットならある・・・けど使えないかな
• https://github.com/Azure/api-management-policy-snippets
ポリシーの素敵なエディタはないのか
Nextscape Inc. 44
ユーザーとグループ
Developers and Group
ユーザー(Developer) と Group
• Docsにおけるユーザーとは、Azure API Managementで公開された API を使用する開発者
(Developer)のこと
• ユーザーとGroupはN:Nで紐づけることができる
• Group は Products とN:Nで紐づけることで開発者へのAPI公開をまとめて制御する
Group
アクセス制御
Products(製品)
アクセス制御
GroupA
GroupB
API
API
API
API
API
ユーザー(Developer)
全部のAPI使用可
下2つのAPIのみ
使用可
Nextscape Inc. 46
ユーザー(Developer) と Group
• デフォルトで用意されているグループは3つ
• Administrators, Develpers, Guests
• ユーザーを新規追加すると、デフォルトでDevelopersグループ所属になる
Nextscape Inc. 47
ユーザー(Developer)
Developers
Guests
Admins
デフォルトグループ
GroupA
GroupB
カスタムグループ
ユーザーをPortalから追加しても、開発者
ポータルから開発者自身がサインアップ
しても、必ずDevelpersグループの所属に
なる
リンクがアクティブになっていない!
ユーザー(Developer) と Group
• あれ、Admin, Guestへのユーザー追加はどうやるのか?
• Powershellなら追加できるっていう訳じゃなかった
Nextscape Inc. 48
• 共同作成者以上の権限を持つAzureユーザーは自動的に全員Adminグループに紐づけられる
• Adminsグループは新規作成のProductsのアクセス制御に自動的に登録される
ユーザー(Developer) と Group
Group
アクセス制御
ユーザー(Developer)Products(製品)API
API
アクセス制御
Developers
Guests
Admins
デフォルトグループ
Azure ユーザー
APIM作成者
APIM共同作成者
GroupA
GroupB
カスタムグループ
自動的に紐づけられる
Azureユーザーが紐づける
Nextscape Inc. 49
• Guestsグループはユーザー登録をしていない匿名ユーザーが
暗黙的に所属するグループ
(登録前にお試しに使ってもらいたい場合などはGuestsグ
ループに紐づける=登録しない)
API
API
API
API Manegement Role別機能差
APIM作成者 or APIM 共同作成者 APIM Operator Role APIM Reader Role
Portal フル権限 参照のみ。変更設定できるのは
スケールアップ・ダウン、SSL、
カスタムドメインの設定ぐらい
メトリックス参照で
きるぐらい。その他
は参照すらできない
開発者ポータル フル権限 × ×
所属Group Administrator Guest Guest
• APIMの作成者、またはAPIM 共同作成者ロール
の権限があるAzureユーザーは、暗黙的に
Administratorグループに所属する(共同作成者
は画面にユーザーとしては表示されない)
• APIM Service Reader Role, Operator Roleの権限を
もつAzureユーザー、もしくはユーザー登録を
していない(認証していない)場合は暗黙的
にGuestグループに所属する
Nextscape Inc. 50
• カスタムグループへのユーザーの登録はPortalで管理者が行う以外の手段がない
• こんな設定にしてあったら、自動的に登録してくれないのかな?
カスタムグループへのユーザー登録は手動だけ
カスタムサブスクリプション
アクセス制御Policy
開発者ポータル
Products(製品) Group
Developers
1.サブスク申請が
承認されたら
2.カスタムグループに自
動的に登録されないのか1 2
Nextscape Inc. 51
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
試すならこんな手順
試してみた
Nextscape Inc. 52
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
試してみた
Nextscape Inc. 53
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
Developerグループも紐づけておかないと、開発
者ポータルにProducts(製品)が表示されない
試してみた
Nextscape Inc. 54
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけてお
く
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
• 開発者ポータルで申請中になったことを確認
試してみた
Nextscape Inc. 55
試してみた
Nextscape Inc. 56
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
• 申請が許可されてSucscription Keyが発行された
試してみた
Nextscape Inc. 57
試してみた
Nextscape Inc. 58
• 承認が必要なProducts(製品)を作る
• Products(製品)に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
追加されなかった・・・残念
サブスクリプション
Subscription
• サブスクリプションとは、API または Products に対してAPIキーによるアクセス制御のこと
• 登録したユーザーだけが特定API、特定Productsを使用できるようにしたい場合の設定である
• (Front APIへのRequest時に、headerに key のセットが必須となる)
サブスクリプション
Nextscape Inc. 60
GroupA
グループ
アクセス制御
ユーザー(Developer)Products(製品)
API
既存API
新規API
従来の仕様では、サブスクリプションは必ず Productsとユーザーの両方に対して紐づけを持っていた。
この仕様のせいで、新規に作成したAPIをProductsへ紐づけをし忘れてしまってアクセスエラーとなる
ミスがあった
Subscription
Productsに紐づ
いていないので
アクセスすると
エラーになる
Subscription
• 新仕様その1
• 「すべてのAPI」と「各API」に対してサブスクリプションを紐づけることができるように
なった。(従来のProductsに対するサブスクリプション紐づけも可能)
• API公開に際して、Productsとの紐づけが必須ではなくなったということ
サブスクリプション
Nextscape Inc. 61
GroupA
グループ
アクセス制御
Products(製品) ユーザー(Developer)
API
既存API新規API
すべてのAPISubscriptionを作
成して紐づけな
いと、エラーに
なるのは変わら
ない
• 新仕様その2
• 従来のサブスクリプションは、Productsとユーザーの両方に対して必ず紐づけなければならなかった。
• 新しい仕様ではユーザーとの紐づけはオプションとなった(スタンドアロンサブスクリプション)
(これはサブスクリプションキーを共有したいシナリオに対応するためである)
• 「すべてのAPI」とのみ紐づけをもつ
• 「指定したAPI」とのみ紐づけをもつ
• 「Products」とのみ紐づけをもつ
サブスクリプション
Nextscape Inc. 62
GroupA
グループ
アクセス制御
Products(製品)
API
既存API新規API
Subscription
すべてのAPI ユーザー(Developer)
Subscriptionを作
成して紐づけな
いと、エラーに
なるのは変わら
ない
• 新仕様その3
• 「すべてのAPI」に対するスタンドアロンサブスクリプションが最初から1つ用意されるようになった
(削除不可)
• 「すべてのAPI」なので、新規作成したAPIも必ずこの組み込みサブスクリプションで公開されるようになった
サブスクリプション
Nextscape Inc. 63
GroupA
グループ
アクセス制御
Products(製品)
API
既存API新規API
Subscription
すべてのAPI ユーザー(Developer)
Built-in
「すべてのAPI」
に紐づくBuilt-in
の Subscription
キーを使えばア
クセス可能!
Nextscape Inc. 64
• 組み込みの「すべてのAPI」に対するサブスクリプションは
「Build-in all-access subscription」という名称
(ちなみにPowershellでこいつの定義を覗いてみると、システム名はmasterという)
サブスクリプション
非アクティブになってい
て削除できない
Nextscape Inc. 65
• Built-in all-access subscriptionのサブスクリプションキーを使用したくない
場合は?
• APIを選択して、Settings画面の「Subscription required」のチェックを外す
サブスクリプション
このチェックを外すとア
クセス無制限ということ
になるので、本番では別
のアクセス制御をちゃん
と設定すること
• ユーザー(Developer)は利用許諾の申請を開発者ポータルより行う
• Azureポータルじゃない
サブスクリプション
Nextscape Inc. 66
• 申請を自動承認にした場合は、申請
されたら即時 subscription key が発行
される。
• 要承認にした場合は、Portalから管
理者が手動で承認する必要がある。
• 利用許諾の申請が発生してもメール
が飛ぶ、Webhookを叩くなどのメン
ションを飛ばすことができない(不
便すぎて困る)
• Portalに
• 「サブスクリプションの追加」
• 「サブスクライバーの追加」
• の2つの表記があり、用途の違いがわからなくて混乱しちゃうので整理しておく。
サブスクリプション
「サブスクリプションの追加」とは、「すべてのAPI」「単一API」「Products(製品)」のいずれかを必須指定し、
オプションとしてユーザー(Developer) を指定して新しいサブスクリプションを作成すること
Nextscape Inc. 67
• Products(製品)からサブスクリプションを選んだ時には、「サブスクライバーの追加」というメ
ニューがある。
サブスクリプション
「サブスクライバーの追加」とは、ユーザー(Developer)だけを指定してサブスクリプションを新
規作成すること(サブスクリプション名は自動生成)
Nextscape Inc. 68
ややこしいだけなので、はっきり申し上げて不要な機能
• ユーザーが開発者ポータルからサブスクライブする
要承認にした時のサブクライブの挙動
Nextscape Inc. 69
• Subscription name(利用許諾名)は自分で入力する(謎仕様)
要承認にした時のサブクライブの挙動
Nextscape Inc. 70
• リクエストしたので承認待ち状態になる
要承認にした時のサブクライブの挙動
Nextscape Inc. 71
• Azure Portalで見ると、承認待ち状態になっている。
• なぜか「状態」は「送信済み」という表記。(「承認待ち」にしてほしい・・・)
• 「サブスクリプションのアクティブ化」をクリックする。
要承認にした時のサブクライブの挙動
Nextscape Inc. 72
• 開発者ポータルを読み込みなおすと、Subscription Keyが発行されている
要承認にした時のサブクライブの挙動
Nextscape Inc. 73
開発者ポータル
Developers Portal
※docsでは「開発者」を「ユーザー」と表記しているページも多いので注意
https://<APIMName>.portal. azure-api.net
開発者ポータルのURLは
管理者権限があるならここ
から遷移すればいい
Nextscape Inc. 75
開発者ポータルの見た目(デザイン可能)
Nextscape Inc. 76
• 開発者が
• 自らユーザーとして登録する機能
• 開発者が使いたい成果物(APIを含んでいる)に対して利用許諾を申請する機能
• APIをお手軽に試すテスト機能
• 不具合を報告する機能(管理者にはmailが飛んでくる)
• などを持つ、開発者のための画面。
• APIMagementインスタンスとは全く別のリソースと思ったほうが良い
• 開発者ポータルはAPIMagementとは無関係のWebクライアントとして認識したほう
がdocsが読みやすい
• AzurePortalでは、(基本的に)開発者ポータルへのログインユーザーの権
限管理しかしない
• 権限管理以外だと、開発者ポータルがAPIMgmtに対してRequestする前に外部
IDProviderからid_token(JWT)を得る、もしくは認証サーバーからaccess_tokenを得
るための機能のための設定をするぐらい(ややこしいので後述する)
そもそも開発者ポータルとは何か
Nextscape Inc. 77
1.Portalから手動で追加する
2.Portalからメールアドレスを入力して招待する
3.開発者ポータルから自分でサインアップ(要セットアップ)
開発者を追加する方法は?
3つの方法がある
Nextscape Inc. 78
• Portalからのユーザー追加は ID/PW認証のみ
1.Portalから手動で追加する
Nextscape Inc. 79
2.Portalからメールアドレスを入力して招待する
Nextscape Inc. 80
2.Portalからメールアドレスを入力して招待する
Nextscape Inc. 81
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 82
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 83
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 84
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 85
• Portalにログインできて、かつユーザーを管理する権限を付与されているユーザーにしかできない
Portalから手動で追加する
• 開発者ポータルのID/PWを使ったサインアップ画面へのリンクがメールで飛ぶ
• Portalにログインできて、かつユーザーを管理する権限を付与されているユーザーにしかできない
• ID/PWサインアップのセットアップが必須(デフォルトでID/PW認証はセットアップされている)
Portalからメールアドレスを入力して招待する
• 運用者は開発者ポータルのURLを送るだけ良いので一番楽
• ID/PWを使ってサインアップ、もしくは
• 外部IDProvider(AzureAD, Facebook, Twitterなど)を使って認証させることができる
開発者ポータルから開発者が自分でサインアップ
開発者を追加する方法は?
まとめ
Nextscape Inc. 86
セキュリティ->ユーザーで認証方式を登録する
Nextscape Inc. 87
開発者ポータルサインアップのセットアップ方法は?
Nextscape Inc. 88
するとサインアップ画面が現れる
開発者ポータルサインアップのセットアップ方法は?
これが
こうなる
でも、これID/PWの場合だけ!
サインアップだとこうなっちゃう サインインなら外部のIDProviderが表示される
外部のIDProvider(FacebookとかTwiterとか)を有効にしたときはサインインを使
わないといけないので注意!
開発者ポータルサインアップのセットアップ方法は?
Nextscape Inc. 89
開発者ポータルの
カスタマイズが必須
(別に難しくはない)
• 認証の種類にFacebookって出る
Facebookで認証してサインアップすると
だから何ってわけじゃないけど・・・。
Nextscape Inc. 90
Nextscape Inc. 91
開発者ポータルって日本語化できないの?
完璧じゃないけど一応できる。もうすぐ
無くなってしまう発行者ポータルより設
定可能
(Portalで設定できるようになるはず)
セキュリティ
Security
API Managementでいうセキュリティは複数個所ある
セキュリティ
コンシューマ
パブリッシャー
API Management
開発者ポータル
1 2
API
Client
3
4
Nextscape Inc. 93
Nextscape Inc. 94
用途が混在していてわかりにくいので要注意
Portalのセキュリティセクション
• クライアント認証の検証時に使う証明書をUploadする
• APIを呼び出す時に使う証明書をUploadする
(どちらもUploadだけじゃダメで、Policyにて実装が必要)
• 開発者ポータルの認証方式の設定
• 開発者ポータルからAPIをテストする時にTokenを取得する
ために必要な認可サーバー(or IDProvider)の設定
1 2
3
4
APIClient
3
2
4は証明書の検証もできるが、PolicyでJWTの検証をするのがメイン1
1
説明済み
※従来「セキュリティ」にあった「ユーザー」と「委任」は、めでたく「Developer Portal」へ移動しました
• これをセットアップすると、開発者ポータルでTokanを取得できるようになる、というだけ!
• 勘違いしがちなのは、これをセットアップするとなんかよくわかんないけど外部の認証サー
バー(IDProvider)を使って認証してくれるようになるんだ、なんて思わないこと!
• なので、 APIのエンドポイントがむき出しの場合にAPI側で認証結果(JWTとか)を検証する実装
をさぼれる訳じゃない、ということ
• API側がFunctionsみたいにアクセスキーがある場合はアクセスキーの検証だけでOKとして、認証結果の検
証を実装しなくてもいいのかは判断が必要
• APIがVNET内部にDeployしてあって外部からの攻撃はない、という場合なら気にしなくていいかも
OAuth2.0, OpenIdConnectの使い方
• 開発者ポータルの認証方式の設定
• 開発者ポータルからAPIをテストする時にTokenを取得する
ために必要な認可サーバー(or IDProvider)の設定4
3
Nextscape Inc. 95
1 2
3
APIClient 4
説明済み
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 96
AzureADという名前を
付けた
• APIにOAuth2.0を使用するようにセットアップ(これが誤解させる元凶)
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 97
Try it をクリックして
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 98
承認コードを選択する
• ログインダイアログがポップアップ(ログインしていなかった場合)
• アクセス許可の承認を求められる
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 99
• アクセストークンを取得して保持したこと
がわかる
PortalのTest機能は、サブ
スクリプションキーを自
動的にHeaderにセットす
る機能しかない
OAuth2.0, OpenIdConnectの使い方
• PortalのTest機能にはアクセストークンを取得する機能はないので間違えな
いように!(開発者ポータルでやること!)
Nextscape Inc. 100
• API Managementは認証・認可(承認)の機能は持っていない。あくまでJWTの検証をするPolicy
がデフォルトで用意されているだけ
• JWTを検証する、ということはIDProviderはAzureAD、B2Cだけしか使えないわけじゃない。
OpenIdConnectをサポートするIDProviderであればなんでも大丈夫
validate-jwt 1 2
3
APIClient 4
は証明書の検証もできるが、PolicyでJWTの検証をするのがメイン1
Client
API Mgmt
B2C
IDProvider
JWT
JWT
• OAuth2.0ではなくOpenId Connectであることに注意。
OAuth2.0の返すaccess_tokenは仕様が策定されてないし、
通常JWTは使用されない。(ランダム文字列)
• OpenId Connectであれば、id_tokenがJWTで返却される。
• id_tokenの中にClameが格納されている。
Nextscape Inc. 101
• 最終的に次の構成を組む
validate-jwtを試す(敢えてAzureAD以外で)
Client API Mgmt
JWT
API
JWT
Validate
OpenId Connect
• その前にまずはローカル環境JWTを取得する実装をして、JWTのValidationもやってみる
Client
JWTJWT
Validate
JWT
OpenId Connect JWT
Client
Nextscape Inc. 102
• https://console.developers.google.com
• プロジェクトを作る
• 既にあるならそれでもいい
Google Developers Console
Nextscape Inc. 103
Google+ APIを追加する
Nextscape Inc. 104
• 認証にはこのAPIの追加が必要、というBlogもあれば、不要、というBlogもある
• 今回はそこがポイントじゃないので取り合ず追加しとく
• (多分追加は不要だと思われる。オワコンだし)
Google+ APIを追加する
Nextscape Inc. 105
認証情報を作る
Nextscape Inc. 106
認証情報を作る
Nextscape Inc. 107
• アプリケーション名を入
れる
• 他の項目はそのままでい
い
認証情報を作る
Nextscape Inc. 108
認証情報を作る
認証後にGoogleAPIからid_tokenが
戻ってくるリダイレクト先のURI。
まだWeb画面作っていないので後で
入力する
Nextscape Inc. 109
• メモらなくてもいつでも
確認できる
認証情報を作る
Nextscape Inc. 110
• ASP.NET Core 2.1で作る
• VS, VSCodeのどっちでもいいけど個人認証ありでプロ
ジェクトを作る
• dotnet new mvc --auth Individual (VSCodeの場合)
Webクライアントを作る
JWTJWT
ValidateOpenId Connect JWT
Nextscape Inc. 111
• GoogleのOpenId Connectによる認証を実施する設定
• StartUpクラスのConfigureServicesメソッドに次の実装をする
Webクライアントを作る
services.AddAuthentication()
.AddGoogle(googleOptions =>
{
googleOptions.ClientId = Configuration["Authentication:Google:ClientId"];
googleOptions.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
googleOptions.Scope.Add("https://www.googleapis.com/auth/plus.login");
googleOptions.SaveTokens = true;
});
• SaveTokens = trueにセットしておくと、id_tokenがHttpContextにセットされて
ほしいんだけどされない。(access token, refresh token専用らしい)
• Contollerで
• とすればid_tokenが取得できて、これをHeaderに入れてWebAPIに投げたかった
• でもどうやってもid_tokenをControllerに渡せなかった・・・。
HttpContext.GetTokenAsync("id_token")
ClientId、ClientSecretは
Google Dev Consoleで認証
作成した結果をセットする
「ユーザーシートク
レット]ってやつ
dotnet user-secrets –h
でヘルプが出る
Nextscape Inc. 112
launchSettings.jsonは、
Propertiesフォルダ内にある
SSL Portを確認してRedirectURlをGoogleに登録
Nextscape Inc. 114
• ミドルウェアを使った場合、RedirectURIのリソース名はsignin-googleで固定。今回は
https://localhost:44315/signin-google となる
• FacebookやAzureADの場合は、signin-xxxのxxxが変わる
• このRedirectURIが一致しないとエラーになるので間違えないように
• 認証情報 -> 作った認証情報右にある鉛筆アイコンをクリックする
SSL Portを確認してRedirectURlをGoogleに登録
Nextscape Inc. 115
• RedirectURIは複数登録で
きるので便利
(本番、テスト用にそれ
ぞれ作る必要がない)
SSL Portを確認してRedirectURlをGoogleに登録
Nextscape Inc. 116
画面を動かして確認
Nextscape Inc. 117
または
画面を動かして確認
Nextscape Inc. 118
画面を動かして確認
Nextscape Inc. 119
ログイン成功
Nextscape Inc. 120
ログイン時のメルア
ドが表示される
• 本当はControllerからWebAPIを呼ぶ実装にしたかったが、取得したid_token
をControllerに渡せないため、手動でid_tokenを取得しておいてPOSTMANを
使ってWebAPIを叩くことにする。
id_tokenの取得
ブレイクポイントを
置いて、この
id_token変数の中身
を見る
Nextscape Inc. 122
WebAPIを作る
JWTJWT
ValidateOpenId Connect JWT
• ASP.NET Core 2.1で作る
• VS, VSCodeのどっちでもいいけど個人認証ありでプロ
ジェクトを作る
• dotnet new webapi (VSCodeの場合)
Nextscape Inc. 123
• services.AddMvcメソッドの上に実装する
JWTのValidation実装をStartupクラスにする
Nextscape Inc. 124
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.Audience = Configuration["Authentication:Google:ClientId"];
options.Authority = "https://accounts.google.com";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
NameClaimType = "name",
AuthenticationType = "Google." + JwtBearerDefaults.AuthenticationScheme,
ValidIssuers = new[] { options.Authority, "accounts.google.com" },
};
});
ClientIdはGoogle Dev
Consoleで認証作成した結
果をセットする
• StartupクラスのConfigureメソッドに次の一行を実装
認証ミドルウェアを有効化
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
Nextscape Inc. 125
APIに簡単な実装をしておく
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { User.Identity.Name, User.Claims.Count().ToString() };
//return new string[] { "value1", "value2" };
}
Nextscape Inc. 126
• httpsの検証をOffにしておく
POSTMANでAPIを叩いてみる
Nextscape Inc. 127
最初は401になるのが正解
Nextscape Inc. 128
• ちゃんと結果
がとれた
JWTをAuthヘッダーに入れて呼び出す
Nextscape Inc. 129
間にAPI Managementを挟む
API Mgmt
JWT
Validate
Client JWT
JWT Validate
OpenId Connect
JWT
API
手動JWT
セット
Client JWT
JWT Validate
OpenId Connect
JWT
API
手動JWT
セット
Nextscape Inc. 130
• 動作確認OK
WebAPIをAzure WebAppsにデプロイした
Nextscape Inc. 131
• サブスクリプションは不要にしてある
WebAppsをAPIMのAPIに登録して成果物と紐づけ
Nextscape Inc. 132
validate-jwtを実装する(APIレベルに対して)
Nextscape Inc. 133
• ClientIdを入れるだけで実装終了
validate-jwtを実装する(APIレベルに対して)
<inbound>
<base />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-
validation-error-message="Unauthorized" require-expiration-time="true" require-
scheme="Bearer" require-signed-tokens="true" clock-skew="0">
<openid-config url="https://accounts.google.com/.well-known/openid-configuration" />
<audiences>
<audience><!-- ClientId --></audience>
</audiences>
<issuers>
<issuer>accounts.google.com</issuer>
<issuer>https://accounts.google.com</issuer>
</issuers>
</validate-jwt>
</inbound>
Nextscape Inc. 134
• JWTなしの場合
確認
Nextscape Inc. 135
Nextscape Inc. 136
• curl https://accounts.google.com/.well-known/openid-configuration
(おまけ)GoogleのエンドポイントはDiscovery Docから取得
Nextscape Inc. 137
• https://www.googleapis.com/oauth2/v3/certs
• 1時間に1回変わるそうなので、自前でValidateするとキツそう
(おまけ)Googleと検証側で共有する公開鍵
Nextscape Inc. 138
• Clientが渡してきたクライアント証明書を検証する実装
証明書の使い方
• クライアント認証の検証時に使う証明書をUploadする
• APIを呼び出す時に使う証明書をUploadする
(どちらもUploadだけじゃダメで、Policyにて実装が必要)2
1
<choose>
<when condition="@(context.Request.Certificate == null
|| !context.Deployment.Certificates.Any(c => c.Value.Thumbprint ==
context.Request.Certificate.Thumbprint))" >
<return-response>
<set-status code="403" reason="Invalid client certificate" />
</return-response>
</when>
</choose>
※未検証
Nextscape Inc. 139
1 2
3
APIClient 4
• APIを呼び出す時にクライアント証明書を渡す実装方法
証明書の使い方
• クライアント認証の検証時に使う証明書をUploadする
• APIを呼び出す時に使う証明書をUploadする
(どちらもUploadだけじゃダメで、Policyにて実装が必要)2
1
<inbound>
<authentication-certificate thumbprint="thumbprint" />
<base />
</inbound>
※未検証
Nextscape Inc. 140
1 2
3
APIClient 4
構成パターン
Construction pattern
• 公開エンドポイントのセキュリティに注意。
• APIMgmtのPublicIPは、自分からインスタンスを消さない限り固定なので、ホワイトリスト対応が可能なPaaSならそれ
でOKとして良いかも
公開されたエンドポイントのProxyにする構成
コンシューマ
Client
Azure On-Premiss
APIMgmt
開発者ポータル
DMZ
VNET
Public IP
WebApps Functions
開発者
公開されたエンドポイント
Nextscape Inc. 142
• APIMgmtからVNET内部のリソースにアクセス可能です。
• ServiceEndpointに接続したリソースは403エラーになるのでNG(確認した)
VNETのリソースを外部公開する構成
コンシューマ
Client
APIServer
VNET
SubnetSubnet
APIMgmt
APIMgmtが接続する専用のサブネット
が必要。このサブネットには他のリ
ソースが割り当てられていてはNG
最小/29
開発者
Azure On-Premiss
開発者ポータル
VPN
Gateway
Nextscape Inc. 143
• オンプレからのAPIアクセスも外を通らない
• DNSに注意がいる(DNS立てないと名前解決全滅。Portalのテストすら動かない!)
内部だけに公開する構成
コンシューマ
Client
APIServer
VNET
SubnetSubnet
APIMgmt
開発者ポータル
最小/29
Azure On-Premiss
開発者
VPN
Gateway
開発者ポータルは、外部からも内部からもアクセスで
きなくなる。VNET内部にデプロイされるわけではな
いので、内部IPが割り当てられない。
Nextscape Inc. 144
• Portalのテストすら動かない
APIMgmtをVNET内部に置いた場合
名前解決に失敗している
Nextscape Inc. 145
DevまたはPremiumレベル(月額319,064! )でないと「仮想ネットワーク」は表示されない
(表示されない=VNETに接続できない)
VNETにつなげるにはPremiumレベル必須
Nextscape Inc. 146
バージョン管理
Version Management
• API Managementではリビジョンとバージョンの2つの機能でAPIのメンテ
ナンスすることができる
リビジョンとバージョン
Nextscape Inc. 148
リビジョン
• WebAppsのスロット機能ととても良
く似た仕組み。API単位に作成可能。
バージョン
• 異なるバージョンのAPIを同時に公
開するためのもの。
• リビジョンごとに別API別URLになる
• 複数のリビジョンを作成できる
• リビジョンを指定して本番APIに切り替え
リビジョン
Nextscape Inc. 149
• 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/resource
Revision=2のURL
https://<resourceName>.azure-
api.net/echo;rev=2/resource
Revision=1のURL
https://<resourceName>.azure-
api.net/echo;rev=1/resource
メインのURL
https://<resourceName>.azure-api.net/echo/resource
Revision=2をメインに切り替え
リビジョン
Nextscape Inc. 150
• Revsionが入ったURLは、知っていれば誰でもアクセスできてしまうので、サブスクリプション
キー必須にするなどしてAPIを守るようにすること
リビジョン使用時の注意
• 本番で稼働しているAPI定義やPoliciyに影響を与えることなく、安全に変更することができる
• APIM定義をPublishする前に稼働確認ができる
• 切り替え時に変更点を記載すると開発者ポータルに表示できるため、開発者に対して何をし
たのかアナウンスできる
• リビジョンの切り替えがすぐ反映されるので、問題があったらすぐにロールバックできる
(即時反映なので、DNS切り替えではないみたい)
リビジョンを使用する理由
リビジョンの作成方法
Nextscape Inc. 151
• リビジョン一覧画面に表示される説明文。後から修正できる
リビジョンの作成方法
Nextscape Inc. 152
• RevisionのIDは自動採番される
リビジョンの作成方法
URLの例
https://<resourceName>.azure-api.net/echo;rev=2/resource?param1=sample
Nextscape Inc. 153
このリビジョンをメインとして公開する
リビジョンの管理
Nextscape Inc. 154
このリビジョンを削除する
このリビジョンを非公開にする
Nextscape Inc. 155
• 特定のリビジョンを公開しようとするとこんなダイアログがあがる
APIの更新ログ
Nextscape Inc. 156
• 書いた内容が開発者ポータルに公開される
APIの更新ログ
• 例 /v1, /ver1
パス
• 例 ?ver=1, ?api-ver=2, ?api-version=2018-11-01
クエリ文字列
• 例 ver:v1, api-ver:2, api-ver:2018-11-01
Header
バージョン
Nextscape Inc. 157
同時に複数のバージョンのAPIを公開する機能
バージョン文字列は、好き
な文字列が使用可能(数字、
日付、名前など)
バージョンの差異はバージョン文字列を次の3種類のいずれかに埋め込む
• APIの各バージョンは開発者ポータルで一覧で表示される
バージョン
Nextscape Inc. 158
• API公開後にバージョニングを開始すると、最初のバージョンのURLを変更できない(ユーザーに影
響がある)ため、混乱を招いてしまう。
バージョン使用時の注意点
バージョン
Nextscape Inc. 159
最初のバージョンのURL
https://<resourceName>.azure-api.net/<api>/<operation>
バージョニングしたURL
htps://<resourceName>.azure-api.net/<api>/v2/<operation>
• 破壊的な更新をリリースすることができる
バージョンを使用する理由
この2つのURLが同
時に使用可能な状態
Nextscape Inc. 160
この例ではblank APIだが、
1. Fullを選択
2. Version this API?に
チェック
でバージョニング開始と
なるのは他のテンプレー
トを選んでも同じ
API作成時にバージョニングを開始する
API作成後でバージョニングを開始する
Nextscape Inc. 161
API作成後でバージョニングを開始する
Nextscape Inc. 162
Nextscape Inc. 163
バージョニング開始前API。
何もしなければURLは元のままだが、この
APIにバージョンを後から追加もできる
※URLが変わるということ。
※適用は慎重に!(ユーザーに影響)
だったらバージョニングは、最初からするべき
公開前であれば、影響なく後からバージョニングを開始できるので慌てて作り直さないこと
どうやって使い分けするのか
バージョンとリビジョンは目的が異なるため、どちらかだけ使用するのでもいいが、どう考えても
両方使用することになる
バージョンとリビジョンの使い方
Nextscape Inc. 164
1. 次のバージョンを作る
2. 最初のAPIをバージョンを指定
3. 次のバージョンを消す
Nextscape Inc. 165
docs では透過的バージョンアップという手法が提案されている
• https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-cache-
by-key#transparent-versioning
• APIM側のバージョンアップにクライアントが合わせるのではなく、クライアント
に合わせてAPIM側がバージョンを切り替えるやり方のことらしい
クライアントに影響を与えないバージョンアップ戦略
API
APIM
通常はクライアントが
バージョンを選択する
API
APIM
透過的バージョンアップは
APIMがバージョンを選択する
BackendAPI
v1
v2
v3
v1
v2
v3
BackendAPI
v1
v2
v3
Nextscape Inc. 166
docsに記載されているサンプルの図解
• どのクライアントがアクセスしてきたのかをSubscriptionKeyで判定する方法
透過的バージョンアップの構成
API
APIM
BackendAPI
v1
v2
v3
1.HeaderにSubscriptionKey
を入れてRequest
バージョン管理
2. SubscriptionKeyをキーにキャッシュに
データがあるかを確認
3. データがキャッシュがな
かったら、SubscriptionKeyを
キーに外部からバージョンを
取得し、キャッシュへ格納
4.BackendAPIのURLを取得し
たバージョンに書き換え
キャッシュにはSubscriptionKeyを
キーにバージョンが格納されている
KeyValueのキャッシュ機能が
APIMにはある(フラグメント
キャッシュ)
Nextscape Inc. 167
docs の日本語が難しいが、恐らくこういうことが言いたいんだと思われる
• https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-cache-
by-key#tenant-isolation
バックエンドの障害対応と段階的ロールアウト
API
APIM
BackendAPI
v1
BackendAPI
v1
BackendAPI
v1
v1
同じバージョンのBackendAPIを複数用意
しておき、クライアントがどの
BackendAPIにアクセスするのかをAPIMが
判定するように設計する
• 設定方法は透過的バージョンアップとほ
ぼ同じ
• BackendAPIのハードウェア障害が起こった時
に、影響があるクライアントが限定される
• BackendAPIのハードウェアごとにバージョン
アップをしていくことで段階的にロールアウ
トが可能となる(似非カナリアリリース)
API Management のエラー処理
Error handling
API Management のエラー処理
Nextscape Inc. 169
• API Mamagementでいうエラーは、Policyで発生したエラーと、Backend API
で発生したエラーと二種類あることを意識しておくこと
Policy
In
Out
Err
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Backend
BackendAPIのResponseが
4xx, 5xxの場合
<outbound>でエラーハン
ドリング
PolicyがエラーをThrowの場合
<on-error>でハンドリング
API Management
• <inbound>,<backend>,<outbound>セクションのいずれかに設定したポリシーで発生したエラー
は即時<on-error>セクションへ飛ぶ
• Policyが発生させるエラーの種類は、事前定義されたものだけ。設定と異なる状況になったら
エラーがThrowされる
• docsには
と書いてあるが、実際には4xx、5xxコードが返却されるようだ
エラーハンドリングは <on-error>セクション に実装する
Policyで発生したエラーへの対処
Nextscape Inc. 170
※Policy内部ではエラーをThrowできない。(Exceptionクラスが使えないから)
もし、<return-response>ポリシーでエラーのResponseを返却するように実装した場合、
Responseは<on-error>, <outbound>セクションを通らないので注意
• エラー処理の例
Policyで発生したエラーへの対処
Nextscape Inc. 171
<policies>
<inbound>
<rate-limit calls="5" renewal-period="60" />
<quota calls="100" renewal-period="604800" />
<base />
</inbound>
・・・
<on-error>
<base />
</on-error>
</policies>
エラー処理はまだ入れていない
1分間に5回までのリクエスト制限 わざと1分以内に6回リクエストした
Policyが返却した
独自のStatusCode
• エラー処理を実装した
Policyで発生したエラーへの対処
Nextscape Inc. 172
<on-error>
<base />
<choose>
<when condition="@(context.Response.StatusCode == 429)">
<return-response>
<set-status code="499" reason="catch error in onerror" />
<set-header name="ErrorSource" exists-action="override">
<value>@(context.LastError.Source)</value>
</set-header>
<set-header name="ErrorReason" exists-action="override">
<value>@(context.LastError.Reason)</value>
</set-header>
・・・
<set-body>Response is customized in on-error.</set-body>
</return-response>
</when>
<otherwise />
</choose>
</on-error>
ResponseのStatusCodeが429の場合は499を返却する
わざと1分以内に6回リクエストした
※API Managementでは、Custom の Http StatusCodeは101~599の範囲のみ設定可能
エラー詳細をHeaderへセット(全実装は次ページ)
なぜかReason
を表示してく
れない・・・
• エラーの詳細情報をheaderへセットする実装(docsまんまだけど)
Policyで発生したエラーへの対処
<on-error>
<set-header name="ErrorSource" exists-action="override">
<value>@(context.LastError.Source)</value>
</set-header>
<set-header name="ErrorReason" exists-action="override">
<value>@(context.LastError.Reason)</value>
</set-header>
<set-header name="ErrorMessage" exists-action="override">
<value>@(context.LastError.Message)</value>
</set-header>
<set-header name="ErrorSection" exists-action="override">
<value>@(context.LastError.Section)</value>
</set-header>
<set-header name="ErrorStatusCode" exists-action="override">
<value>@(context.Response.StatusCode.ToString())</value>
</set-header>
<base />
</on-error>
Nextscape Inc. 173
• デバッグ用途の実装ならこ
れでいい
• 本番用の実装では逆に詳細
を出力しすぎないようにし
ないといけない
• Sectionの情報は出力し
ない、とか
• 本番用の実装では、エラー
発生時にだけロギングする
仕掛けが必要。<on-error>
でEventHubへの出力を検討
すること
• Storageへの出力だと確
実に出力される保証が
ない
• context.Response.StatusCodeを使って、対処方法を分岐させる
• 基本的なエラー処理の方針は、Responseの加工となる(必要なら加工する)
• エラーの発生時のログ出力は通常はAPI側で実装していなければいけないが、APIMでログ出力
をする必要があるならここでEventHubへ出力する実装をする
エラーハンドリングは <outbound>セクション に実装する
Backend APIで発生したエラーへの対処
Nextscape Inc. 174
<outbound>
<base />
<choose>
<when condition="@(context.Response.StatusCode>=500)">
<return-response>
<set-status code="499" reason="ChangeStatusCode" />
<set-body>Error Raised in backend API.</set-body>
</return-response>
</when>
<otherwise />
</choose>
</outbound>
ResponseのStatusCodeが5xx系の場
合は499を返却する
ロギング
logging
APIMで取得できるログの種類
ロギング
• Azureのリソースが出力する
自身のデータ。リソースの種
類によって出力されるデータ
が異なる。APIMの場合、
TotalRequests数や
FailedRequests数など。
• メトリックの数値を元にア
ラートを設定することが多い。
メトリックス
Nextscape Inc. 176
• Azureのリソースを
外部から操作した
操作ログ。APIMの
場合、”Create API”
や”Add API to
Product”など。
アクティビティ
ロギング
APIMで取得できるログの種類
Nextscape Inc. 177
• 監査・トラブルシューティングに
使用するためにAzureリソースが出
力するログ。
• API Management は、個々の API 要
求についての診断ログ を数分に1回
出力する。リアルタイム性はない
• 事前定義されたスキーマしか出力
できない
診断ログ
ロギング
APIMで取得できるログの種類
Nextscape Inc. 178
• EventHubsへ出力する設定をやってみた
ロギング
Nextscape Inc. 179
これはEventHubsのポリシー。ポリシー
毎にアクセス権が設定されている。
これにCheckを入れないとEventHubsへ
診断ログが出力されない
1Requestごとの診断ログ。
5分に1回、1分毎5分間のログを出力
(※ Requestがあった場合だけ)
• 診断ログのEventHubs
への出力
• GatewayLog(1Request
についてのログ)は約
1分ごとに出力される
が、観察していると消
失するログもある
• GatewayRequests,
Capacity(メトリッ
ク)はRequestがあった
時は1分間隔のログを5
分間分、5分に1回出力
する
• Docsには「1時間に1回
出力する」と記載があ
るが違うみたい
ロギング 診断ログをEventHubsへ出力する設定
をして、StreamAnalitycs->Functionsへ
と接続した
Nextscape Inc. 180
1分ずつ、5分間のログ
• GatewayLogにて出力され
るエラーログはこんな感
じ
ロギング
Nextscape Inc. 181
{
"Level": 4,
"isRequestSuccess": 0,
"time": "2018-11-05T13:57:09.0583391Z",
"operationName": "Microsoft.ApiManagement/GatewayLogs",
"category": "GatewayLogs",
"durationMs": 0,
"callerIpAddress": "13.91.254.72",
"correlationId": “********-****-****-****-************",
"location": "Japan West",
"properties": {
"lastError": {
"source": "validate-jwt",
"reason": "TokenNotPresent",
"message": "JWT not present.",
"scope": "api",
"section": "inbound"
},
"method": "GET",
"url": "https://nsuesaka.azure-api.net/echo/resource?param1=sample",
"responseCode": 401,
"responseSize": 118,
"cache": "none",
"apiId": "echo-api",
"operationId": "retrieve-resource",
"productId": "starter",
"clientProtocol": "HTTP/1.1",
"apiRevision": "1"
},
“resourceId”: “/SUBSCRIPTIONS/*******-****-****-…"
}
エラーを出力したポリシー
ポリシーのスコープ
ポリシーを実装したセクション
• この情報以上は出力できな
いので、例えばこのリクエ
ストは誰?という特定はで
きない
• フルカスタマイズしたログを出力したいならこのポリシーを使う
• docsにはREST APIを使用する例しかないが、PowerShellのほうが全然簡単
EventHubへ出力するポリシー
Nextscape Inc. 182
$context = New-AzureRmApiManagementContext `
-ResourceGroupName <resourceGroupName> `
-ServiceName <serviceName>
New-AzureRmApiManagementLogger `
-Context $apimContext `
-LoggerId "LoggerId123" `
-Name “eventHubName" `
-ConnectionString `
"Endpoint=sb://<eventHubNameSpace>.servicebus.windows.net/;SharedAccessKeyName=SendKey;SharedAc
cessKey=<key>" `
-Description “Test logger"
設定先のAPI Management のContextオブジェクトを取得する
任意の文字列
任意の文字列
EventHub名
API ManagementにEventHub対応のロガーを作成
API Managementに設定したロガーの一覧
EventHubへ出力するポリシー
Nextscape Inc. 183
Get-AzureRmApiManagementLogger `
-Context $apimContext
• おまけのコマンド一覧
API Managementに設定したロガーの削除
Remove-AzureRmApiManagementLogger `
-Context $apimContext `
-LoggerId <loggerId>
Nextscape Inc. 184
• <log-to-eventhub>ポリシーの書き方
• <log-to-eventhub>は<inbound>, <backend>, <outbound>, <on-error>で記載可
EventHubへ出力するポリシー
<inbound>
<base />
<log-to-eventhub logger-id=“<LoggerId>”>@(“文字列ならOK!”)</log-to-eventhub>
</inbound>
<inbound>
<base />
<log-to-eventhub logger-id="LoggerCreatedFromPowerShell">@( string.Join(",",
DateTime.UtcNow, context.Deployment.ServiceName, context.RequestId,
context.Request.IpAddress, context.Operation.Name) )</log-to-eventhub>
</inbound>
• 実装例
• contextから色々引っ張ってくるべし
Nextscape Inc. 185
• うまく実装できると、Traceにこんな感じで出力される
EventHubへ出力するポリシー
log-to-eventhub (0.163 ms)
{
"message": "Expression was successfully evaluated.",
"expression": " string.Join(¥",¥", DateTime.UtcNow, context.Deployment.ServiceName, context.RequestId,
context.Request.IpAddress, context.Operation.Name) ",
"value": "11/20/2018 12:13:58 PM,nsuesaka.azure-api.net,545118f2-18db-4044-8ac2-
4d0102fdfcd2,13.91.254.72,Retrieve resource“
}
log-to-eventhub (0.055 ms)
{
"message": "Log to EventHub Policy was successfully processed“
}
Nextscape Inc. 186
• EventHubからデータを取得してみるとこんな感じ
EventHubへ出力するポリシー
Nextscape Inc. 187
• ゴリゴリに加工したログ(docsより)
EventHubへ出力するポリシー
<log-to-eventhub logger-id="conferencelogger" partition-id="0">
@{
var requestLine = string.Format("{0} {1} HTTP/1.1¥r¥n",
context.Request.Method,
context.Request.Url.Path + context.Request.Url.QueryString);
var body = context.Request.Body?.As<string>(true);
if (body != null && body.Length > 1024)
{
body = body.Substring(0, 1024);
}
var headers = context.Request.Headers
.Where(h => h.Key != "Authorization" && h.Key != "Ocp-Apim-Subscription-Key")
.Select(h => string.Format("{0}: {1}", h.Key, String.Join(", ", h.Value)))
.ToArray<string>();
var headerString = (headers.Any()) ? string.Join("¥r¥n", headers) + "¥r¥n" : string.Empty;
return "request:" + "¥n"
+ requestLine + headerString + "¥r¥n" + body;
}
</log-to-eventhub>
Log Analyticsへ接続する
Nextscape Inc. 188
Nextscape Inc. 189
• Log Analyticsへの結果出力は1時間に1回
ぐらい?すごく遅いので、名前の通り
あくまで分析用
Log Analyticsへ接続する
通信量
スケーリング
Scaling
ユニット、という単位でスケールする
スケーリング
Nextscape Inc. 191
レベル Developer Basic Standard Premium
最大ユニット数 1 2 4 10/リージョン
料金 5483.28/月 16,799.52/月 78,387.84/月 319,064.4/月
7.37/時間 22.58/時間 105.36/時間 428.85/時間
SLA 99.9% 99.9% 99.9% 99.95%
予測最大スループット/ユニットごと 500 Req/Sec 1000 Req/Sec 2500 Req/Sec 4000 Req/Sec
(2018/11 東日本の単価。課金は時間単位)
• 1ユニットの作成には15分~40分かかる
• 従量課金の場合は自動スケールするため対象外
※ユニット=APIMインスタンス、の理解で間違いない
複数リージョンへのデプロイが可能
• Premiumレベルの場合のみ設定可能。2リージョン以上へのデプロイでSLAが99.95%になる
自動スケール
• Standard、Premiumレベルの場合のみ設定可能(従量課金の場合逆に自動スケールしかない)
• ユニットの増加は20分以上かかる
• 複数リージョンへデプロイしている場合、自動スケールはプライマリリージョンだけが対象
• プライマリリージョン:最初にAPIMを作ったリージョンのこと
スケーリング
Nextscape Inc. 192
Nextscape Inc. 193
• スケールしてみる
スケーリング
Nextscape Inc. 194
• 複数リージョンへデプロイしてみる
複数リージョンへのデプロイ
Nextscape Inc. 195
複数リージョンへのデプロイ
Nextscape Inc. 196
パフォーマンスへの影響
• BackendAPIは元のリージョンに1つだけだと、プライマリリージョン以外にデプロイされたAPIMはアクセ
スがある度に異なるリージョンのBackendAPIを叩きに行くため、パフォーマンスが悪い
解決方法は2つ
• BackendAPIも各リージョンへデプロイし、APIMがデプロイされている場所に応じてBackendAPIを切り替え
るようにポリシーを作成する
• キャッシュを使う(キャッシュのセクションを参照)
複数リージョンへのデプロイの懸念点
Nextscape Inc. 197
• APIM自身がどのリージョンにデプロイされているかを判定して、
BackendAPIを切り替えるポリシーの例
複数リージョンへのデプロイ
<inbound>
<base />
<choose>
<when condition="@("West US".Equals(context.Deployment.Region, StringComparison.OrdinalIgnoreCase))">
<set-backend-service base-url="http://contoso-us.com/" />
</when>
<when condition="@("East Asia".Equals(context.Deployment.Region, StringComparison.OrdinalIgnoreCase))">
<set-backend-service base-url="http://contoso-asia.com/" />
</when>
<otherwise>
<set-backend-service base-url="http://contoso-other.com/" />
</otherwise>
</choose>
</inbound>
docに記載されているもの
Nextscape Inc. 198
• なぜかAPIMの自動スケールはAzure Monitorから設定する
自動スケール
Nextscape Inc. 199
自動スケール
Nextscape Inc. 200
自動スケールの設定は、メトリックを基にするか、スケジュールするかの2択。
だがインスタンス数の増減に20分以上もかかるので、メトリックを基にするのは
現実的じゃない。スケジュールによる設定しか使わないだろう。
自動スケール
• スケジュールによる自動スケール設定は、条件(condition)を3つ作成する。1つ目はデフォルト設定。
Nextscape Inc. 201
• 2つ目の条件
スケールアウトの設定例
自動スケール
• 3つ目の条件
スケールインの設定例
キャッシュ
Cache
キャッシュは2つのポリシーを対で設定する
• キャッシュからデータを取得するポリシー cache-lookup を inboundに設定
• データをキャッシュに格納するポリシー cache-store を outboundに設定
キャッシュ
Nextscape Inc. 203
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false>
<vary-by-header>Accept</vary-by-header>
<vary-by-query-parameter>version</vary-by-query-parameter>
</cache-lookup>
</inbound>
<outbound>
<cache-store duration="seconds" />
<base />
</outbound>
開発者キーごとに応答
をキャッシュするか
開発者グループごとに応
答をキャッシュするか
キャッシュするポリシーを設定
キャッシュを検索す
るポリシー
キャッシュ保持時間を設定
キャッシュする単位。
複数指定可能
• キャッシュする場所と数
CDNとの違い
Nextscape Inc. 204
• 事前キャッシュ
CDN
Edgeサーバーが全世界各地に配置してある。Edgeまでの物理的な距離が近いほどEdgeまで
の到達時間は早いためキャッシュしてあればレスポンスは速い。が、キャッシュする場所
が多いということはOriginアクセスも意外と多い
API Management
テナント単位の共有データ キャッシュ。(テナント=作成済みAPIMリソース)が使用され
るため、1リージョン1キャッシュ。複数のユニットにスケールアップしても、同じ
キャッシュ データにアクセス可能。ただし、複数リージョンにデプロイした場合はそれぞ
れのリージョン別のキャッシュとなる
CDN できる。Poralから、もしくはAPIを使用したキャッシュも可能
API Management できない。<outbound>ポリシーでキャッシュするので、事前にはできない
• パージ
CDNとの違い
Nextscape Inc. 205
• キャッシュコントロール
CDN
任意のタイミングでキャッシュを削除できる。Poralから、もしくはAPIを使用した削除も
可能
API Management 任意に削除できない。キャッシュ保持経過時間が過ぎるのを待つしかない
CDN
• クエリ文字列ごとに違うキャッシュにできる
• Http-Headerの各種メタごとに違うキャッシュにできる
API Management CDNと同じ
明示的にKeyを指定して値をキャッシュする機能のこと
docsには例として、他のサービスから取得したユーザープロファイルをユーザーIDをKeyにして
キャッシュし、それをResponseに埋め込む、というやり方を解説している(次頁で図解)
フラグメントキャッシュとは
Nextscape Inc. 206
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-cache-by-key#fragment-caching
色々できる柔軟性は素晴らしいが、そこまでAPI Managementで実装するのはやり過ぎではないだろうか・・・
• docs記載のシナリオを図解
Nextscape Inc. 207
フラグメントキャッシュとは
1. Request API
2. キー使ってキャッシュに
顧客データがあるかを確認
顧客データ
航空予約システム
4.予約データを取得
3. キャッシュに顧客データが
なかったら、外部からデータ
を取得し、キャッシュへ格納
6. Response
5.取得した予約デー
タの一部のプレース
ホルダに対して、顧
客データをセット顧客データを埋めるプ
レースホルダが予約デー
タにある、という前提が
現実的じゃない
フラグメントキャッシュとは
Nextscape Inc. 208
• フラグメントキャッシュポリシーは3つのポリシーを使う
キャッシュから値を取得するポリシーcache-lookup-value
• このポリシーで取得した値は、context.variables[keyName]に格納される
値をキャッシュに格納するポリシーcache-store-value
• key, value, durationを設定する
必要に応じてフラグメントキャッシュを削除する
• cache-remove-value ポリシー
詳しくはこちら
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-caching-policies
• 実装例(docsより)
Nextscape Inc. 209
フラグメントキャッシュとは
<inbound>
<cache-lookup-value
key="@("userprofile-" + context.Variables["enduserid"])“ variable-name="userprofile" />
<choose>
<when condition="@(!context.Variables.ContainsKey("userprofile"))">
<send-request mode="new“
response-variable-name="userprofileresponse“ timeout=“10“ ignore-error="true">
・・・
</send-request>
<set-variable name="userprofile“
value="@(((IResponse)context.Variables["userprofileresponse"]).Body.As<string>())" />
<cache-store-value key="@("userprofile-" + context.Variables["enduserid"])“
value="@((string)context.Variables["userprofile"])“ duration="100000" />
</inbound>
“userprofile-xxxx”というキーで
キャッシュから値を取得
値がなかったら
データをキャッシュへ格納
外部からデータを取得して 変数に格納
Backup / Restore
Backup / Restore
Backup / Restoreコマンド
API の Export / Import
Git の Repository を Clone
3種類の Backup / Restoreがある
Nextscape Inc. 211
Backup / Restore コマンド
誰もがイメージする Backup/Restoreはこの機能のこと
REST APIもしくはPowerShellコマンドしか用意されていない(Portal に該当機能なし)
バックアップした結果はBlob Storageへ格納される(Blobのリージョンとレベルに注意。
APIMと同じリージョンにLRSで保存するとDR的には意味がないってこと)
Backup時と同じレベル(Dev, Basic, Std, Prem)のインスタンスしかRestoreできない
30日以内のバックアップしか復元できない!(エラーになってしまう)
バックアップを元に新しいAPI Managementインスタンスを作成可能
Nextscape Inc. 212
REST APIを使うためにはAzrueADに
設定が必要。かなり面倒なのでお
勧めしない(PowerShellがいい)
Backup / Restore コマンド
Nextscape Inc. 213
PS C:¥> # バックアップ先のStorageのContextを取得する
PS C:¥> $storageContext = New-AzureStorageContext -StorageAccountName "ContosoStorage" -StorageAccountKey $storageKey
PS C:¥>
PS C:¥> # バックアップ実行
PS C:¥> Backup-AzureRmApiManagement `
>> -ResourceGroupName "ContosoGroup02" `
>> -Name "ContosoApi" `
>> -StorageContext $storageContext `
>> -TargetContainerName "ContosoBackups" `
>> -TargetBlobName "ContosoBackup.apimbackup"
PowerShell によるバックアップ(REST APIに比べて圧倒的に簡単!)
• バックアップしてみる
たった2つのコマンドだけ!
Backup / Restore コマンド
Nextscape Inc. 214
PS C:¥> # バックアップ先のStorageのContextを取得する
PS C:> $storageContext = New-AzureStorageContext -StorageAccountName "ContosoStorage" -StorageAccountKey $storageKey
PS C:¥>
PS C:¥> # 復元実行
PS C:> Restore-AzureRmApiManagement `
>> -ResourceGroupName "ContosoGroup" `
>> -Name "RestoredContosoApi" `
>> -StorageContext $storageContext `
>> -SourceContainerName "ContosoBackups" `
>> -SourceBlobName "ContosoBackup.apimbackup"
PowerShell による復元方法(こっちも2つのコマンドだけ。書き方ほぼ同じ)
• Restore してみる
• 復元先の API Managementインスタンスはあらかじめ作成しておくこと
• Backup時と同じインスタンスレベル(Dev, Basic, Std, Premium)にすること
• Restoreはめっちゃ時間かかる。15分~45分ぐらい
APIの設定に限定した Backup / Restore機能
ImportでAPI のコピーが可能(違うAPIMインスタンスへのImportもOK)
Azure Portal, REST API, Powershellコマンドのいずれかで実行可能
バックアップデータはファイルダウンロードしてローカルに格納
(Azure上に格納ではない)
Importかなり早い(数秒)
API の Export / Import
Nextscape Inc. 215
Nextscape Inc. 216
• Portalで API を Exportしてみる
API の Export / Import
Nextscape Inc. 217
• Export形式を選択する
API の Export / Import
Nextscape Inc. 218
• Open API 3.0形式を選んだ場合、こんな内容ファイルがダウンロードされる
API の Export / Import
{
"openapi": "3.0.1",
"info": {
"title": "Echo API",
"version": ""
},
"servers": [
{
“url”: "https:// .azure-api.net/echo"
}
],
"paths": {
"/resource": {
"get": {
"summary": "Retrieve resource",
"description": "A demonstration of a GET call on a sa
mple resource. It is handled by an "echo" backend which returns a r
esponse equal to the request (the supplied headers and body are being
returned as received).",
"operationId": "retrieve-resource",
"parameters": [
{
"name": "param1",
Nextscape Inc. 219
• Import でAPIをコピーしてみる
• titleをImport先の他のAPIと重複しないように修正する
• basePathは他のAPIと重複しても気にしないでいい(Import 時に反映されない)
API の Export / Import
{
"swagger": "2.0",
"info": {
"title": "Echo API2",
"version": "1.0"
},
"host": "nsuesaka2.azure-api.net",
"basePath": "/echo",
"schemes": [
"https"
],
…
「Echo API」→ 「Echo API2」
Nextscape Inc. 220
• Blank APIテンプレートで APIを新規に作成する
API の Export / Import
• Display Nameに適当な値を入れる。どうせImportすると上書
きされるので、なんでもOK
• API URL suffix とは前頁の basePathのこと。他APIと重複しない
値を設定する必要がある。(後から変更可能)
Nextscape Inc. 221
• 今作ったAPI の Importをクリックし、Import形式を選ぶ
API の Export / Import
Nextscape Inc. 222
• 「Select a file」でさっき修正したファイルを選ぶ
API の Export / Import
Nextscape Inc. 223
• Import して APIがコピーされた
API の Export / Import
Nextscape Inc. 224
• 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
API, Policy, 成果物、グループの設定情報がファイル形式(json)で
APIM内部の Git Repositoryに存在する
Git へ Pushすると、 APIM のRepositoryからAPIMへDeployするらしい
(WebAppsとそっくりな動作だ)
同じインスタンスに対するBackup/ Restoreのみ?
ユーザー、サブスクリプション、仮想ネットワークの接続設定はフ
jsonファイルに書き込まれていない(Restore されない)
Git の Repository を Clone する
Nextscape Inc. 225
Nextscape Inc. 226
• まず、Git へ APIM の情報を Commit する
Git の Repository を Clone する
Nextscape Inc. 227
• コミットされた
Git の Repository を Clone する
Nextscape Inc. 228
• Clone するためのアクセス資格情報を取得する
Git の Repository を Clone する
Nextscape Inc. 229
• Git Bash で Clone するとこんな感じ(普通の git cloneでしかない)
Git の Repository を Clone する
Nextscape Inc. 230
• Cloneした結果のWorking
Treeはこんな感じ
Git の Repository を Clone する
Nextscape Inc. 231
• ローカルの Clone から、API Managementへ反映
• ローカルから Push し、その後API Management へデプロイする
(Push だけじゃ反映されないので注意!)
Git の Repository を Clone する
Pushしてから
デプロイ
Nextscape Inc. 232
異なるAPI Management インスタンスへ Push&Deployできるのか実験
Git の Repository を Clone する
Loggerを全部削除すれば、できるのかも・・・。試していない
• remote 先を 異なる APIM にして git push --force で無理やりPush&Deploy
• Push 先の構成も git clone して、ローカルで置き換えてから Push&Deploy
次の2つを試し
たがNGだった

More Related Content

What's hot

Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Takeshi Fukuhara
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたHideaki Aoyagi
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景Tatsuo Kudo
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Amazon Web Services Japan
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識Minoru Naito
 
KeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてKeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてHiroyuki Wada
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所Toru Makabe
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 

What's hot (20)

Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
 
KeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてKeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについて
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 

Similar to Azure Api Management 俺的マニュアル 2020年3月版

AWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャAWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャ真吾 吉田
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト健一 辰濱
 
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話Shingo Kawahara
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationYuichiro Saito
 
Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Shinya Nakajima
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所真吾 吉田
 
AI-first Code Editor 「Cursor」の機能紹介
AI-first Code Editor 「Cursor」の機能紹介AI-first Code Editor 「Cursor」の機能紹介
AI-first Code Editor 「Cursor」の機能紹介ssuser39314d
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化Issei Hiraoka
 
Azure DevOps CICD Azure SQL / Data Factory
Azure DevOps CICD Azure SQL / Data FactoryAzure DevOps CICD Azure SQL / Data Factory
Azure DevOps CICD Azure SQL / Data FactoryRyoma Nagata
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから真吾 吉田
 
Azure DevOpsとセキュリティ
Azure DevOpsとセキュリティAzure DevOpsとセキュリティ
Azure DevOpsとセキュリティKazushi Kamegawa
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱Koichi ITO
 
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのかDeveloper's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのかTetsuo Ajima
 
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...Kazumi IWANAGA
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~Rakuten Group, Inc.
 
わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料Shinichiro Isago
 
わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料guest628c07
 
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DeNA
 
Swagger jjug ccc 2018 spring
Swagger jjug ccc 2018 springSwagger jjug ccc 2018 spring
Swagger jjug ccc 2018 springkounan13
 

Similar to Azure Api Management 俺的マニュアル 2020年3月版 (20)

AWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャAWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャ
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
 
Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
AI-first Code Editor 「Cursor」の機能紹介
AI-first Code Editor 「Cursor」の機能紹介AI-first Code Editor 「Cursor」の機能紹介
AI-first Code Editor 「Cursor」の機能紹介
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
 
Azure DevOps CICD Azure SQL / Data Factory
Azure DevOps CICD Azure SQL / Data FactoryAzure DevOps CICD Azure SQL / Data Factory
Azure DevOps CICD Azure SQL / Data Factory
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから
 
Azure DevOpsとセキュリティ
Azure DevOpsとセキュリティAzure DevOpsとセキュリティ
Azure DevOpsとセキュリティ
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのかDeveloper's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
 
20170705 apiをつくろう
20170705 apiをつくろう20170705 apiをつくろう
20170705 apiをつくろう
 
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
 
わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料
 
わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料わんくま東京勉強会#46 Azureセッション資料
わんくま東京勉強会#46 Azureセッション資料
 
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
 
Swagger jjug ccc 2018 spring
Swagger jjug ccc 2018 springSwagger jjug ccc 2018 spring
Swagger jjug ccc 2018 spring
 

More from 貴志 上坂

開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析貴志 上坂
 
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析貴志 上坂
 
第5回 cogbot勉強会!
第5回 cogbot勉強会!第5回 cogbot勉強会!
第5回 cogbot勉強会!貴志 上坂
 
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装貴志 上坂
 
NS study8 DDD Microservices Azuer Service Fabric
NS study8 DDD Microservices Azuer Service FabricNS study8 DDD Microservices Azuer Service Fabric
NS study8 DDD Microservices Azuer Service Fabric貴志 上坂
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~貴志 上坂
 
Ns study Azure IoTHub紹介
Ns study Azure IoTHub紹介Ns study Azure IoTHub紹介
Ns study Azure IoTHub紹介貴志 上坂
 
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-貴志 上坂
 
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~貴志 上坂
 
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計貴志 上坂
 
クラウドデザインパターンのススメ
クラウドデザインパターンのススメクラウドデザインパターンのススメ
クラウドデザインパターンのススメ貴志 上坂
 
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~貴志 上坂
 
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築貴志 上坂
 
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsiderMoq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider貴志 上坂
 

More from 貴志 上坂 (14)

開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
 
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
開発者のための機械学習入門:Azure Machine Learning Studioで構造化データから予測分析
 
第5回 cogbot勉強会!
第5回 cogbot勉強会!第5回 cogbot勉強会!
第5回 cogbot勉強会!
 
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装
2016-11-11 UMTP モデリングフォーラム2016 DDD実践のコツとazureによるモデル実装
 
NS study8 DDD Microservices Azuer Service Fabric
NS study8 DDD Microservices Azuer Service FabricNS study8 DDD Microservices Azuer Service Fabric
NS study8 DDD Microservices Azuer Service Fabric
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
 
Ns study Azure IoTHub紹介
Ns study Azure IoTHub紹介Ns study Azure IoTHub紹介
Ns study Azure IoTHub紹介
 
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-
アルゴリズムから学ぶAzure mlモジュールの使いこなし方 hd-insight編-
 
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~
Azure Machine Learningによるレコメンデーションの設計&実装を公開!~朝日カルチャーセンターの事例から~
 
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計
20150421 QCon Tokyo 2015 Azureが切り開く新時代のソフトウェア開発・設計
 
クラウドデザインパターンのススメ
クラウドデザインパターンのススメクラウドデザインパターンのススメ
クラウドデザインパターンのススメ
 
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
 
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
 
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsiderMoq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
 

Azure Api Management 俺的マニュアル 2020年3月版

Editor's Notes

  1. OAuth2.0の時、FacebookやAzureADは認可サーバーと呼ばれ、OpenIdConnectの場合はIDProviderと呼ばれる。 意味合い的には同じもの。
  2. カナリアリリースは、新バージョンと旧バージョンの二つの環境をLBなどで少しずつ重みを変えていく手法。 段階的ロールアウトは複数回の新バージョンデプロイがあるのでちょっと違う。似てるけど。
  3. Login-AzureRmAccount Select-AzureRmSubscription -Subscription Azure機能検証環境
  4. 予測最大スループット2 (ユニットごと)500 要求/秒1,000 要求/秒2,500 要求/秒4,000 要求/秒