ASM

デイジーチェーンとは複数の周辺機器を直列につないでいく配線方法のこと。複数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

Azure仮想マシンV1の一括起動・停止する方法についてのナレッジをここに整理しておく。基本的にはPowerShellやAzure CLIのVM起動・停止コマンドを並列で実行する方法でいけます。ただし同一クラウドサービス内に複数のVMがある場合は単純なコマンドの並列処理実行ではうまくいかない。その場合はAzureで用意されている複数ロールの一括起動・停止用REST APIを使いましょうというお話し。尚、ここでの一括処理はyoichikavm[001-100]の100VMを対象とする。

VM起動・停止コマンドの並列実行

yoichikavm[001-100]がそれぞれ別のクラウドサービスを持っている場合は、VM起動・停止コマンドを単純に並列実行するという手法で問題なく一括起動・停止ができる。例えばWindowsマシンの場合はPowershellの(Start|Stop)-AzureVMコマンドをStart-Jobを使用してバックグラウンドジョブとして実行させてやる、MacやLinuxであればvm (start|stop)コマンドをforkさせて複数故プロセスを走らせてやるなど。ここではStart-Jobでの並列実行例を紹介する。

複数VMの一括起動: parallel-start.ps1

foreach($node in $( Get-AzureVM | Where-Object{$_.Name -match "yoichikavm*"}) ) {
    Write-Host $node.Name
    Start-Job -ScriptBlock{
        param($node)
        Start-AzureVM -ServiceName $node.ServiceName -Name $node.Name
    } -Arg $node
}

複数VMの一括停止: parallel-stop.ps1

foreach($node in $( Get-AzureVM | Where-Object{$_.Name -match "yoichikavm*"}) ) {
    Write-Host $node.Name
    Start-Job -ScriptBlock{
        param($node)
        Stop-AzureVM -ServiceName $node.ServiceName -Name $node.Name -Force
    } -Arg $node
}

Start/Stop Roles APIの利用(同一クラウドサービス内に複数VMがある場合)

これは実際に私が躓いた際に@ksasakimsさんに教えてもらった方法。冒頭で簡単に説明したとおり同一クラウドサービス内に複数のVMがある場合は上記のような単純なコマンドの並列処理実行ではうまくいかない。この場合、Start RolesShutdown RolesのREST APIを使うことで同一クラウドサービス内の複数VMの同時起動。停止を実現することができる。
以下、APIについて簡単にご説明する。両APIともPOST先は下記同一のエントリーポイントとなっており、またBodyにそれぞれ下記のように起動VM,停止VMを記述する。

POST用エントリーポイント

https://management.core.windows.net/サブスクリプションID/services/hostedservices/クラウドサービス/deployments/デプロイ名/roles/Operations

BODY例: 一括起動 yoichikavm[001-100]

<StartRolesOperation xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <OperationType>StartRolesOperation</OperationType>
  <Roles>
    <Name>yoichikavm001</Name>
    <Name>yoichikavm002</Name>
    ... skip ...
    <Name>yoichikavm100</Name>
  </Roles>
</StartRolesOperation>

BODY例) 一括停止 yoichikavm[001-100]

<ShutdownRolesOperation xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <OperationType>ShutdownRolesOperation</OperationType>
  <Roles>
    <Name>yoichikavm001</Name>
    <Name>yoichikavm002</Name>
    ... skip ...
    <Name>yoichikavm100</Name>
  </Roles>
  <PostShutdownAction>StoppedDeallocated</PostShutdownAction>
</ShutdownRolesOperation>

そして、共通ヘッダとして下記の2つが必要になる。

Content-Type: application/xml
x-ms-version: 2015-04-01    << サービス管理バージョン、これは最新の2015-04-01でOK

認証については他のサービス管理APIと同様にAzure ADの使用もしくは証明書を利用した認証を行う必要がある。詳細についてはを「サービス管理要求の認証」参照いただければと思う。

LINKS