Windows EC2 のユーザーデータで AWS Systems Manager API を使用する際の注意点
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
EC2 インスタンス起動時のソフトウェアインストールや設定の自動化には、ユーザーデータが利用できます。
ユーザーデータを使って起動したインスタンスに対して AWS Systems Manager の API を呼び出すことも可能です。
しかし、Windows インスタンスではユーザーデータの実行順序に注意が必要です。
本記事では、発生した問題と対処方法を紹介します。
発生した問題
AWS Tools for Windows PowerShell の Send-SSMCommand
コマンドを EC2 インスタンスのユーザーデータとして実行したところ、以下のエラーが発生し、正常に実行できませんでした。
Send-SSMCommand : Instances [[i-XXXXXXXXXXXX]] not in a valid state for account XXXXXXXXXXXX
At C:\Windows\system32\config\systemprofile\AppData\Local\Temp\EC2LaunchXXXXXXXX\UserScript.ps1:5 char:19
+ $installCommand = Send-SSMCommand `
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Amazon.PowerShe...SMCommandCmdlet:SendSSMCommandCmdlet) [Send-SSMComm
and], InvalidOperationException
+ FullyQualifiedErrorId : Amazon.SimpleSystemsManagement.Model.InvalidInstanceIdException,Amazon.PowerShell.Cmdlet
s.SSM.SendSSMCommandCmdlet
このエラーは、対象の EC2 インスタンスが AWS Systems Manager によって管理されていない、または SSM Agent が起動していない場合に発生することがあります。
原因
Windows インスタンスでは、ユーザーデータのスクリプトが SSM Agent の起動前に実行されるため、Send-SSMCommand
を実行しても SSM Agent が動作しておらず、コマンドが失敗します。
対処方法
ユーザーデータ内で AWS Systems Manager の API (Send-SSMCommand) を呼び出す前に、SSM Agent を起動する必要があります。
AWS 提供の Windows AMI を利用している場合、SSM Agent のサービスはデフォルトで Disabled になっているため、サービスの有効化と起動を行う必要があります。
ユーザーデータのサンプル
以下のように、ユーザーデータ内で SSM Agent を有効化・起動してから Send-SSMCommand
を実行することで、問題を回避できます。
<powershell>
# SSM Agent のサービスを有効化
Set-Service -Name AmazonSSMAgent -StartupType Automatic
# SSM Agent を起動
Start-Service AmazonSSMAgent
# SSM コマンドを実行
Send-SSMCommand 〜
</powershell>
まとめ
Windows インスタンスでは、ユーザーデータのスクリプトが SSM Agent の起動前に実行されるため、ユーザーデータ内で AWS Systems Manager の API を呼び出す場合は、事前に SSM Agent を有効化し、起動する必要があります。
ユーザーデータを利用する際は、スクリプトの実行順序に注意し、適切な処理を行うようにしましょう。
本記事が同様の問題に直面した方の参考になれば幸いです。
参考