AppServices

デイジーチェーンとは複数の周辺機器を直列につないでいく配線方法のこと。複数VNETをデイジーチェーン接続した構成で、真ん中のVNETを中継してマルチホップアクセスするための設定方法について色々と手こずったのでここに備忘録として残しておく。また似たようなシナリオ(*注)にApp Servicesと複数VNETのデイジーチェーン接続構成でのマルチホップアクセスがあると思うがこちらの設定についても残しておく。同様の設定で困っている人にとって少しでも参考になれば幸いである。

*注 – マルチホップアクセスが必要なシナリオ例
2015年12月時点でVNet の共存する ExpressRoute 接続とサイト間 VPN 接続の構成における制限としてポイント対サイトVPNとExpressRouteを同じVNETに共存できない仕様となっている。よって、ポイント対サイトVPN接続クライアントからExpressRoute接続したVNETにアクセスしたい場合は、ExpressRoute に接続されているのと同じVNETへのシングルホップアクセスはできないので、間にトランジット用の中間VNETを挟んだいわゆるデイジーチェーン接続構成にしてマルチホップなアクセスにしてやれば実現可能である。

1. 複数VNET間のデイジーチェーン接続

サンプルとして下図のように3つのVNETを用意してデイジーチェーン接続設定を行う。ここでは分かりやすく1-1と1-2でそれぞれシングルホップアクセスしかできない例とマルチホップアクセスできる設定例を紹介する。


VPN-Daisy-Chain-Site2Site

VNET Name
Address Space
VPN gateway
vnet1172.17.0.0/1640.74.135.162
vnet2172.18.0.0/16
40.74.143.191
vnet3172.19.0.0/16
40.74.136.22

用意するローカルネットワークは次の5つ。local-vnet1~local-vnet3はそれぞれ、vnet1~vnet3のVPN Gateway経由でそれぞれvnet1~vnet3のアドレス空間にアクセスするためのローカルネットワーク設定。またlocal-vnet2-1はvnet2のVPN Gatewayを経由してvnet2とvnet1のアドレス空間にアクセスするためのローカルネットワーク設定で、local-vnet2-3はvnet2のVPN Gatewayを経由してvnet2とvnet3のアドレス空間にアクセスするためのローカルネットワーク設定である。

ローカルネットワーク一覧

Local VNET Name
Address Space
VPN gateway
local-vnet1172.17.0.0/16
40.74.135.162
local-vnet2172.18.0.0/16
40.74.143.191
local-vnet3172.19.0.0/16
40.74.136.22
lcoal-vnet2-1
172.18.0.0/16, 172.17.0.0/1640.74.143.191
lcoal-vnet2-3172.18.0.0/16, 172.19.0.0/1640.74.143.191

ネットワーク設定用XMLのLocalNetworkSites設定内容

<LocalNetworkSites>
  <LocalNetworkSite name="local-vnet1">
    <AddressSpace>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <VPNGatewayAddress>40.74.135.162</VPNGatewayAddress>
  </LocalNetworkSite>
  <LocalNetworkSite name="local-vnet2">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
    </AddressSpace>
    <VPNGatewayAddress>40.74.143.191</VPNGatewayAddress>
  </LocalNetworkSite>
  <LocalNetworkSite name="local-vnet3">
    <AddressSpace>
      <AddressPrefix>172.19.0.0/16</AddressPrefix>
    </AddressSpace>
    <VPNGatewayAddress>40.74.136.22</VPNGatewayAddress>
  </LocalNetworkSite>
  <LocalNetworkSite name="local-vnet2-1">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <VPNGatewayAddress>40.74.143.191</VPNGatewayAddress>
  </LocalNetworkSite>
  <LocalNetworkSite name="local-vnet2-3">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
      <AddressPrefix>172.19.0.0/16</AddressPrefix>
    </AddressSpace>
    <VPNGatewayAddress>40.74.143.191</VPNGatewayAddress>
  </LocalNetworkSite>
</LocalNetworkSites>


1-1. 隣同士のVNETへのシングルホップアクセスのための設定例

3つのVNETをvnet1とvnet2、vnet2とvnet3をサイト対サイトVPN接続してデイジーチェーン接続構成にする。2つのサイト対サイトVPN接続設定では共に隣のVNETに接続できるように設定を行う。この場合、当然ながら隣のVNETには接続できるようになるが、VNET1 → VNET3やVNET3 → VNET1のように中間VNETを跨いでマルチホップなアクセスはできない。以下その設定イメージ図とネットワーク設定XMLファイルのVirtualNetworkSitesの内容になる。


VPN-Daisy-Chain-Site2Site-Config-SingleHopAccess

下記VirtualNetworkSitesでは、vnet1からはvnet2のアドレス空間にアクセスできるようにlocal-vnet2を接続先ローカルネットワークとして設定しており、vnet2からはvnet1とvnet3のアドレス空間にアクセスできるようにlocal-vent1とlocal-vnet3を接続先ローカルネットワークとして設定、そしてvnet3からはvnet2のアドレス空間にアクセスできるようにlocal-vnet2を接続先ローカルネットワークとして設定している。

ネットワーク設定用XMLのVirtualNetworkSites設定内容

<VirtualNetworkSites>
  <VirtualNetworkSite name="vnet1" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.17.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.17.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet2" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.18.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.18.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet1">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
        <LocalNetworkSiteRef name="local-vnet3">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet3" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.19.0.0/19</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.19.0.0/22</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.19.4.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
</VirtualNetworkSites>
</VirtualNetworkConfiguration>


1-2. VNET1-VNET3間マルチホップアクセスのための設定

1-1と同様に3つのVNETをvnet1とvnet2、vnet2とvnet3をサイト対サイトVPN接続してデイジーチェーン接続構成にする。ただしここでは2つのサイト対サイトVPN接続設定で隣のVNET以外にvnet1 → vnet3やvnet3 → vnet1のようにvnet2をトランジット用中間VNETとしてマルチホップにアクセスできるよう設定する。以下その設定イメージ図とネットワーク設定XMLファイルのVirtualNetworkSitesの内容になる。


VPN-Daisy-Chain-Site2Site-Config-MultipleHopAccess

下記VirtualNetworkSitesでは、vnet1からはvnet2のVPN Gatewayを経由してvnet2とvnet3のアドレス空間にアクセスできるようにlocal-vnet2-3を接続先ローカルネットワークとして設定しており、vnet2からはvnet1とvnet3のアドレス空間にアクセスできるようにローカルネットワークlocal-vent1とlocal-vnet3を接続先ローカルネットワークとして設定、そしてvnet3からはvnet2のVPN Gatewayを経由してvnet2とvnet1のアドレス空間にアクセスできるようにlocal-vnet2-1を接続先ローカルネットワークとして設定している。

ネットワーク設定用XMLのVirtualNetworkSites設定内容

<VirtualNetworkSites>
  <VirtualNetworkSite name="vnet1" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.17.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.17.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2-3">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet2" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.18.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.18.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet1">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
        <LocalNetworkSiteRef name="local-vnet3">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet3" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.19.0.0/19</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.19.0.0/22</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.19.4.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2-1">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
</VirtualNetworkConfiguration>


2. App Servicesと複数VNET間のデイジーチェーン接続

サンプルとして下図のように1つのWeb Appと2つのVNETを用意してAppとvnet1はポイント対サイトVPNで、vnet1とvnet2はサイト対サイトVPN接続でデイジーチェーン接続設定を行う。1と同様に2-1と2-2でそれぞれマルチホップできない例とできる設定例を紹介する。


VPN-Daisy-Chain-Apps2Site2Site

VNET基本情報

VNET NameAddress SpaceVPN Client Address PoolVPN gateway
vnet1172.17.0.0/16
192.168.1.0/28
40.74.135.162
vnet2172.18.0.0/16
40.74.143.191

用意するローカルネットワークは次の3つ。local-vnet1、local-vnet2はそれぞれvnet1、vnet2のVPN Gateway経由でそれぞれvnet1、vnet2のアドレス空間にアクセスするためのローカルネットワーク設定。またlocal-vnet1-pはvnet1のVPN Gatewayを経由してvnet1のアドレス空間とポイント対サイト用VPNクライアント用アドレス空間にアクセスするためのローカルネットワーク設定となっている。

ネットワーク設定用XMLのLocalNetworkSites設定内容

Local VNET name
Address Space
VPN gateway
local-vnet1
172.17.0.0/16
40.74.135.162
local-vnet2172.18.0.0/16
40.74.143.191
local-vnet1-p172.17.0.0/16, 192.168.1.0/28
40.74.135.162


2-1. App Services-VNET2間でマルチホップアクセスできない設定例

Web Appとvnet1はポイント対サイトVPN接続設定を行う。一方vnet1とvnet2間のサイト対サイトVPN接続設定では互いのVNETに接続できるように設定を行う。この場合、当然ながらApp → vnet1、vnet1 → vnet2へのシングルホップのアクセスはできるがApp → vnet2のマルチホップアクセスはできない。


VPN-Daisy-Chain-P2S-S2S-Config-SingleHopAccess

ネットワーク設定用XMLのVirtualNetworkSites設定内容

<VirtualNetworkSites>
  <VirtualNetworkSite name="vnet1" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.17.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.17.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <VPNClientAddressPool>
        <AddressPrefix>192.168.1.0/28</AddressPrefix>
      </VPNClientAddressPool>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet2" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.18.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.18.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet1">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
</VirtualNetworkSites>
</VirtualNetworkConfiguration>


2-2. App Services-VNET2間マルチホップアクセスのための設定

2-1と同様にWeb Appとvnet1はポイント対サイトVPN接続設定、vnet1とvnet2間はサイト対サイトVPN接続設定を行いデイジーチェーン接続構成にする。ただしここではvnet2 → vnet1のサイト対サイトVPN接続設定においてvnet1のVPN Gatewayを経由してvnet1のアドレス空間とVPNクライアント用アドレス空間にアクセスできるようにlocal-vnet1-pを接続先ローカルネットワークとして設定している。これでApp → vnet2のマルチホップアクセスが可能となる。


VPN-Daisy-Chain-P2S-S2S-Config-MultipleHopAccess

ネットワーク設定用XMLのVirtualNetworkSites設定内容

<VirtualNetworkSites>
  <VirtualNetworkSite name="vnet1" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.17.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.17.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.17.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <VPNClientAddressPool>
        <AddressPrefix>192.168.1.0/28</AddressPrefix>
      </VPNClientAddressPool>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet2">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
  <VirtualNetworkSite name="vnet2" Location="Japan West">
    <AddressSpace>
      <AddressPrefix>172.18.0.0/16</AddressPrefix>
    </AddressSpace>
    <Subnets>
      <Subnet name="Subnet-1">
        <AddressPrefix>172.18.0.0/19</AddressPrefix>
      </Subnet>
      <Subnet name="GatewaySubnet">
        <AddressPrefix>172.18.32.0/29</AddressPrefix>
      </Subnet>
    </Subnets>
    <Gateway>
      <ConnectionsToLocalNetwork>
        <LocalNetworkSiteRef name="local-vnet1-p">
          <Connection type="IPsec" />
        </LocalNetworkSiteRef>
      </ConnectionsToLocalNetwork>
    </Gateway>
  </VirtualNetworkSite>
</VirtualNetworkSites>
</VirtualNetworkConfiguration>

おわり

LINKS

複数のオンプレミスのサイトを仮想ネットワークに接続
PowerShell を使用してサイト間 VPN 接続で仮想ネットワークを作成する
Using VNET integration and Hybrid connections with Azure Websites

ARMとAzure Insights API

Azure上のさまざまなサービスのメトリック情報をAPI経由で取得したい。そういうことであればAzure Service Management APIを使えばいいじゃないかという声が聞こえてきそうなところだが実は既にこのやり方は時代遅れとなっていることをご存じだろうか?
2014年5月ごろ?に登場したAzureの新しい考え方にResource、ResourceGroup、Azure Resource Managerというものがある。簡単な説明すると、Azure上のPaaSインスタンス、仮想マシンなどすべての管理可能な資源をリソース(Resource)とよばれる単位に細分化し、それらをグループ化したものがResourceGroup、そして全てのリソースはAzure Resource Manager(以下ARM)というもので管理可能になっている。そしてこのARMで管理可能な世界のリソース群に紐づくメトリックデータはAzure Insights APIで取得可能となっている。本記事ではさまざまなリソースの中でもWeb Appsに絞って、Azure Insights REST API (Metric)を使ってそのメトリックを取得する方法について紹介する。

ARM Explorerでどのメトリックが取得可能なのか確認する

ARM Explorer (https://resources.azure.com/) をご存じだろうか? これはその名の通りAzure上の全てのリソース(ご利用のサブスクリプションに紐づく全てのリソース)のエクスプローラーであり、これを使うことでこのARM管理下の世界のすべてのリソースをエクスプローラービューで閲覧することができる。このARM Explorerで閲覧可能な各リソースの情報の中にmetricdefinitionsというものがあって、これにはそのリソースに対して指定可能なメトリックの種類やその定義情報などが格納されている。リソースのメトリック取得をする際は、まずはARM Explorerで目的のリソースのmetricdefinitionsから指定可能なメトリックの種類を把握してからAPIリクエストを組み立てていただければと思う。ARM Explorerを使って本記事で取得対象としているWeb Apps(ここではサイト名yoichikademoを対象)のmetricdefinitionsを閲覧しているのが以下のスクリーンショットになる。


ARMExplorer

Azure Insights REST APIメトリック取得インターフェース

Azure Insights APIには次のような(1)メトリック定義一覧の取得と(2)対象リソースのメトリック情報取得の2つのインターフェースがある。当然ながらメトリックの取得には(2)のインターフェースを使用する。

APIの共通部分は下記の通り。Azure Insights APIへの全ての要求はAzure Active Directoryを使用して認証する必要があり、この認証により得られたトークンを各APIリクエストのAuthorizationヘッダに指定する必要がある。トークン取得の方法にはPowerShellを使用した方法とAzure管理ポータルを使用して認証する2つの方法がある。詳しくは「Azure インサイト要求を認証する」を参照ください。

実際のメトリクス取得APIでは$filterパラメータの付与が必要となる。$filterには主にメトリックの種類(name.value)、時間レンジ(startTime – endTime)、インターバール(timeGrain)の3種類の条件を指定する。

CpuTimeとMemoryWorkingSetメトリック指定例 (実際は1行にまとめる)

$filter=
  (name.value eq ‘CpuTime’ or name.value eq ‘MemoryWorkingSet’)
  and startTime eq ‘2015-08-01T15:00:00Z’ and endTime eq ‘2015-08-02T15:00:00Z’
  and timeGrain eq duration’PT1M’

$filterパラメータには実際はURL Encodeかけた文字列を渡す。メトリックのインターバル(timeGrain)は1分単位なら”PT1M”、5分単位なら”PT5M”、1時間単位ならば”PT1H”、1日単位ならば”PT1D”などを指定する。

サンプルコード

Azure Insightsのメトリック取得APIを使ってWeb Appのメトリックを取得するサンプルコードをGithubにアップした。同様のことを考えている人にとって少しでも参考になれば幸いである。

https://github.com/yokawasa/azure-samples/tree/master/GetAppServiceMetrics

このサンプルではCpuTime、MemoryWorkingSet、AverageResponseTimeの3つのメトリック情報を1時間ごとのインターバルで2015-08-01~2015-08-30の期間分取得するようになっている。この部分はハードコーディングしているので必要に応じてソースコード(Program.cs)を適宜変更いただければと思う。また利用者ごとの情報は設定ファイルApp.configで指定する。以下簡単にApp.configの設定内容を解説する。

App.config

<appSettings>
    <add key="subscriptionId" value="[your subscription Id]" />
    <add key="resourceGroup" value="[your resource group name]" />
    <add key="siteName" value="[site Name]" />
    <add key="tenantId" value="[you tenant ID]" />
    <add key="applicationId" value="[your application id]" />
    <add key="redirectUri" value='[redirect url]' />    
</appSettings>

LINKS