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インスタンス起動時のログはシリアルコンソールというところに出力されます。
意図した起動をしない場合に調査するのに役立ちますが、PowerShell スクリプトで出力すると見事に文字化けします。
例えば、以下のようなPowerShellスクリプトを実行するとします。
echo "test" # Error occurred echl
echl
はtypoなので、実行時に必ず失敗します。もし、OS側で標準言語が日本語である場合、エラーメッセージも日本語になるのですが、シリアルコンソールでは文字化けしてしまいます。
これだと何が原因なのかよく分かりませんね。
エラーメッセージを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 にしてあげると良いです。
修正して起動し直すとエラーメッセージが英語になります。何が原因かわかりますしググりやすくなりますね!