🎼

EC2(Windows)でユーザーデータを利用するノウハウ

2022/05/08に公開

はじめに

ユーザーデータって便利ですよね。個人的にはOSの外で設定管理できるのが柔軟でいいなって思ってます。
以前からLinux OSのEC2ではよく利用してたんですが、Windows OSで利用する機会があったので個人的なノウハウをまとめました。

基本的な使用方法

公式ドキュメントと被るんですが一応
Linuxのケース同様、所定のテキストをセットしてあげればOKです。バッチスクリプト(bat)もPowershellスクリプトも使えます。

バッチスクリプトの場合

<script></script>で囲ったテキストを用意。

<script>
echo %DATE% %TIME%
</script>

PowerShellの場合

<powershell></powershell>で囲ったテキストを用意。

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

複合記述したい場合(未検証)

ドキュメント上の情報では、上記ブロックは1つのユーザーデータtxt上に同居させることができるようです(未検証)。
留意点として、実行順はブロックの記述順に関わらず下記とのこと。

  1. バッチスクリプト
  2. PowerShell

停止→起動や再起動時にも実行してほしい場合

普通はlaunch時にしか実行されませんが、
下記のようにブロック下に<persist>true</persist>を指定を記述すると、再起動や停止からの起動でも実行されます。

<script>
echo %DATE% %TIME%
</script>
<persist>true</persist>

(これ複合指定だと効き方ってどうなるんすかね?気分が乗ったら試します)

デバッグに利用できるリソース(ログ 等)

実行ログ格納先(EC2Launchの場合)

EC2Configの場合はまた別なようです(公式に載ってそう/丸投げ)

この辺をCloudwatch Logsで出してあげると管理とかにお便利でしょう。

実行ログpath C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log

スクリプトファイル配置先

想定の動作しなくてなんぞ???ってなったときにローカル実行して試すのに便利です。

スクリプトファイルpath C:\Windows\Temp\UserScript[.bat/.ps1]

Tips

[bat]remでコメントしつつ文字列出力

remの一番の存在理由はコメント用途ですが、バッチスクリプトでは(設定によっては無効になってるらしいが)基本echoと同じ動きになってくれるので、前述のログ出力等いろいろ使える場面が多い。

下記の例では、rem %DATE% %TIME%の実行結果はecho %DATE% %TIME%と同じになります。

<script>
rem Userdata Command
rem =======Start Command date and time=======
rem %DATE% %TIME%
rem =======END Command date and time=======
rem %DATE% %TIME%
</script>

[bat]外部バッチスクリプトを呼び出す場合、callをつける

呼び出す場合は先頭にcallを書くのを忘れずに。

下記はスクリプトの中でa.batというファイルを実行する場合の例です。

<script>
rem Userdata Command
rem =======Start Command date and time=======
rem %DATE% %TIME%
call "C:\path_to_bat_file\a"
rem =======END Command date and time=======
rem %DATE% %TIME%
</script>

callを記載しなかった場合、そこから下の行は実行されません。

EC2ユーザーデータに限らず、バッチスクリプトくん(以下batくん)の中でbatくんを単純にお呼び出しすると、呼び出されたbatくんの実行後に呼び出し元のbatくんに処理が戻らず終了してしまい、後続の記述内容は実行されないことになる、ということのようです。

おわりに(無関係)

今回「全編Powershell上映の予定だったが、実装の途中で実行したいファイルが.batだったと判明した」という事情がありました。なのでユーザーデータというよりほぼバッチスクリプトの話になってたかも知れません。

WindowsのシェルはLinuxシェルとはいろいろ勝手が違いますね。誰かのお役に立てば幸いです。

参考文献

Windows インスタンスでの起動時のコマンドの実行 - Amazon Elastic Compute Cloud

rem | Microsoft Docs

Discussion