本日も乙

ただの自己満足な備忘録。

Windows on GCEにおける起動スクリプト Tips

GCE on Windowsを扱っています。Linuxと比較すると注意すべき点がいくつかありますが、そのうちの一つが起動スクリプトがあります。
なかなか情報が出回っていなかったので色々試してみて得たTipsを書き連ねたいと思います。

スタートアップスクリプトのメタデータがLinuxと異なる

Linuxにおいてスタートアップスクリプトを実行する場合はメタデータ startup-script にスクリプトを埋め込むか、 startup-script-url にスクリプトがあるGCSのパスを指定するのですが、Windowsはsysprepの実行有無及び実行するスクリプトの種類によってメタデータが異なります。

スクリプトの種類 ブート前のsysprep実行中に実行 sysprep完了後の起動時に実行
URL指定 sysprep-specialize-script-url windows-startup-script-url
コマンドプロンプト sysprep-specialize-script-cmd windows-startup-script-cmd
バッチ sysprep-specialize-script-bat windows-startup-script-bat
PowerShell sysprep-specialize-script-ps1 windows-startup-script-ps1

Refer: Running Startup Scripts  |  Compute Engine Documentation  |  Google Cloud

シャットダウンスクリプトのメタデータがLinuxと異なる

スタートアップと同じですね。

スクリプトの種類 メタデータ
コマンドプロンプト windows-shutdown-script-cmd
バッチ windows-shutdown-script-bat
PowerShell windows-shutdown-script-ps1

以下、PowerShellを前提としてすすめます。

シリアルコンソールでの文字化けを防ぐ

GCEインスタンス起動時のログはシリアルコンソールというところに出力されます。

windows-on-gce

意図した起動をしない場合に調査するのに役立ちますが、PowerShell スクリプトで出力すると見事に文字化けします。

例えば、以下のようなPowerShellスクリプトを実行するとします。

echo "test"

# Error occurred
echl

echl はtypoなので、実行時に必ず失敗します。もし、OS側で標準言語が日本語である場合、エラーメッセージも日本語になるのですが、シリアルコンソールでは文字化けしてしまいます。

windows-on-gce

これだと何が原因なのかよく分かりませんね。
エラーメッセージをUSにしてあげると解決します。

# Output with UTC-8
chcp 65001

# Output error message in english
[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'

echo "test"

# Error occurred
echl

[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US' でエラーメッセージをUSに変換して出力します。これだけで十分だと思うのですが、念の為コンソールの文字コードを chcp 65001 で UTF-8 にしてあげると良いです。

修正して起動し直すとエラーメッセージが英語になります。何が原因かわかりますしググりやすくなりますね!

windows-on-gce

参考