[アップデート] Windows Server EC2の初回起動速度を最適化するオプションが共有AMIでも可能になりました

2023.11.09

しばたです。

去年の1月にWindows Server EC2の初回起動速度を最適化するオプションが提供されました。

先日からこのオプションが共有AMIにおいても可能になりました。
AWSからのアナウンスはこちらです。

どういうことか

従来このオプションは自分が所有するAMIに対してのみ可能であり、ベースとなる共有AMIが存在する場合は必ずカスタムAMIを作成する必要がありました。
今回でこの制限が無くなり共有AMIを直接利用可能になります。

また、このオプションを利用する際にデフォルトVPCを必要としていましたが、デフォルトVPCが削除された環境向けに独自の起動テンプレートを指定することもできる様に改善されています。

ユースケース

「共有AMI」の一番分かりやすい例はAWSが所有者となる公式AMIです。
今回の更新で公式AMIをそのまま最適化オプションの対象にすることが可能になります。

ただ、実際のユースケースとして公式AMIをそのまま最適化することは少ないと思います。
私としては「大規模な組織においてAMIを用意するアカウントとEC2が運用されるアカウントが別れる場合」が一番使われるユースケースだと考えています。

試してみた

ここからは実際に動作確認していきます。
私の検証用AWSアカウントの東京リージョンを対象とし、本日時点で最新の日本語版Windows Server 2022 AMI

  • ami-0783e9c9192caa28b (Windows_Server-2022-Japanese-Full-Base-2023.10.11)

を例に最適化オプションを試します。

最初にマネジメントコンソールからAMIを検索します。

対象の共有AMI(ami-0783e9c9192caa28b)を選択し「高速起動を設定」を指定します。

オプションの設定画面に遷移するのであとは従来通り高速起動のオプションを有効にするだけです。

今回は起動頻度を「1時間あたり5回の起動」にしています。
また、オプションで起動テンプレートの指定もできる様になっていることが分かります。

「変更を保存」ボタンをクリックすればエラー無くオプションが有効になります。
ここが更新ポイントですね。

あとは従来通りデフォルトVPCでEBSスナップショット作成用の一時インスタンスが起動し、

最終的に高速起動用のスナップショットが作成されます。

最後にAMIからEC2インスタンスを起動してやればこのスナップショットが使われ素早く起動します。

最適化オプションを止める場合

このオプションを止める場合は「Windowsの高速起動を有効にする」のチェックを外してやるだけです。

「変更を保存」すると直ちにオプションが解除されEBSスナップショットも削除されます。

起動テンプレートを指定する場合

デフォルト設定(=起動オプション未指定)の場合、AWSが自動でデフォルトの起動テンプレートを作成します。

このテンプレートではインスタンスタイプだけt3.xlargeに設定されています。

デフォルトVPCが無い環境など向けに独自の起動テンプレートを作成し、ユーザー作成のVPCで一時インスタンスを動作させることも可能です。
今回は簡単にmy-windows-fast-launchと言う名前で独自のVPCを使う設定様にした起動テンプレートを用意しました。

あとはオプション設定画面で起動テンプレートを指定してやるだけでOKです。

変更した結果については割愛します。

余談 : 一時EC2インスタンスのユーザーデータ

改めて一時EC2インスタンスのユーザーデータを確認してみましたが変更点はありませんでした。
最適化の実装自体に変更は無い模様です。

一時インスタンスのUserData (インデント調整済み)

<powershell> 
if (Get-Service Ec2Config) { 
	$EC2SettingsFile = "$env:ProgramFiles\Amazon\Ec2ConfigService\Settings\Config.xml" 
	$xml = (get-content $EC2SettingsFile) 
	$xmlElement = $xml.get_DocumentElement() 
	$xmlElementToModify = $xmlElement.Plugins 
	foreach ($element in $xmlElementToModify.Plugin) { 
		if ($element.name -eq 'Ec2SetPassword') { $element.State = 'Enabled' } 
		elseif ($element.name -eq 'Ec2HandleUserData') { $element.State = 'Enabled' } 
		elseif ($element.name -eq 'Ec2DynamicBootVolumeSize') { $element.State = 'Enabled' } 
	} 
	$xml.Save($EC2SettingsFile) 
} elseif (Get-Service 'Amazon EC2Launch') { 
	& "$env:ProgramFiles\Amazon\EC2Launch\ec2launch.exe" reset -c 
} else { 
	& "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -File "$env:ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1" -Schedule  
} 
New-Item -Path HKLM:\Software\Amazon -Name WarmBoot 
Invoke-Expression -Command:'shutdown.exe /s /t 0' 
while ($true) { 
} 
</powershell>

最後に

簡単ですが以上となります。
内容としてはシンプルな更新ですが地味に嬉しいやつですね。