📝

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