Azure VM でネットワーク帯域制限をかける方法

VPN や ExpressRoute の帯域を特定のサーバーが食いつぶす時など、Azure VM であえてネットワークの帯域を制限したいという場合は、OS の QoS の機能を使いましょう。(逆に言えば、VPN Gateway や VNET 等の Azure 側で帯域制限をかける機能はありません)

以下のように、[gpedit.msc] – [コンピューターの構成] – [Windows の設定] – [ポリシー ベースの QoS] – [新規ポリシーの作成] から設定できます。

なお、受信方向の帯域制限は極めて限定的にしか出来ませんので、基本的には上記の QoS を大量の通信を発生させている送信元で設定する必要があります。どうしてもインバウンドの通信を制限したいという場合は、TCP のウインドウ サイズを絞ることができるので、それを使いましょう。(TCP の輻輳制御とか、ウインドウの概念は当然ご存知かと思いますが、知らない人は 3 分間 NetWorking を見て勉強しましょう)

※ 当然ですが、TCP のウインドウ サイズを制御するだけなので、以下のような制限が伴います。

  • TCP 以外のプロトコルは制御できません (無差別に送られてくる UDP パケットを抑えることはできません)
  • 帯域幅を明示的に制限できるわけではありません (受信用のバッファ サイズを 16  MB -> 1 MB -> 256 KB -> 64 KB と 4 段階で設定できるだけなので、xx Mbps といった制限はできません)
  • 帯域制御をおこなうトラフィックを細かく設定はできません (すべての受信トラフィックに対して一律で帯域幅が制限されます

以下のように、 [gpedit.msc] – [コンピューターの構成] – [Windows の設定] – [ポリシー ベースの QoS] – [QoS の詳細設定] から設定できます。

ということで、受信側で制限するのは無理があるので、送信側でアウトバウンドの通信を制限しましょう。OS の設定なので、Azureに限らずオンプレでも AWS とかの他社クラウドでも使えると思います。

P.S. ネットワークの最適化に関しては、Tech Summit 2018 のセッションがおすすめです。

Azure Automation で Invoke-WebRequest したあと Parse してくれない件

Azure Automation で wget したあと、プロパティが参照できなくて毎回同じ場所で時間を浪費してるのでメモ。

$Result = Invoke-WebRequest "http://www.contoso.com"
$Result.Links.href
Invoke-WebRequest : The response content cannot be parsed because the Internet Explorer engine is not available, or
Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.
At line:1 char:1
+ Invoke-WebRequest "https://bangumi.org/epg/td?broad_cast_date=2019031 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotImplemented: (:) [Invoke-WebRequest], NotSupportedException
+ FullyQualifiedErrorId : WebCmdletIEDomNotSupportedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

UseBasicParsing を使って、最小限のパースだけで我慢しましょう。

$Result = Invoke-WebRequest "http://www.contoso.com" -UseBasicParsing
$Result.Links.href

Azure Front Door の SSL 証明書更新

Azure Front Dorr (通称 AFD) の SSL 証明書を更新したので、忘れないうちに手順を残しておきます。なお、証明書は AFD が払い出すものではなく、自前で持ち込むパターンです。

更新前の証明書は有効期間が 2019/05/29 までになっています。

今回、AFD のフロントエンド ホストには、DigiCert で発行した証明書を持ち込んでいますが、作成時に Key Vault (キー コンテナー) を作って配置してあるはずなので、当該コンテナにある対象の証明書に [新しいバージョン] として追加します。

Key Vault に証明書を追加したら、AFD のフロントエンド ホストで対象のホスト名を選択し、[キー コンテナー] – [シークレット] – [シークレット名] と順に選択します。最後のシークレット名で、Key Vault にインポートした証明書の [現在のバージョン] となっている最新のものを選択して [更新] し、最後に変更を [保存] しましょう。

以上で無事に更新でき、有効期限が 2020/07/02 に変更されたことが確認できました。(AFD は CDN のようにキャッシュを持つので、更新されない場合は 30 分くらい待てばいいと思います。今回は数分以内には更新されました。)

Key Vault の存在を忘れていなければ、特に難しくはないですね。