sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

Run Command で Windows Update ができなくなった話

かもしれない運用は大事です、那須です。

皆さんちゃんと Windows Update を定期的にやっていますか? どんな方法で悪意ある何かがやってくるかわかりませんよ? 普段から何かあるかもしれない、と思って対策するのはとても大切なのでやっておきましょう。 ただ、今年に入ってから Windows Update にはほんとに振り回されっぱなしです… 今回はそのお話を書き残しておこうと思います。

 

いつものように Windows Update しようとした

Systems Manager を使って Windows Update を毎月実施している環境があるんですが、今月も同じようにスケジュールしていました。 で、実施翌日にログ確認したらこんなエラーが出ていました。

Install-WindowsUpdates : オブジェクト参照がオブジェクト インスタンスに設定されていません。
発生場所 行:1 文字:1
+ Install-WindowsUpdates -UpdateLevel Important
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (PatchNow.Implem...UpdateOperation:InstallWindowsUpdateOperation) [Install-WindowsUpdates], NullReferenceException
    + FullyQualifiedErrorId : Exception Level 1:
    Error Message: オブジェクト参照がオブジェクト インスタンスに設定されていません。
        Stack Trace:    場所 PatchNow.Implementations.InstallWindowsUpdateOperation.DoWindowsUpdateOperation()
           場所 PatchNow.Implementations.WindowsUpdateOperation.DoBeginProcessing() ,PatchNow.Cmdlets.InstallWindowsUpdates
 
failed to run commands: exit status 4294967295

 

???

今までこんなエラーは当然出てないですし、構成も何も変わってないのでおかしいなと思ったんですよね。 しかも Windows Update の Run Command 実行直後にエラーになっているので、これは Systems Manager かそれをトリガーしているスケジューラで何か変更があったのかな?と最初は思いました。

 

スケジューラ側は何も変わってなかった

スケジューラの問い合わせ窓口に問い合わせたんですが、特に何も変更されていないと回答がありました。 他の環境はうまく実行できていたので、まあそうだろうなと思いつつ、次に進みます。

 

AWS に問い合わせた

当然、AWS が管理する Run Command ドキュメントは何も変わってなかったんですが、問い合わせた回答の中にこんな返答がありました。

%PROGRAMDATA%\Amazon\PatchNow\State\ の中に空のState(json)ファイルがある場合にこのようなエラーがでて失敗する事例がありますよ。 もしあったら削除して Run Command を再実行してみてください。

当該フォルダを確認してみると、

f:id:nasrinjp1:20190213123637p:plain

確かに 0 バイトの json ファイルがあったので、これを削除して再実行するとうまく Windows Update できました。 本当にサポートの存在ってありがたいですよね!

 

そういえば先月こんなことがあった

空の json ファイルの更新日時を見ると、前回の Windows Update を実施した時間帯でした。 さらに思い返してみると、前回の Windows Update は 8 時間経っても終わらずにエラーで Run Command が終了していたんですよね。 手で Windows Update 実行しても、95% のまま動かずタイムアウトになる有様… 4 回リトライしてようやく適用された、なんてことがあったんです。

なので、

  • Run Command から Windows Update を実行してタイムアウト等で処理が完了しなかったら空の State(json) ファイルが残る
  • 空の json ファイルがあると Run Command は処理を実行できない

という知見を得たので、他にも空の json ファイルが残るパターンがあることを想定してこのフォルダに Run Command 実行時以外に json ファイルがあれば通知するよう仕込みました。 これで Windows Update 当日にエラーになる可能性をまた一つつぶしました。

 

まとめ

サポートは正しく活用しましょう。解決までのスピードが全然違います。
同じエラーを発生させない仕組みをどんどん準備しましょう。
Linux でも同じものが作れるなら Linux に変えましょう。Windows Update はいろいろとツライです…