Windowsにログインせず、SSM(CLI)からsysprepを投げる
概要
はじめに
今回は、SSM(Systems Manager)を使用して、EC2上のWindows Server に対してsysprepを行う方法をご紹介します。
Sysprepはsysprepコマンドを直接実行するのではなく、AWSのEC2Config サービスを利用して、Sysprepを投げたいと思います!
今回記載するオペレーションは、ターゲットにWindows Server 2012 R2 を使用して確認した結果です。新しいバージョンのWindows OS では実行方法が変わる可能性があります。必要に応じて、検証をお願いします。
本記事では最終的にAWSコンソールではなく、AWS CLI からSSMを実行しています。また、記事内にAWS CLIのサンプルが登場しますが、AWS CLI はLinux環境を想定しています。
想定するシチュエーション
今回の記事で想定するシチュエーションをご説明します。EC2上に起動したWindows Server があり、そのイメージを横展したい時の準備作業を想定しています。EC2のAMIを取得する前にsysprepを実行し、Windows Server のSIDを初期化します。(バックアップ目的であれば、単純にAMIを取得するだけで、OKです)
本作業はリモートデスクトップでログオンして実行すれば済む話ですが、繰り返し作業となれば大変な手間です。今回は、SSMかつAWS CLI から実行する方法を確立して、手間を削減します。
Sysprepとは
Sysprepツールの理解
Sysprepを復習します。
Windows OSは、Linuxと異なり、ディスク複製またはイメージ化された Windows OSを他サーバーに展開する場合に、イメージの取得前に System – Preparation (Sysprep) ツールを使用する必要があります。
Sysprepを実行することで、マシンに持つ固有情報(コンピューター SID )およびイベントログなどいくつかの情報が初期化されます。
Sysprepは、デフォルトでWindows内の下記パスにインストールされています。但し、今回は下記コマンドを使用せず、EC2Configサービス(後述)を使用します。
%windir%\system32\sysprep
Sysprepは必要か否かは議論しません。必要な想定で行います。
SIDの調べ方
Windows OSで、SIDを調べるには、コマンドプロンプトより下記コマンドを使用します。
以下は、異なるEC2インスタンスであるにも関わらず、単純にAMIをコピーして起動したことで同一のSID が使用されたケースです。
EC2Config サービス (EC2Config.exe)の利用
前述のシチュエーションにも記載した通り、少しでも手間を削減するためAWSのサービスを利用します。今回、OSのツール(sysprepの実行ファイル)は使いません。
Windows Server 2012 R2 以前の Windows AMI には、EC2Config サービス (EC2Config.exe) というオプションのサービスが含まれています。このサービスを利用します。
EC2Config サービスの詳細は、下記ドキュメントを参照ください。
SSMからRunCommandする
今回は、EC2Config サービスをリモートデスクトップでログオンして直接実行するのではなく、SSM(Systems Manager)から実行します。
RunCommand に「AWSEC2-RunSysprep 」のコマンドが用意されていますが、Windows Server OSのバージョンによって挙動の差が生まれることを懸念し、今回は「AWS-RunPowerShellScript 」のコマンドを使用することにしました。AWS-RunPowerShellScriptの説明には、下記とあります。SSMからpowershellを実行するためのコマンドとなります。色々と使い道がありそうですね!
Run a PowerShell script or specify the paths to scripts to run.
「コマンドのパラメータ」 に「./Ec2Config.exe -sysprep」を入力し、「Working Directory 」に「C:\Program Files\Amazon\Ec2ConfigService」を入力します。環境によって異なる可能性がありますので、ご使用の環境で上記パスの有無を確認してください。「Execution Timeout 」は適切に変更します。
ここで重要なポイントを説明します。Working Directory はオプションと記載されていますが、必須のパラメータと理解してください。Working Directoryを指定しなければ実行するディレクトリはコマンドのデフォルトパスになります。(Linuxを例に説明するとホームディレクトリではなく、/usr/binとなる)
コマンドがNot Found で失敗せぬよう、Working Directoryは必須と理解して指定しましょう。
また、RunCommandでは、上記で選択したコマンド、入力したパラメータをAWS CLIで実行する場合のコマンドをガイドしてくれます。今回は、ここに表示されているAWS CLIのコマンドを利用し、AWS CLI からSSMを実行することとします。
SSM(AWS CLI)からWindows Serverのsysprepを実行する
ようやく、ラストステージです。Linux環境よりAWS CLI を実行して、SSMの「AWS-RunPowerShellScript」のコマンドを送ります。
前述の通り、「AWS-RunPowerShellScript」のコマンドのパラメータには、Ec2Config.exeを記載し、オプションにsysprepを指定しています。この方法でリモートの環境からSSMを使って、Windows Server にSysprepを投げることができます。
$ instance_id=i-01111111111111111
$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets "Key=instanceids,Values=${instance_id}" --parameters '{"workingDirectory":["C:\\Program Files\\Amazon\\Ec2ConfigService"],"executionTimeout":["600"],"commands":["./Ec2Config.exe -sysprep"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1
EC2ConfigサービスのSysprepは、下記のドキュメントに詳細な説明があります。理解を深める際に、お読みください。
元記事はこちら
「SSMからEC2 Windowsをsysprepする方法 」
お客様のご要望に柔軟に対応いたします。まずはお気軽にご相談ください。
cloudpackは、アイレット株式会社が提供するクラウド支援サービスです。クラウドの導入・構築から運用・保守、技術的な問い合わせまでトータルサポート!
アイレットでは、様々な職種で一緒に働ける仲間を募集しています。
インフラエンジニア、開発エンジニア、クリエイティブ職、営業職など、様々な職種で一緒に働ける仲間を募集しています。アイレットのこと、社員インタビュー、募集職種、福利厚生など、アイレット公式サイト採用情報をご覧ください。