Amazon Elastic Compute Cloud
Windows インスタンス用ユーザーガイド

Windows インスタンスでの起動時のコマンドの実行

Amazon EC2 で Windows インスタンスを起動すると、ユーザーデータをインスタンスに渡すことができます。インスタンス・ユーザーデータは、不透明なデータとして扱われますが、その解釈はインスタンスに依存します。たとえば、自動設定タスクで使用されるデータを指定するか、インスタンスの起動後に実行されるスクリプトを指定することができます。ユーザーデータは、Windows Server 2012 R2 以前では EC2Config によって、Windows Server 2016 以降では EC2Launch によって処理されます。

ユーザーデータスクリプト

EC2Config または EC2Launch でスクリプトを実行するには、そのスクリプトをユーザーデータに追加するときに特別なタグ内にスクリプトを囲む必要があります。使用するタグは、コマンドプロンプトウィンドウで実行するコマンド (バッチコマンド) と Windows PowerShell を使用するかどうかによって異なります。

バッチスクリプトと Windows PowerShell スクリプトの両方を指定すると、バッチスクリプトが最初に実行され、インスタンスユーザーデータに表示される順序に関係なく、次に Windows PowerShell スクリプトが実行されます。

バッチスクリプトの構文

script タグを使用してバッチ スクリプトを指定します。コマンドは、改行を使って区切ります。(例:

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script>

デフォルトでは、ユーザー・データスクリプトはインスタンスを起動すると一度だけ実行されます。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、<persist>true</persist> をユーザーデータに追加します。

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <persist>true</persist>

Windows PowerShell スクリプトの構文

AWS Windows AMI には AWS Tools for Windows PowerShell が含まれており、ユーザーデータにこれらのコマンドレットを指定することができます。インスタンスに IAM ロールを関連付けている場合は、コマンドレットに認証情報を指定する必要はありません。インスタンスで実行するアプリケーションはロールの認証情報を使って、Amazon S3 バケットなどの AWS リソースにアクセスできるからです。

powershell タグを使用して Windows PowerShell スクリプトを指定します。コマンドは、改行を使って区切ります。(例:

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell>

デフォルトでは、ユーザー・データスクリプトはインスタンスを起動すると一度だけ実行されます。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、<persist>true</persist> をユーザーデータに追加します。

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

Base64 エンコード

Amazon EC2 API または、ユーザーデータの base64 エンコーディングが実行されないツールを使用している場合、ユーザーデータを手動でエンコードする必要があります。エンコードしない場合、実行する script タグまたは powershell タグが見つからないというエラーが記録されます。Windows PowerShell を使用してエンコードする例を次に示します。

$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

PowerShell を使用してデコードする例を次に示します。

$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))

base64 エンコードの詳細については、「http://tools.ietf.org/html/rfc4648」を参照してください。

ユーザーデータの実行

デフォルトでは、すべての AWS Windows AMI で初回起動時のユーザーデータの実行が有効になっています。次にインスタンスが再起動されたときにユーザーデータスクリプトが実行されるように指定できます。また、インスタンスが再起動するたびにユーザーデータスクリプトが実行されるように指定することもできます。

ユーザーデータスクリプトは、ランダムなパスワードが生成されたときにローカル管理者アカウントから実行されます。それ以外の場合、ユーザーデータスクリプトはシステムアカウントから実行されます。

インスタンスの作成

インスタンスユーザーデータ内のスクリプトは、インスタンスの最初の起動時に実行されます。永続的なタグが見つかった場合は、その後の再起動または開始時にユーザーデータの実行が有効になります。EC2Launch と EC2Config のログファイルには、標準出力ストリームと標準エラーストリームの出力が含まれています。

EC2Launch では、ログファイルは C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log です。

注記

C:\ProgramData フォルダは非表示になっている場合があります。このフォルダを表示するには、非表示のファイルおよびフォルダを表示する必要があります。

ユーザーデータが実行されると、次の情報が記録されます。

  • Userdata execution begins — ユーザーデータの実行の開始

  • <persist> tag was provided: true — 永続的なタグが見つかった場合

  • Running userdata on every boot — 永続的なタグが見つかった場合

  • <powershell> tag was provided.. running powershell content — powershell タグが見つかった場合

  • <script> tag was provided.. running script content — スクリプトタグが見つかった場合

  • Message: The output from user scripts — ユーザーデータスクリプトが実行されると、その出力がログに記録されます。

EC2Config では、ログファイルは C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log です。ユーザーデータが実行されると、次の情報が記録されます。

  • Ec2HandleUserData: Message: Start running user scripts — ユーザーデータの実行の開始

  • Ec2HandleUserData: Message: Re-enabled userdata execution — 永続的なタグが見つかった場合

  • Ec2HandleUserData: Message: Could not find <persist> and</persist> — 永続的なタグが見つからなかった場合

  • Ec2HandleUserData: Message: The output from user scripts — ユーザーデータスクリプトが実行されると、その出力がログに記録されます。

後続の再起動または起動

インスタンス・ユーザーデータを更新すると、ユーザーデータスクリプトは、インスタンスの再起動または起動時に自動的に実行されません。ただし、ユーザーデータの実行を有効にして、インスタンスを再起動または起動するか、インスタンスを再起動または起動するたびにユーザーデータスクリプトを 1 回実行することができます。

[Shutdown with Sysprep (Sysprep でシャットダウン)] オプションを選択すると、その後の再起動または起動時にユーザーデータの実行を有効にしなかった場合でも、インスタンスが再起動または再起動されたときにユーザーデータスクリプトが実行されます。

Windows Server 2016 以降 (EC2Launch) でユーザーデータの実行を有効にするには

  1. Windows インスタンスに接続します。

  2. PowerShell コマンドウィンドウを開き、次のコマンドを入力します。

    C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 –Schedule
  3. Windows インスタンスから切断します。次にインスタンスを起動するときに更新されたスクリプトを実行するには、インスタンスを停止してユーザーデータを更新します。詳細については、「インスタンスユーザーデータの表示と更新」を参照してください。

Windows Server 2012 R2 以前でユーザーデータの実行を有効にするには (EC2Config)

  1. Windows インスタンスに接続します。

  2. オープン C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe.

  3. [ユーザーデータ] で、[Enable UserData execution for next service start (次のサービス開始でユーザーデータの実行を有効にする)] を選択します。

  4. Windows インスタンスから切断します。次にインスタンスを起動するときに更新されたスクリプトを実行するには、インスタンスを停止してユーザーデータを更新します。詳細については、「インスタンスユーザーデータの表示と更新」を参照してください。

ユーザーデータおよびコンソール

インスタンスの起動時のインスタンスユーザーデータを指定できます。インスタンスのルートボリュームが EBS ボリュームの場合は、インスタンスを停止してユーザーデータを更新することもできます。

起動時にインスタンスユーザーデータを指定する

インスタンスを起動するときは、インスタンスの起動ウィザードのステップ 3: インスタンスの詳細を設定ページで、詳細情報ユーザーデータでスクリプトを指定します。次のイメージの例では、ファイル名の現在の日付と時刻を使用して、Windows 一時フォルダにファイルを作成します。<persist>true</persist> を含めると、インスタンスを再起動または起動するたびにスクリプトが実行されます。[テキストで] を選択すると、Amazon EC2 コンソールは base64 エンコードを実行します。

インスタンスユーザーデータの表示と更新

任意のインスタンスのインスタンスユーザーデータを表示し、停止したインスタンスのインスタンスユーザーデータを更新できます。

コンソールを使用してインスタンスユーザーデータを更新するには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで [Instances] を選択し、該当するインスタンスを探します。

  3. インスタンスを選択し、[Actions]、[Instance State]、[Stop] の順に選択します。

    警告

    インスタンスを停止すると、インスタンスストアボリューム上のデータは消去されます。インスタンスストアボリュームのデータを保持するには、このデータを永続的ストレージに必ずバックアップしてください。

  4. 確認を求めるメッセージが表示されたら、[Yes, Stop] を選択します。インスタンスが停止するまで、数分かかる場合があります。

  5. インスタンスが選択された状態のまま、[Actions(アクション)] を選択し、[Instance Settings(インスタンス設定)] を選択して、[View/Change User Data(ユーザーデータの表示/変更)] を選択します。インスタンスの実行中はユーザーデータを変更できませんが、表示することはできます。

  6. [View/Change User Data] ダイアログボックスで、ユーザーデータを更新し、[Save] を選択します。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、次の例に示すように <persist>true</persist> をユーザーデータに追加します。

  7. インスタンスを再起動します。後続の再起動または開始のためにユーザーデータの実行を有効にした場合、更新されたユーザーデータスクリプトはインスタンスの開始プロセスの一部として実行されます。

ユーザーデータと Tools for Windows PowerShell

Tools for Windows PowerShell を使用して、インスタンスのユーザーデータを指定、変更、表示することができます。インスタンスのメタデータを使用して、インスタンスからユーザーデータを表示する方法については、「インスタンスユーザーデータを取得する」を参照してください。ユーザーデータと AWS CLI については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』の「ユーザーデータと AWS CLI」を参照してください。

例: 起動時にインスタンスユーザーデータを指定する

インスタンスユーザーデータを含むテキストファイルを作成します。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、次の例に示すように <persist>true</persist> をユーザーデータに追加します。

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

インスタンスの起動時にインスタンスユーザーデータを指定するには、New-EC2Instance コマンドを使用します。このコマンドは、ユーザーデータの base64 エンコードを実行しません。次のコマンドを使用して、script.txt という名前のテキストファイルにユーザーデータをエンコードします。

PS C:\> $Script = Get-Content -Raw script.txt PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

-UserData パラメータを使用して、ユーザーデータを New-EC2Instance コマンドに渡します。

PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \ -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \ -UserData $UserData

例: 停止したインスタンスのインスタンスユーザーデータを更新する

停止したインスタンスのユーザーデータは、Edit-EC2InstanceAttribute コマンドを使用して変更できます。

新しいスクリプトを使用してテキストファイルを作成します。次のコマンドを使用して、new-script.txt という名前のテキストファイルにユーザーデータをエンコードします。

PS C:\> $NewScript = Get-Content -Raw new-script.txt PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))

-UserData および -Value パラメータを使用して、ユーザーデータを指定します。

PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData

例: インスタンスユーザーデータを表示する

インスタンスのユーザーデータを取得するには、Get-EC2InstanceAttribute コマンドを使用します。

PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData

出力例を次に示します。ユーザーデータはエンコードされていることに注意してください。

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

次のコマンドを使用して、エンコードされたユーザーデータを変数に格納し、それをデコードします。

PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))

出力例を次に示します。

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>