はじめに
平素より大変お世話になっております。
今回はApplication GatewayとAPI Managementの統合構成についてです。
API Managementは単体でもインターネットから接続させることが可能ですが、セキュリティ的に不安が残ります。
やはりセキュリティを考えたら、できる限りInternalな環境においておきたいものです。
API Managementは、DeveloperとPremiumのSKUの場合のみ、VNet内部に設置することができます。
Developerはテスト用なので、実用で用いることが可能なのはPremiumのみですね。
このとき、API Managementに対して外部から接続可能にするためには、Application Gatewayを利用する方法があります。
そのドキュメントがまぁまぁ複雑なので、今回ポータルベースでやってみることにしました。
構成
利用するリソース
今回の構成をするための最低限必要なリソースは以下の通り。
| リソース名 | SKU | 用途 | 
|---|---|---|
| Application Gateway | Standard v2 | V1でもV2でも可能。 | 
| API Management | developer | Internalに構築する前提。開発者ポータルにも接続する | 
| パブリックIP | Standard | Application GatewayとAPIManagement用の2つ | 
| VNet | - | applicationgteway用とAPIManagement用の2つ用意する。サブネットも作成 | 
| プライベートDNSゾーン | - | API Managementで利用するドメインの名前解決用 | 
ネットワーク構成
ネットワーク構成は以下の図の通り。
重要なのは、__Application GatewayのVNetとAPI ManagementのVNetに対して、プライベートDNSゾーンを関連付けすること__です。
これによって、API Management用カスタムドメインの名前解決ができるようになります。
|  | 
|---|
Applicationgatewayの構成
リスナーを3つ用意し、バックエンドも3つ用意します。
API Managementに付与したカスタムドメインをリスナーのホスト名として指定します。
|  | 
|---|
基本的にはAPI ManagementのカスタムドメインとApplicationGatewayのホスト名は一致させたほうがよいですが、API Gatewayのホスト名は一致させなくても大丈夫なようです。
構築
API Managementの作成
まずはAPI Managementを構築していきます。
|  | 
|---|
パラメータは適当に入れてます。
|  | 
|---|
ネットワークの構成で、「内部」を指定してVNet内に設置するように設定。
VNet名は「vnet-APIManagement」、サブネットは「API-Management」にしました。
あとは特に設定せず、「作成」を選択。
作成できたら、利用しているプライベートIPをメモしておきます。
|  | 
|---|
自己証明書作成
HTTPS通信を行うので、CAを立てて自己証明書を発行しておきます。
以下のPowerShellスクリプトを利用します。
$trustedRootCert = New-SelfSignedCertificate `
    -Type Custom `
    -CertStoreLocation  "Cert:\CurrentUser\My" `
    -KeySpec Signature `
    -Subject "CN=myCA" `
    -KeyExportPolicy Exportable `
    -HashAlgorithm sha256 `
    -KeyLength 4096 `
    -KeyUsageProperty Sign `
    -KeyUsage CertSign `
    -NotAfter (Get-Date).AddMonths(24)
 
$sslCert = New-SelfSignedCertificate `
    -Type Custom `
    -CertStoreLocation  "Cert:\CurrentUser\My" `
    -KeySpec Signature `
    -Subject "CN=*.app-apitest.net" `
    -DnsName "app-apitest.net","*.app-apitest.net" `
    -KeyExportPolicy Exportable `
    -HashAlgorithm sha256 `
    -KeyLength 2048 `
    -Signer $trustedRootCert
 
Export-Certificate  `
    -Type CERT `
    -Cert $trustedRootCert `
    -FilePath .\trustedroot.cer
 
$pfxPassword = ConvertTo-SecureString -String "SomePassword123" -AsPlainText -Force
Export-PfxCertificate `
    -ChainOption BuildChain `
    -Cert $sslCert `
    -FilePath .\app-apitest.pfx `
    -Password $pfxPassword
Applicationgatewayの作成
次にApplication Gatewayを作っていきましょう。
|  | 
|---|
適当に設定をします。なぜかデフォルトが「japan west」になっているので注意。
|  | 
|---|
フロントエンドにパブリックIPをつけます。
|  | 
|---|
バックエンドプールに「gateway.app-apitest.net」を設定します。
|  | 
|---|
同じように、「developer.app-apitest.net」、「management.app-apitest.net」も設定します。
|  | 
|---|
ルーティング規則としてリスナーを設定します。さきほど作成したpfxをアップロード。
今回はApplicationGatewayに3つのリスナーを作成するので、マルチサイトを選択します。
|  | 
|---|
バックエンド側のHTTP設定を作成します。
HTTPSを選択して、これもさきほど作成したcer証明書をアップロードします。
「新しいホスト名でオーバーライドする」で「はい」選択することを忘れずに。
カスタムプローブはのちに作成しますが、ここでは一旦「いいえ」にしておきます。
|  | 
|---|
バックエンドターゲットとHTTP設定を紐づけする設定をして、追加します。
AzureポータルからApplication Gatewayの作成をする都合上、developerやmanegement用の設定は今作成できないので、このまま作成を選択。
(同じ証明書の登録が新規作成のときはできないため。)
これで作成完了です。
プライベートDNSゾーンの作成
では次にプライベートDNSゾーンを作ります。
ドメインは、適当に「app-apitest.net」を利用します。
|  | 
|---|
プライベートDNSゾーンが作成できたら、それぞれのレコードを作っていきます。
紐づけるIPは、API Management のプライベートIPアドレスです。
| カスタムドメイン名 | 紐づけるIP | 用途 | 
|---|---|---|
| gateway.app-apitest.net | 10.0.0.5 | API gateway用 | 
| developer.app-apitest.net | 10.0.0.5 | 開発者ポータル用 | 
| management.app-apitest.net | 10.0.0.5 | 開発者ポータル管理用 | 
|  | 
|---|
同じように3つ作成します。
|  | 
|---|
API Management、Application GatewayのVNetに対して「仮想ネットワークリンク」を追加します。
|  | 
|---|
これで2つのVNetからプライベートDNSを参照できるようになります。
忘れないように、ここで2つのVNetのピアリングもやっときます。
|  | 
|---|
API Manegementのカスタムドメイン設定
出来上がったAPI Management に対して、カスタムドメインを設定します。
API Managementのメニューから、カスタムドメインを選択。
|  | 
|---|
gatewayの場合、既定のSSLバインディングを指定を忘れずに。
これまた同じように、develop,managementも設定します。
|  | 
|---|
|  | 
|---|
|  | 
|---|
これで保存します。
Application Gatewayのリスナー追加設定
作成時に作れなかったdeveloper、management用のリスナーを作成します。
|  | 
|---|
同じようにmanagement用のリスナーも作成します。
|  | 
|---|
さらに同様に、作れなかったリスナーも作ります。
|  | 
|---|
同様にmanagement用も作成し、全部でリスナーが3つになります。
|  | 
|---|
そしてルールを作成し、バックエンドターゲットとリスナーを紐づけします。
|  | 
|---|
正常性プローブ設定
ここまで来たらもう一息!
正常性プローブを設定します。デフォルトのプローブ設定では、正常性確認に失敗してしまいます。
設定するパスは次の通り。
| バックエンド | 設定するパス | 
|---|---|
| gateway | /status-0123456789abcdef | 
| developer | /signin | 
| management | /ServiceStatus | 
|  | 
|---|
|  | 
|---|
全部設定するとこのようになります。
|  | 
|---|
バックエンド正常性ですべて健全になっていればOK。どこかエラーが発生しているのであれば、どこかの設定が間違っています。
動作確認
ではローカル端末のHostsを設定して、動作確認をしましょう。
Hostsファイルの場所は以下です。
C:\Windows\System32\drivers\etc
Application GatewayのパブリックIPと、設定したドメインを紐づけます。
20.89.146.95 gateway.app-apitest.net
20.89.146.95 developer.app-apitest.net
20.89.146.95 management.app-apitest.net
ここまでできたら、APIManagementの上部メニューから、開発者ポータルにアクセスします。
|  | 
|---|
|  | 
|---|
このように開発者ポータルの管理画面が表示されれば正常です。お疲れ様でした!
終わりに
一点注意事項があります。
Application GatewayでWAFを利用する場合は、WAFの穴あけ作業が必要です。
開発者ポータルで行う OpenAPI 仕様のダウンロードが Application Gateway WAF によって中断されないようにするには、ファイアウォール規則 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination" を無効にします。
以下の Application Gateway WAF ルールによって、ポータルの機能が中断されることがあります。
管理モード用: 920300、920330、931130、942100、942110、942180、942200、942260、942340、および 942370
発行されたポータル用: 942200、942260、942370、942430、および 942440
ご注意くださいませ。
参考

