SSMからEC2 Windowsをsysprepする方法

2019-09-13

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を調べるには、コマンドプロンプトより下記コマンドを使用します。
    • whoami /user
  • 以下は、異なる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を指定しなければ実行するディレクトリはコマンドのデフォルトパスになります。(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は、下記のドキュメントに詳細な説明があります。理解を深める際に、お読みください。