アクセス分散にAzure Front Doorを使っていると、メンテナンス期間に入る配信元を停止(無効化)してトラフィックを切り替えたい場合がある。これをPowerShellスクリプトで実装すると、トラフィックの制御を自動化しやすくなる。
対象:Azure Front Door Standard/Premium、PowerShell
Azureの「Front Door」を利用している場合、普段は設定済みのルーティング方法で自動的にアクセスを分散しているはずだ。
しかし、これを変更したい場合があるだろう。例えば、幾つかの配信元(オリジンサーバ)のうち、1つがメンテナンス期間に入るような場合、その前にその配信元へのトラフィックを止めておき、メンテナンスが終わって回復したら元に戻したい、という状況だ。
こうした処理をせずとも、正常性プローブによって、応答が止まった配信元へのトラフィックは自動的に停止する。とはいえ、メンテナンス中に配信元のサーバが断続的に途絶と回復を繰り返すことも考えられるので、メンテナンス中は全面的に止めておいた方が安定するだろう。
配信元の無効化/有効化はもちろんAzureポータルで可能だ。ただ、予定されたメンテナンスなど、そのトリガーが把握できているなら自動化して省力化を図りたいところだろう。
そこで本Tech TIPSでは、Azure PowerShellを使ってFront Doorのトラフィック分散を制御する方法を紹介する。トラフィック制御をPowerShellスクリプトに実装してAzure AutomationのRunbookに登録すれば、希望のタイミングで自動実行できるようになる。
対象のFront DoorのSKUはStandardまたはPremiumとする。EdgioなどのCDNやFront Doorクラシックについては対象外としている。
Automationへの登録などについては、Tech TIPS「【Azure】権限に注意! AutomationでApp Serviceの定期的な再起動を自動化する(PowerShell編)」「【Azure】AutomationアカウントでVMの起動/停止を定期的に繰り返すスケジュールを組む(ARMテンプレート編)」を参照していただきたい。
Traffic Managerについては、Tech TIPS「【Azure】Traffic Managerのトラフィック切り替えをPowerShellで自動化する」を参照していただきたい。
ここでは、デフォルトのサブスクリプションにある全てのFront Doorプロファイルから、全ての配信元を収集してみる。
# Front Doorプロファイルの一覧を取得
$FDProfiles = Get-AzFrontDoorCdnProfile
$FDProfiles | Format-Table -Property Name, ResourceGroupName, SkuName
# Front Doorの配信元グループの一覧を取得
$FDOriginGroups = @()
$FDProfiles | ForEach-Object {
# 配信元グループの一覧を取得
$FDOriginGroup = Get-AzFrontDoorCdnOriginGroup `
-ProfileName $_.Name `
-ResourceGroupName $_.ResourceGroupName
# 配信元グループの特定に必要な要素を格納
$FDOriginGroups += [PSCustomObject]@{
Name = $FDOriginGroup.Name # 配信元グループ名
ResourceGroupName = $FDOriginGroup.ResourceGroupName # ↑のリソースグループ名
ProfileName = $_.Name # プロファイル名
# Get-AzFrontDoorCdnOriginGroupでは正しく格納されないため、
# ここで改めて代入
}
}
$FDOriginGroups | Format-Table
# Front Doorの配信元の一覧を取得
$FDOrigins = $FDOriginGroups | ForEach-Object {
Get-AzFrontDoorCdnOrigin `
-OriginGroupName $_.Name `
-ResourceGroupName $_.ResourceGroupName `
-ProfileName $_.ProfileName
}
$FDOrigins | Format-Table
「Get-AzFrontDoorCdnProfile」コマンドレットで取得できるFront Doorプロファイルのオブジェクトには、配信元グループの一覧は格納されていない。同様に「Get-AzFrontDoorCdnOriginGroup」コマンドレットで取得できる配信元グループのオブジェクトにも、配信元の一覧は含まれない。
そのため、それぞれ親リソース名と自身のリソース名、そのリソースグループ名を指定して、Front Doorプロファイルから配信元グループ、配信元という順番で一覧を取得していく必要がある。
注意が必要なのは、Get-AzFrontDoorCdnOriginGroupコマンドレットで得られる配信元グループのオブジェクトの「ProfileName」にプロファイル名が格納されないことだ。そのため、上記リストでは、新たにPSCustomObjectのオブジェクトを用意して、配信元グループ名やリソースグループ名に加えて正しいプロファイル名を設定している。
次に、取得した配信元一覧から対象の配信元を見つける。以下では、配信元としてApp ServiceによるWebサイトを想定している。
# 配信元のApp Serviceの名前
$webAppName = "<App Service名>"
# ↑のデフォルトのFQDN
$webAppDefaultFQDN = $webAppName + ".azurewebsites.net"
# カスタムホスト名=ホストヘッダーの内容
$webAppCustomFQDN = "<カスタムFQDN>"
# FQDNから配信元を探す
$targetFDOrigin = $FDOrigins | Where-Object { `
# ホスト名およびホストヘッダーの内容がそれぞれの想定値と一致
$_.HostName -eq $webAppDefaultFQDN -and $_.OriginHostHeader -eq $webAppCustomFQDN
}
$targetFDOrigin | Format-List
各配信元のオブジェクトからは、さまざまなプロパティを取得できる。
例えば配信元がApp Serviceの場合、「HostName」プロパティにはApp ServiceのデフォルトのFQDN「<App Service名>.azurewebsites.net」が格納されており、OriginHostHeader」プロパティには配信元に送信されるホストヘッダーの内容が記されている。上記リストでは、これらのプロパティから配信元を特定している。
また「EnabledState」プロパティが「Enabled」なら配信元へのトラフィックは有効で、「Disabled」なら無効だと判定できる。さらに「Weight」プロパティからは重みが、「Priority」からは優先順位がそれぞれ取得できる。
配信元を特定できたら、そのオブジェクトを再取得して、最新の状態に更新しよう。
上記リストのようにして、既に配信元のオブジェクトが取得済みの場合、以下のようにそれをGet-AzFrontDoorCdnOriginコマンドレットへパイプラインで渡すと、簡単に最新の状態を取得(更新)できる。
$targetFDOrigin = $targetFDOrigin | Get-AzFrontDoorCdnOrigin
一方、配信元のオブジェクトが未取得の場合は、以下のようにFront Doorの配信元の名前、リソースグループ名、配信元グループ名、プロファイル名の4つ全てを、Get-AzFrontDoorCdnOriginコマンドレットのパラメーターに指定しなければならない。
$FDOriginName = "<配信元の名前>"
$FDOriginRG = "<↑のリソースグループ名>"
$FDOriginGroupName = "<配信元グループ名>"
$FDProfileName = "<Front Doorプロファイル名>"
$targetFDOrigin = Get-AzFrontDoorCdnOrigin `
-OriginName $FDOriginName `
-ResourceGroupName $FDOriginRG `
-OriginGroupName $FDOriginGroupName `
-ProfileName $FDProfileName `
最新の配信元のオブジェクトを取得したら、以下のように「Update-AzFrontDoorCdnOrigin」コマンドレットにパイプラインで渡しつつ、「-EnabledState Disabled」オプションを指定すると、その配信元を無効化できる。
$targetFDOrigin = $targetFDOrigin | Update-AzFrontDoorCdnOrigin -EnabledState Disabled # 無効化
$targetFDOrigin.EnabledState # 「Disabled」すなわち無効のはず
Update-AzFrontDoorCdnOriginコマンドレットは、更新した配信元の最新のオブジェクトを返す。そのためその戻り値から、正しくプロパティ(ここではEnabledState)が変更できたかどうかが確認できる。
無効化した配信元を有効化するには、Update-AzFrontDoorCdnOriginコマンドレットに「-EnabledState Enabled」オプションを指定して実行する。
$targetFDOrigin = $targetFDOrigin | Update-AzFrontDoorCdnOrigin -EnabledState Enabled # 有効化
$targetFDOrigin.EnabledState # 「Enabled」すなわち有効のはず
Copyright© Digital Advantage Corp. All Rights Reserved.