クラウドサービスに対して PowerShell で何かしらの処理を大量に実行しようとすると、ネットワークや一時的な高負荷、スロットリングなど、何かしらの要因で一定の割合で失敗することがあります。
このため PowerShell で処理を行う場合においては例外処理をきちんと書いておくことが重要です。
例えば、CSP顧客のAzureサブスクリプションの使用量を取得する Get-PartnerCustomerSubscriptionMeterUsage を実行すると、以下の様な [タスクが取り消されました。] というエラーが返ることがあります。
このエラー、メッセージとは全然関係無いスロットリング超過によるタイムアウトなどのような原因で不定期(感覚的に月初はほぼ出ないのですが、月末にかけて増えていく)に出るのですが、酷いときは5回再実行しても連続で失敗することもあります。
ユーザーとの Relationship が切れているなど、他の理由で恒久的に発生するエラーもありますので、無条件に再実行し続ける訳にもいきません。先ずはエラーメッセージから特定方法を調べます。
CategoryInfo.Reason でいけそうですね。
あとは、エラーが出る可能性のあるコマンドの後、都度 Error 変数が存在しているかどうかを確認し、存在している場合は内容を確認して再処理、そして、Error変数をクリアするようにスクリプトを修正します。今回はこんな感じで書いてみました。
Get-PartnerCustomerSubscriptionMeterUsage -CustomerId $CustomerId -SubscriptionId $SubscriptionId while ($Error.Count -gt 0){ if ($Error[0].CategoryInfo.Reason -ne "TaskCanceledException"){ $Error.Clear() break } $Error.Clear() Get-PartnerCustomerSubscriptionMeterUsage -CustomerId $CustomerId -SubscriptionId $SubscriptionId }
エラーの発生する割合が例え 0.1% に満たない小さい値だったとしても、それを毎月沢山の対象に対して実行しているとちょこちょこと失敗します。その度に手動で再実行や補正処理などをしていたら折角スクリプトで自動化したのにもったいないです。
今回は「このエラーの場合は成功するまで再実行する」というエラー処理を自動化してみました。良いPowerShellライフを!