Amazon EC2 Windows Server で再起動時にもユーザーデータを実行する方法
既存の EC2 Windows インスタンスでコマンドを実行する | AWS re:Post
Windows Server のバージョンおよび起動エージェントのバージョンに応じた対応が必要です。
| バージョン | 対応 |
|---|---|
| Windows Server 2012 R2 以前または EC2Config | Ec2ConfigServiceSetting.exe で設定 |
| Windows Server 2016 および 2019 または EC2Launch |
InitializeInstance.ps1 –Schedule で設定 |
| Windows Server 2022 以降または EC2Launch v2 |
<persist>true</persist> で設定 |
ユーザーデータ
ユーザーデータ入力を使用して EC2 インスタンスを起動するときにコマンドを実行する - Amazon Elastic Compute Cloud
Amazon EC2 インスタンスの起動時に、インスタンスの起動後に自動設定タスクを実行したり、スクリプトを実行したりするのに使用するインスタンスにユーザーデータを渡すことができます。
EC2 インスタンス起動時に実行したい処理を定義する機能がユーザーデータです。
例えば、Windows Server で Hello World という文字列を出力した場合には以下のように定義できます。
<powershell>
Write-Output "Hello World" | Out-File C:\hello.txt
</powershell>
ユーザーデータ入力を使用して EC2 インスタンスを起動するときにコマンドを実行する - Amazon Elastic Compute Cloud
デフォルトでは、ユーザーデータスクリプトはインスタンスを起動すると一度だけ実行されます。
上記ドキュメントに記載の通り、デフォルトではユーザーデータは EC2 インスタンス起動時に 1 回だけ実行されます。
そのため、EC2 インスタンスの停止、開始による再起動時にはユーザーデータが実行されません。
再起動時にもユーザーデータを実行する方法
ユーザーデータ入力を使用して EC2 インスタンスを起動するときにコマンドを実行する - Amazon Elastic Compute Cloud
起動のたびにユーザーデータスクリプトを実行するには、ユーザーデータに <persist>true</persist> フラグを追加します。
冒頭に記載した通りバージョンによって対応方法が異なります。
一例として今回は EC2Launch v2 で挙動を確認します。
01. EC2 インスタンスの作成
まずはユーザーデータが 1 回だけ実行される設定で EC2 インスタンスを作成しました。
設定内容は以下の通りです。
- AMI: Microsoft Windows Server 2025 Base
- VPC: デフォルト
- サブネット: デフォルト
- セキュリティグループ: インバウンド、アウトバウンド全開放
- インスタンスプロファイル: AdministratorAccess 権限を付与したプロファイル
- ユーザーデータ: 以下の通り
<powershell>
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logFile = "C:\userdata-log.txt"
Add-Content -Path $logFile -Value "User data executed at: $timestamp"
</powershell>
EC2 インスタンスの起動完了後、Systems Manager フリートマネージャーのファイルシステムから userdata-log.txt が作成されていることを確認します。

02. EC2 インスタンスの再起動
手順 01 で作成した EC2 インスタンスを停止、開始してもユーザーデータが実行されないことを確認します。


再度 Systems Manager フリートマネージャーのファイルシステムから userdata-log.txt を確認しても内容が同じであることを確認できます。

手順 01 での EC2 インスタンス作成時にユーザーデータで <persist>true</persist> を定義していないため、ユーザーデータが初回起動時のみ実行される挙動は仕様通りです。
03. EC2 インスタンスの作成
今度はユーザーデータが毎回実行される設定で EC2 インスタンスを作成しました。
基本的な設定内容は手順 01 ど同様ですが、ユーザーデータのみ以下に変更します。
<persist>true</persist>
<powershell>
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logFile = "C:\userdata-log.txt"
Add-Content -Path $logFile -Value "User data executed at: $timestamp"
</powershell>
EC2 インスタンスの起動完了後、Systems Manager フリートマネージャーのファイルシステムから userdata-log.txt が作成されていることを確認します。

04. EC2 インスタンスの再起動
手順 03 で作成した EC2 インスタンスを停止、開始してユーザーデータが実行されることを確認します。


再度 Systems Manager フリートマネージャーのファイルシステムから userdata-log.txt を確認し、内容が上書きされていることを確認します。

手順 03 での EC2 インスタンス作成時にユーザーデータで <persist>true</persist> を定義したため、EC2 インスタンスの再起動時にもユーザーデータが実行されることを確認できました。
まとめ
今回は Amazon EC2 Windows Server で再起動時にもユーザーデータを実行する方法を紹介しました。
どなたかの参考になれば幸いです。
Discussion