Windows EC2 のユーザーデータで AWS Systems Manager API を使用する際の注意点

Windows EC2 のユーザーデータで AWS Systems Manager API を使用する際の注意点

Clock Icon2025.02.12

こんにちは。テクニカルサポートチームの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 を有効化し、起動する必要があります。
ユーザーデータを利用する際は、スクリプトの実行順序に注意し、適切な処理を行うようにしましょう。

本記事が同様の問題に直面した方の参考になれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-tasks
https://dev.classmethod.jp/articles/ec2-usedata-and-systemsmanager-using-cloudwatchsetup/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.