はじめに
平素より大変お世話になっております。
今回は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
ご注意くださいませ。
参考