カテゴリー別アーカイブ: Azure

Azure Storage 複数コンテナをコピー

日本DC引っ越しにあたって、複数のコンテナに対して AzCopy いっぱい並べなくても済むようにPowerShell スクリプトを作って転送しています。コンテナのアクセス権も保持。

# ================================================================
# 設定
# ================================================================
# 転送元
$srcacct="転送元ストレージアカウント名"
$srckey="転送元キー"

# 転送先
$destacct="転送先ストレージアカウント名"
$destkey="転送先キー"

# 転送したくないコンテナ名
$nontransfercontainers = "automated-sql-export", "backups", "mydeployments", "vsdeploy", "wad-control-container", "wad-iis-logfiles"

# コマンドラインへのパス
$azure="C:\Program Files (x86)\Microsoft SDKs\Windows Azure\CLI\wbin\azure.cmd"
$azcopy="C:\Program Files (x86)\Microsoft SDKs\Windows Azure\AzCopy\AzCopy.exe"

# ================================================================
# 実行
# ================================================================
$srccontainersjsonstr = & $azure storage container list --json -a $srcacct -k $srckey
$srccontainers = "{ root: " + $srccontainersjsonstr + " }" | ConvertFrom-Json |  Select-Object -ExpandProperty root

$srccontainersjsonstr

$destcontainersjsonstr = & $azure storage container list --json -a $destacct -k $destkey
$destcontainerslist = "{ root: " + $destcontainersjsonstr + " }" | ConvertFrom-Json | Select-Object -ExpandProperty root | Select-Object -ExpandProperty name

foreach ($item in $srccontainers) {
  $targetcontainer = $item.name

  if ($nontransfercontainers.Contains($targetcontainer)) { continue }

  if ($null -ne $destcontainerslist -and $destcontainerslist.Contains($targetcontainer)) {
    # $targetcontainer + " --permission " + $item.publicAccessLevel
    # & $azure storage container set $targetcontainer -a $destacct -k $destkey -p $item.publicAccessLevel
  } else {
    & $azure storage container create $targetcontainer -a $destacct -k $destkey -p $item.publicAccessLevel
    # "CONTAINER is created : " + $targetcontainer
  }

  $srcurl  = "https://" + $srcacct + ".blob.core.windows.net/" + $targetcontainer
  $desturl = "https://" + $destacct + ".blob.core.windows.net/" + $targetcontainer
  # /S : 再帰的
  # /XO : 古いファイルは更新しない
  # /L : 実行しないでリストだけ
  "COPY " + $srcurl + " to " + $desturl
  & $azcopy $srcurl $desturl /Y /S /XO /SourceKey:$srcKey /DestKey:$destkey
}

コンテナ作成のあたりは PowerShell だけで出来る方がスマートなんだろうけど、調べた当初はストレージのキーだけで作る方法が分からなかった。サブスクリプションをまたぐような状況ではストレージアカウントだけで済む方が便利。

Azure SDK for PHP を FreeBSD で使う

Linux/BSD 界隈では LL が共通環境になってくれて非常にうれしいですね。せっかくなので、FreeBSD dumpでとったバックアップファイルを Azure BLOB 上に置こうかと Azure SDK for PHP を使ってみました。

http://www.windowsazure.com/en-us/develop/php/common-tasks/download-php-sdk/
http://www.windowsazure.com/en-us/develop/php/how-to-guides/blob-service/

だいたいそのまま動くのですがいくつか注意点

  • PEAR 経由でインストールする。(Composer 経由でのインストールには失敗 UTF-32LE がなんとかいうエラー。)
  • require_once ‘WindowsAzure/WindowsAzure.php’ を先頭に記述する。(これは PEAR 経由インストールであり Composer を利用しなかったことによる影響。サンプルコードの vendor/autoload.php は Composer 用の記述方法)
  • PHP拡張のうち ctype, openssl をインストールする。

というわけで、コンテナ作成のサンプルコードは以下のよう修正することで使うことができた。

#!/usr/local/bin/php
<?php
// require_once ‘vendor/autoload.php’;
require_once ‘WindowsAzure/WindowsAzure.php’;
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Blob\Models\CreateContainerOptions;
use WindowsAzure\Blob\Models\PublicAccessType;
use WindowsAzure\Common\ServiceException;

$connectionString = "DefaultEndpointsProtocol=https;AccountName=[アカウント名];AccountKey=[アカウントキー]";
// Create blob REST proxy.
$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);

(中略)

?>

フレッツ網向け Azure Virtual Network 設定の調整

今までAzureから提供された設定のまま運用していたのを、FletsにあわせてMTUを調整してみた。(前回の記事: https://kamiyn.wordpress.com/2012/10/10/windows-azure-virtual-network-%E3%82%92-cisco-asa-5505-%E3%81%A7%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B/)

http://www.cisco.com/cisco/web/support/JP/102/1020/1020854_fragmentation-j.html#Issues

フレッツ網のMTUは1454であるので、こんな感じで設定を投入

asa5505# config t
asa5005(config)# mtu outside 1454
asa5005(config)# sysopt connection tcpmss 1300

少なくとも2ヶ月前に計測した時の10倍、30Mbps程度のスループットが出てる! (これだけが原因かどうかまでは特定していませんが)

AzureVPN_フレッツ網スループット

ASA 5505 1public IP で複数の Azure Virtual Network が構成できない

“crypto isakmp policy 10” の10のところの番号を変えれば出来るのかと思ったが、2つ目の設定を入れられない。“crypto isakmp policy 12”を追加しようとしても反映せず、“crypto isakmp policy 9” を追加すると、元の10番が消えてしまう。

http://www.cisco.com/web/JP/product/hs/security/asa/prod_models_comparison.html

製品仕様だとサイト間VPNは10セッションまでいけるはずなのだが…購入した製品のライセンス上の問題なのだろうか。

Azure Virtual Network の Local Network アドレスは認証情報の一部、 ASA 5505 でそれを突き止めるまで

VirtualNetworkOnpremise

ここのアドレスを正確にダウンロードした VpnDeviceScript.cfg の “SP_OnPremiseNetworkIpRange” に転記する。

   1:  object-group network <RP_OnPremiseNework>
   2:   network-object <SP_OnPremiseNetworkIpRange> <SP_OnPremiseNetworkSubnetMask>
   3:   exit

前回の接続成功の時はサブネットなし、単純に /24 ネットワーク同士を接続しただけだったが、実際に運用に向けてサブネットありの構成にしようとした。この時「Local Network アドレスが一致していなければならない」(= サブネットであるゲートウェイアドレスではない) というところで躓いたのが今回の話。

Azureのドキュメントでは状況確認に “show crypto isakmp sa”を使え、というようなことが書いてあるのだが、接続できなかった場合の原因はこれでは全く分からない。

結局 Cisco ASA 5505 にて以下の作業を実施した。

  • ssh でログインできるようにする
  • 時刻合わせをし、ログ出力に時刻を出力させる
  • debug 出力を眺めて原因究明する

sshでログインできるようにする、時刻合わせとログ出力に時刻を出力するまでの設定

(「Cisco ASA 5500 シリーズ コンフィギュレーション

ガイド(CLI を使用) Cisco ASA 5500 Series Configuration Guide using the CLI

ソフトウェア バージョン 8.3」 を参照しました)

   1:  !
   2:  ! ssh でログインできるようになるまで
   3:  !
   4:  ! パスワードの設定。sshログインする際のユーザー名は asa になる
   5:  passwd ほげほげ
   6:  ! enable パスワード
   7:  enable password ほげほげ
   8:   
   9:  ! ホストキーを生成
  10:  crypto key generate rsa modulus 1024
  11:   
  12:  ! 内側アドレスからのみ接続を許可
  13:  ssh 192.168.0.0 255.255.0.0 inside
  14:  ! 接続タイムアウトを30分に延長 (既定では5分)
  15:  ssh timeout 30
  16:  ! ssh2 のみを受け付け
  17:  ssh version 2
  18:   
  19:  ! 時刻合わせ
  20:  ! NTP server は ntp.jst.mfeed.ad.jp のIPアドレスを指定している
  21:  clock timezone JST 9
  22:  ntp server 210.173.160.87 source outside
  23:  ntp server 210.173.160.57 source outside
  24:  ntp server 210.173.160.27 source outside
  25:   
  26:  !
  27:  ! ロギング
  28:  !
  29:   
  30:  logging enable
  31:  logging buffered critical
  32:  logging buffer-size 16384
  33:  logging timestamp

この後 “debug crypto isakmp 128” を非config レベルで入力してデバッグログを確認。出力終了は “no debug crypto isakmp”

デバッグログの一部は以下のような感じ。 PHASE 1 COMPLETED と出ているので 問題は PHASE 2 と特定、その後 “ID_IPV4_ADDR_SUBNET” とネットワークアドレスをIDとして出力しており、この部分が自分の投入した config と異なるな、ということで気付くことができました。

■ %ASA-5-713119: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, PHASE 1 COMPLETED
%ASA-7-714011: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, ID_IPV4_ADDR_SUBNET ID received--172.16.16.0--255.255.252.0
%ASA-7-713035: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, Received remote IP Proxy Subnet data in ID Payload:   Address 172.16.16.0, Mask 255.255.252.0, Protocol 0, Port 0
%ASA-7-714011: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, ID_IPV4_ADDR_SUBNET ID received--192.168.0.0--255.255.0.0
%ASA-7-713034: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, Received local IP Proxy Subnet data in ID Payload:   Address 192.168.0.0, Mask 255.255.0.0, Protocol 0, Port 0
■ %ASA-5-713259: Group = 168.63.xxx.xxx, IP = 168.63.xxx.xxx, Session is being torn down. Reason: crypto map policy not found
# ということは Yamaha RTX でも ipsec ike local id 1 192.168.0.0/16, ipsec ike remote id 1 172.16.16.0/22 とかやればもしかして通るのかしら。もしかするとここらの仕様が以前確認した時と変更になっている可能性も否めない。# しかし アメリカ amazon.com 経由の ASA5505 新品が3万円しないのでYamahaでなくてもいいか、という気分になってきたこの頃

Azure Virtual Network を ASA 5505 の GUI 画面と対応させてみる

http://msdn.microsoft.com/en-us/library/windowsazure/jj156089.aspx 設定ファイルの文字列を見るだけだと何なのか理解しにくいところがあったので、GUI画面 (Cisco ASDM) のどこに対応しているのか確認してみた。
 
   1:  ! Microsoft Corporation
   2:  ! Windows Azure Virtual Network
   3:   
   4:  ! This configuration template applies to Cisco ASA 5500 Series Adaptive Security Appliances running ASA Software 8.3.
   5:  ! It configures an IPSec VPN tunnel connecting your on-premise VPN device with the Azure gateway.
   6:   
   7:  ! ---------------------------------------------------------------------------------------------------------------------
   8:  ! ACL and NAT rules
   9:  ! 
  10:  ! Proper ACL and NAT rules are needed for permitting cross-premise network traffic.
  11:  object-group network <RP_AzureNetwork>
  12:   network-object <SP_AzureNetworkIpRange> <SP_AzureNetworkSubnetMask>
  13:   exit
  14:  object-group network <RP_OnPremiseNework>
  15:   network-object <SP_OnPremiseNetworkIpRange> <SP_OnPremiseNetworkSubnetMask>
  16:   exit
  17:  access-list <RP_AccessList> extended permit ip object-group <RP_OnPremiseNework> object-group <RP_AzureNetwork>
  18:  nat (inside,outside) source static <RP_OnPremiseNework> <RP_OnPremiseNework> destination static <RP_AzureNetwork> <RP_AzureNetwork>
  19:   
  20:  ! ---------------------------------------------------------------------------------------------------------------------
  21:  ! Internet Key Exchange (IKE) configuration
  22:  ! 
  23:  ! This section specifies the authentication, encryption, hashing, Diffie-Hellman, and lifetime parameters for the Phase
  24:  ! 1 negotiation and the main mode security association. We have picked an arbitrary policy # "10" as an example. If
  25:  ! that happens to conflict with an existing policy, you may choose to use a different policy #.
  26:  crypto isakmp enable outside
  27:  crypto isakmp policy 10
  28:   authentication pre-share
  29:   encryption aes
  30:   hash sha
  31:   group 2
  32:   lifetime 28800
  33:   exit
  34:   
  35:  ! ---------------------------------------------------------------------------------------------------------------------
  36:  ! IPSec configuration
  37:  ! 
  38:  ! This section specifies encryption, authentication, and lifetime properties for the Phase 2 negotiation and the quick
  39:  ! mode security association. 
  40:  crypto ipsec transform-set <RP_IPSecTransformSet> esp-aes esp-sha-hmac
  41:  crypto ipsec security-association lifetime seconds 3600
  42:  crypto ipsec security-association lifetime kilobytes 102400000
  43:   
  44:  ! ---------------------------------------------------------------------------------------------------------------------
  45:  ! Crypto map configuration
  46:  !
  47:  ! This section defines a crypto map that binds the cross-premise network traffic to the
  48:  ! IPSec transform set and remote peer. We have picked an arbitrary ID # "10" as an example. If
  49:  ! that happens to conflict with an existing crypto map, you may choose to use a different ID #.
  50:  crypto map <RP_IPSecCryptoMap> 10 match address <RP_AccessList>
  51:  crypto map <RP_IPSecCryptoMap> 10 set peer <SP_AzureGatewayIpAddress>
  52:  crypto map <RP_IPSecCryptoMap> 10 set transform-set <RP_IPSecTransformSet>
  53:  crypto map <RP_IPSecCryptoMap> interface outside
  54:   
  55:  ! ---------------------------------------------------------------------------------------------------------------------
  56:  ! Tunnel configuration
  57:  !
  58:  ! This section defines an IPSec site-to-site tunnel connecting to the Azure gateway and specifies the pre-shared key
  59:  ! value used for Phase 1 authentication.  
  60:  tunnel-group <SP_AzureGatewayIpAddress> type ipsec-l2l
  61:  tunnel-group <SP_AzureGatewayIpAddress> ipsec-attributes
  62:   pre-shared-key <SP_PresharedKey>
  63:   exit
  64:   
  65:  ! ---------------------------------------------------------------------------------------------------------------------
  66:  ! TCPMSS clamping
  67:  !
  68:  ! Adjust the TCPMSS value properly to avoid fragmentation
  69:  sysopt connection tcpmss 1350

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

基本的に上から順番に探しています。
Object Group の設定は複数個所で可能

ASA5505_01_ObjectGroupASA5505_02_ObjectGroupASA5505_03_ACL
ASA5505_04_NAT
ASA5505_05_crypto_isakmp_enable_outside

Connection Profile の部分は crypto map と tunnel-group の両方に対応していた。

ASA5505_06_ConnectionProfileASA5505_07_ConnectionProfileASA5505_08_ConnectionProfileASA5505_09_ConnectionProfile

その他

ASA5505_10_crypto_isakmp_policy
ipsec transform-set は自分で設定しなくても、GUIの場合 ESP-AES-128-SHA が自動的に定義される。
ASA5505_11_crypto_ipsec_transformset
ASA5505_12_crypto_ipsec_security-association
ASA5505_13_sysopt_connection_tcpmss

Windows Azure Tools 1.7 へのアップグレード

http://robindotnet.wordpress.com/2012/07/04/upgrading-to-windows-azure-tools-1-7/

since 1.6 and 1.7 run side-by-side, we could wait and upgrade each product before we are going to make other changes

Azure Tools 1.6 と 1.7 が同じマシンで同居できる、というのが最重要。Azure 1.5 まで Azure の SDK バージョンごとに開発マシンを用意しなくてはいけなくて大変だったので。(それでも Hyper-V 仮想マシンの時代になって昔よりははるかに用意しやすかったけど)

手元の環境では Web Platform Installer 4.0 経由で追加して今のところ同居に関する問題は発生していない。 (プロジェクトアップグレード時の問題は前述)

Windows Azure Virtual Network 向けの設定を .cscfg に書いて自動ビルドするには Azure SDK 1.7 が必要

http://social.msdn.microsoft.com/forums/en-us/wavirtualmachinesvirtualnetwork/thread/88b50b2d-ba88-4b9f-a022-9441847791e0

Virtual Network の設定は、自動ビルドと直接関係がないので別途管理するという手もある。

xmlns、スキーマのネームスペースに変更はないけど、内容が変更して分かりにくい、という点も Azure1.7 から改善して  schemaVersion="2012-05.1.7" というのが付くようになっている。

<ServiceDefinition name="Example.Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-05.1.7">

(余談: VisualStudio によるアップグレード変換の際、 ServiceDefinition.build.csdef に対して適用されなかったことにより、素直にビルドできなくなって少し悩んだ。)

Windows Azure Virtual Network を Cisco ASA 5505 で構成する

本日はとりあえずpingが通ったところまで。フレッツの MTU 1414 の呪いがあるかどうかは今後負荷をかけつつの検証になります。悩んだポイント等をメモしておきます。

http://oakleafblog.blogspot.jp/2012/06/configuring-windows-azure-virtual.html

設定にあたっては概ねこのブログに書いてある通りなので、こいつが一番役に立つ。

  • CDROMに ASA v8.3(1) ファームウェアが入っているという情報がとても有難かった!! Azure接続向けに購入した場合は、接続を試みる前にファームウェアアップデートしましょう。
  • 物理接続、初期設定あたりは特に参照しませんでした。日本人なら putty じゃなくて TeraTerm を使うでしょう スマイル
  • (製品付属のQuick Start Guide だと、DHCPでIPが振られてブラウザアクセスできるよ、てな説明だった。しかし実際はそんなことはなく、結局シリアル経由での初期セットアップは必要だった)
  • 内側 (vlan1) のIPアドレス設定をした後は、ブラウザ経由GUI設定が楽。
  • ※注 今回は PPPoE は RTX1200 に行わせた後、グローバルIPのセグメントを作って ASA 5505 をぶら下げています。すなわち IP 8 プランでの実現であり、PPPoE を自前で行う固定 IP 1つのプランとは異なります。
  • ASA5505 に対する ping は返答がない。以前からトンネル作った場合にはよくあるケース。windows も標準状態では ping に返答しないというセキュリティ厳しくしないといけない世の中ですが致し方なし。今回は RTX1200 に ping の返事をしてもらいました。
  • そんなわけで設定は出来ていたものの ping が通らないと悩んでいた時に設定を眺めていて分からなかったのは、ルーティングの設定。 http://packetlife.net/blog/2011/jul/11/lan-lan-vpn-asa-5505/ を見て “access-list … extended permit ip …” と “crypto map … match address …” の組み合わせで実現しているということに気づきました。Cisco はアクセスリストを(名前から受ける直観に反して)色んな用途に使うので、久々に触ると混乱します。元CCNAではあるのですが、期限切れはやっぱり期限切れですね。

ところで、Azure ポータルからダウンロードしたサンプルファイル(以下に引用)は blog のものと異なっており、 ikev1 ではなく isakmp を使うようになっていました。

 

! Microsoft Corporation
! Windows Azure Virtual Network

! This configuration template applies to Cisco ASA 5500 Series Adaptive Security Appliances running ASA Software 8.3.
! It configures an IPSec VPN tunnel connecting your on-premise VPN device with the Azure gateway.

! ---------------------------------------------------------------------------------------------------------------------
! ACL and NAT rules
! 
! Proper ACL and NAT rules are needed for permitting cross-premise network traffic.
object-group network <RP_AzureNetwork>
 network-object <SP_AzureNetworkIpRange> <SP_AzureNetworkSubnetMask>
 exit
object-group network <RP_OnPremiseNework>
 network-object <SP_OnPremiseNetworkIpRange> <SP_OnPremiseNetworkSubnetMask>
 exit
access-list <RP_AccessList> extended permit ip object-group <RP_OnPremiseNework> object-group <RP_AzureNetwork>
nat (inside,outside) source static <RP_OnPremiseNework> <RP_OnPremiseNework> destination static <RP_AzureNetwork> <RP_AzureNetwork>

! ---------------------------------------------------------------------------------------------------------------------
! Internet Key Exchange (IKE) configuration
! 
! This section specifies the authentication, encryption, hashing, Diffie-Hellman, and lifetime parameters for the Phase
! 1 negotiation and the main mode security association. We have picked an arbitrary policy # "10" as an example. If
! that happens to conflict with an existing policy, you may choose to use a different policy #.
crypto isakmp enable outside
crypto isakmp policy 10
 authentication pre-share
 encryption aes
 hash sha
 group 2
 lifetime 28800
 exit

! ---------------------------------------------------------------------------------------------------------------------
! IPSec configuration
! 
! This section specifies encryption, authentication, and lifetime properties for the Phase 2 negotiation and the quick
! mode security association. 
crypto ipsec transform-set <RP_IPSecTransformSet> esp-aes esp-sha-hmac
crypto ipsec security-association lifetime seconds 3600
crypto ipsec security-association lifetime kilobytes 102400000

! ---------------------------------------------------------------------------------------------------------------------
! Crypto map configuration
!
! This section defines a crypto map that binds the cross-premise network traffic to the
! IPSec transform set and remote peer. We have picked an arbitrary ID # "10" as an example. If
! that happens to conflict with an existing crypto map, you may choose to use a different ID #.
crypto map <RP_IPSecCryptoMap> 10 match address <RP_AccessList>
crypto map <RP_IPSecCryptoMap> 10 set peer <SP_AzureGatewayIpAddress>
crypto map <RP_IPSecCryptoMap> 10 set transform-set <RP_IPSecTransformSet>
crypto map <RP_IPSecCryptoMap> interface outside

! ---------------------------------------------------------------------------------------------------------------------
! Tunnel configuration
!
! This section defines an IPSec site-to-site tunnel connecting to the Azure gateway and specifies the pre-shared key
! value used for Phase 1 authentication.  
tunnel-group <SP_AzureGatewayIpAddress> type ipsec-l2l
tunnel-group <SP_AzureGatewayIpAddress> ipsec-attributes
 pre-shared-key <SP_PresharedKey>
 exit

! ---------------------------------------------------------------------------------------------------------------------
! TCPMSS clamping
!
! Adjust the TCPMSS value properly to avoid fragmentation
sysopt connection tcpmss 1350

Windows Azure アプリケーションのWebDeploy

(実運用環境での Web Deploy は推奨しない。ファイアウォールの構成を行い、IPアドレス制限することや、X.509 認証の導入により実運用環境でも安全に WebDeploy できるようになる可能性はあるが、そこまで頑張って実現するだけの価値はないだろう)

http://msdn.microsoft.com/ja-jp/library/windowsazure/ff683672.aspx Azure のデプロイ時に 「アプリケーションを発行するときに Web デプロイを有効にする」 ことにより、Azure 環境全体ではなく、Webプロジェクトを単体で更新可能とすることができる。

http://www.windows-maniax.com/nora/azure1001.html 「Visual Studioを使用してWindows Azure WebロールをWeb Deployする方法」を見るとより具体的にイメージすることができた。

http://technet.microsoft.com/ja-jp/iis/ee854980 Webデプロイ は、IISのサイトでは「Web 配置ツール」と呼ばれており、Azure上で試す前に、開発マシン上の IIS で チュートリアル: Web 配置パッケージを使用した Web アプリケーション プロジェクトの配置 を体験しておくと、より理解を深められる。

この、Windows Azure アプリケーションのWebDeploy を利用すべき場面は、VisualStudio から(エミュレーターを利用せず) 直接 Azure にアップロードしながら開発するような開発スタイルを利用している場合である。元々この WebDeploy を知ったのは Windows Azure入門本を読んだことが契機で、エミュレーターとAzureの環境には差があるため、できれば本当のAzure環境にアップロードしながら開発した方が良い、という文脈で紹介されている。

一方、自動ビルドでバージョン番号を付与し、「そのバージョン番号によって発生した不具合や改善策」をチケット管理するような環境では、自動ビルド結果のデプロイを10分縮めることは大きな動機にはならない。なおかつ WebDeploy はEndPointを要求するため、VIP swap のみで WebDeploy の有効無効を切り替えることができない。このため手元の自動ビルド環境において WebDeploy を有効にするための作業はしないことに決めた。