以前 osProfile が存在しない Windows の Azure VM の修正方法 という投稿をしましたが、Azure VM では OsProfile を設定することで、VM の展開時に OS の設定を変更することができる仕組みが提供されています。
PowerShell で実行する場合は、New-AzVMConfig を使用して、OSProfile プロパティを操作することになるのかと。
Windows の VM を Azure で展開する場合、カスタマイズしたイメージを作成する場合、イメージのカスタマイズを実施して イメージ作成前に VM をプロビジョニング解除または一般化し、マシン固有の情報を削除します の方法でイメージ化するのが一般的な方法となります。
日本で VM のイメージを作成する場合、日本語化の設定 を行った状態でイメージ化して、展開を行いますが、このイメージを単純に展開すると、イメージ化する前に日本語のタイムゾーンに設定をしていても展開時には UTC のタイムゾーンとなり展開が行われます。
イメージを展開した直後に任意のタイムゾーンを設定した状態にしたい場合には、前述の OsProfile の WindowsConfiguration の TimeZone を使用することで、UTC 以外のタイムゾーンを設定した状態で展開することができます。
OsProfile を使用したタイムゾーンの設定
Windows の Azure VM のイメージををデフォルトの設定で展開すると、前述のとおり、イメージ化前に任意のタイムゾーンを設定していても、展開後は UTC が使用された状態で展開がされます。
UTC に設定される理由ですが、一般化されたイメージを展開する際に使用される応答ファイル (Unattend.xml) で UTC が指定されているためです。
展開時に使用された応答ファイルは「C:\Windows\Panther\unattend.xml」で確認することができますが、デフォルトの設定で Windows のイメージを展開すると、次のような設定が行われた状態となっています。
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <TimeZone xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:rdfe="http://schemas.microsoft.com/2009/05/WindowsAzure/ServiceManagement" xmlns:wa="http://schemas.microsoft.com/windowsazure">UTC</TimeZone> <ComputerName xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:rdfe="http://schemas.microsoft.com/2009/05/WindowsAzure/ServiceManagement" xmlns:wa="http://schemas.microsoft.com/windowsazure">winvm</ComputerName> </component>
応答ファイルの TimeZone が UTC に設定されていることが確認できますね。
OsProfile.Windows.Configuration.TimeZone を明示的に指定していない場合はこのように UTC が設定された状態で展開が行われるため、イメージ化をする前に任意のタイムゾーンを設定していても UTC の状態で設定が行われます。
今回は Bicep で VM を展開していますが、一般化されたイメージを展開する際に、任意の TimeZone を設定する場合、osProfile に次のような設定を行います。
osProfile: { computerName: 'winvm' adminUsername: adminUsername adminPassword: adminPassword windowsConfiguration: { provisionVMAgent: true enableAutomaticUpdates: true timeZone: 'Tokyo Standard Time' } }
windowsConfiguration の timeZone に任意の TimeZone を指定することで、応答ファイルの TimeZone の設定が指定した内容に書き換えられます。
上記の設定であれば日本時間に設定された状態となりますので、上述の応答ファイルが次のような設定となり「Tokyo Standard Time」が指定された状態で展開が行われます。
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <TimeZone xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:rdfe="http://schemas.microsoft.com/2009/05/WindowsAzure/ServiceManagement" xmlns:wa="http://schemas.microsoft.com/windowsazure">Tokyo Standard Time</TimeZone> <ComputerName xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:rdfe="http://schemas.microsoft.com/2009/05/WindowsAzure/ServiceManagement" xmlns:wa="http://schemas.microsoft.com/windowsazure">winvm</ComputerName> </component>
windowsConfiguration の設定は展開時にのみ指定することができ、後から設定変更を行うことができないため、展開済みの VM に対してはこの方法で任意のタイムゾーンを設定することはできませんが、新規展開の VM についてはこのような方法で設定変更を行うことができます。
展開時の設定には AdditionalUnattendContent という、応答ファイルの「FirstLogonCommand」「AutoLogon」に任意のコンテンツを埋め込む方法も提供されていますので、イメージのカスタム展開にはこの設定も活用できるかもしれませんね。