AMIバックアップイメージから復元したWindows EC2インスタンスのパスワード取得について
しばたです。
本記事で説明する内容に関してお客様よりご質問を頂き、既存でまとまったドキュメントも無かった様なのでブログに書くことにしました。
TL;DR
前提条件の説明などがすこし厄介なので先に結論から書いておきます。
前提条件と事象の説明
EC2の運用としてバックアップ用途にAMIイメージ取得することはそれなりにあるかと思います。
例として下図の様なWindows Server EC2インスタンス(win2019-origin
)を作成したとし、このインスタンスにおいては「Windowsパスワードの取得」実行すると下図の様に初期パスワードを取得することができます。
ここでこのwin2019-origin
に対してバックアップとしてAMIイメージを取得します。
(イメージ名は適当にwin2019-backup
としておきます)
ここでこのAMIイメージ(win2019-backup
)をリストアする体で新しいインスタンスを作成します。
「起動」からこのAMIを使いwin2019-origin
と同様の構成で新しいインスタンス(win2019-restored
)を作成します。
※本記事では細かい手順は端折ってますが、win2019-origin
とwin2019-restored
は同等の設定になっています。
そしてこのwin2019-restored
に対して「Windowsパスワードの取得」実行しても下図の様にパスワードは取得できません。
原因について
このリストアしたインスタンス(win2019-restored
)でWindowsパスワードが取得できない理由について説明します。
そもそもこの「Windowsパスワードの取得」はEC2を新規に作成した際の初期パスワードを取得するための機能です。
以前にこちらの記事でも触れましたが、Windows EC2インスタンスの初期パスワード設定はEC2の初期化処理の中でEC2Config/EC2Launchの機能として行われています。
バックアップ用として取得されるAMIイメージではすでに初期化処理は実施済みであり、このイメージを元に新しいインスタンスを作成しても初期化処理が行われないため、AWSの基盤がWindowsのパスワードを知る方法も無く[1]、この機能は利用できません。
初期化処理の有無についてはインスタンスのシステムログを確認すると一目瞭然です。
win2019-originのシステムログ
初期化処理の形跡がログに残っており、パスワード設定も最後に行われています。
win2019-restoredのシステムログ
初期化処理は行われないのでログには何も記録されていません。
エラーメッセージを改めて確認
ここでパスワードが取得できなかった際のエラーメッセージを改めて確認すると、
この機能が有効化されていないカスタム AMI から作成されたインスタンスは、AMI の親インスタンスのユーザー名とパスワードを使用します。
とあり、「この機能が有効化されていないカスタム AMI」というのが今回のAMIに該当し、「バックアップ元のインスタンスのパスワードを使用してください」と、きちんと明言されています。
ちなみに「この機能が有効化されたカスタム AMI 」というのはテンプレート用途に「shutdown with Sysprep(EC2Config)」や「SysprepInstance.ps1(ECLaunch)」を使いSysprepを含めた初期化処理を起動時に実施する様に設定したAMIを指します。
ちょっと古いですがEC2Configを使ったカスタムAMIの作成についてはこちらの記事が役に立つでしょう。
【補足】なんとかインチキできんのか?
本記事の内容としては以上となります。
「Windowsパスワードの取得」はあくまでも初期パスワード取得のための機能であり初期化処理が行われない環境では利用できない機能であることがご理解いただけたかと思います。
とはいえどうにか機能を有効にできないかと考えてしまうのが人情です。
以前にこちらの記事で、非公式ではありますが、変更したパスワードをマネジメントコンソールに反映させる方法を紹介しました。
この方法は初期化処理からパスワード設定に必要な部分を抜き出したものになります。
この方法を採ればバックアップからリストアしたインスタンスに対してパスワード更新し、マネジメントコンソールからパスワード参照可能にすることができるのではないかと思い実際に試してみました。
免責事項
今回は、作成後のwin2019-restored
にRDPでログインして以下のコマンドを実行してみました。
当然ですがWindowsのパスワードをAWSの基盤が知ることはできませんので$password
変数の値は自分で設定する必要があります。
#
# ※以下の内容は無保証です
#
# 初期化処理が必要なら必要な部分だけ実施してしまえばよい
$username = (Get-CimInstance -ClassName Win32_UserAccount -Filter "LocalAccount = 'True'" | Where-Object { $_.SID -like 'S-1-5-21-*' -and $_.SID -like '*-500' }).Name
$password = '********************************' # ここは実際のインスタンスのパスワード
Import-Module (Join-Path $env:ProgramData 'Amazon\EC2-Windows\Launch\Module\Ec2Launch.psd1')
try {
Initialize-Log -Filename "ChangePassword.log" -AllowLogToConsole
Open-SerialPort
Set-SerialPort
Send-AdminCredentials -Username $username -Password $password
}
finally {
Close-SerialPort
Complete-Log
}
このコマンドを実行するとシステムログにパスワード設定の記録が追記され、
この様にwin2019-restored
で「Windowsパスワードの取得」ができる様になりました。
あくまでもこの方法は非公式で無保証ですのでご注意ください。
初期化処理ではAWS基盤がWindowsパスワードを設定するのでパスワードを知っている状態である ↩︎