Systems ManagerがWindows Serverインスタンスを認識してくれないときの対処法

こんにちは。 Liquidインフラチームの上原です。

この記事では、EC2 for Windows ServerSystems Managerで運用する際に困った話と、
その解決策についてご紹介します。

背景

LiquidではインフラにAWSを採用しております。
私が入社して数ヶ月が経ったある日、こんなタスクが舞い込んできました。

Windows Serverインスタンスで稼働しているソフトウェアがあり、運用を引き継いでほしい」
「ソフトウェアのライセンスがMACアドレスに紐付いておりインスタンスの使い捨てができない*1
「Dockerで動かせないため、ECSへの移行は不可」

いろいろと複雑ですが、要するに「Windows ServerのEC2インスタンスを本格運用してほしい」という内容です。EC2インスタンスをきっちり管理するには…資格試験で勉強した内容を思い出した私は、Systems Managerを導入することに決めました。

Systems Manager

Systems Manager(通称SSM)は、EC2インスタンスとオンプレミスサーバを運用するための便利機能を詰め合わせたサービスです。SSMエージェントをインスタンスにインストールしておくことで、パッチ適用・ログ収集・ssh接続などの操作がAWSの機能として使えるようになります。

非常に有用なサービスではあるのですが、早速つまずきやすいポイントが…  
 

f:id:liquid-tech:20220207173418p:plain

「マネージドノード(インスタンス)がありません」  
 
 
 
 
 
SSMの管理下に置かれたインスタンスは、フリートマネージャーと呼ばれる機能で一覧表示されます。
ところが、稼働しているはずのインスタンスが表示されないことがあります。
この場合、SSMがインスタンスを認識するための条件を満たしていないと考えられます。

ということで、本記事ではフリートマネージャーにWindows Serverインスタンスが表示される条件と、それを満たすための対策についてまとめていきます。
なお、オンプレミスサーバは本説明の対象外となりますのでご了承ください。

SSMがインスタンスを認識する条件

SSMがインスタンスを認識する条件として、以下が挙げられます。

aws.amazon.com

順に見ていきましょう。

インスタンス内でSSMエージェントが稼働していること

AWSが所有するAMIから作成した場合、SSMエージェントはデフォルトでインストールされています。
古いインスタンスでもない限りは問題にならないと思いますが、念のため、インスタンス内でPowerShellコマンドを実行して動作確認をしてみましょう。

Get-Service AmazonSSMAgent

エラーが発生した場合、公式ドキュメントに従って手動でインストールしてください。

docs.aws.amazon.com

インストール後や設定変更後は、エージェントを再起動しておくと良さそうです。

Restart-Service AmazonSSMAgent

インスタンスにIAMロールが付与されていること

インスタンスがSSMとやり取りできるように、適切なIAMロールをインスタンスプロファイルとして付与する必要があります。
ログ収集も行う場合、必要なポリシーは以下の2つです。

  • AmazonSSMManagedInstanceCore*2
  • CloudWatchAgentServerPolicy

状況に応じて他のポリシーが必要になる可能性がありますので、詳しくは公式ドキュメントを確認してください。

docs.aws.amazon.com

SSMエンドポイント・インスタンスメタデータサービスと疎通できること

もっとも引っかかりやすいところです。
私のケースでは、インスタンスが表示されなかったのはネットワーク周りが原因でした。
以下は私が実施した作業手順ですが、最新の手順は公式ページから確認してください。

aws.amazon.com

まず、AWSが提供するエンドポイントサービスへの疎通を確認します。
PowerShellで以下のコマンドを実行してください。

Test-NetConnection ssm.ap-northeast-1.amazonaws.com -port 443
Test-NetConnection ec2messages.ap-northeast-1.amazonaws.com -port 443
Test-NetConnection ssmmessages.ap-northeast-1.amazonaws.com -port 443

結果がFalseとなった場合、セキュリティグループやproxyサーバなどによって443番ポートのアウトバウンドが遮断されていないかを確認してください。

続いてインスタンスメタデータサービスとの疎通を確認します。
これは、SSMエージェントがインスタンスの情報を取得する際に利用されるサービスです。
以下のコマンドをPowerShellで実行してください。

Test-NetConnection 169.254.169.254 -port 80

結果がFalseになった場合、サービスとの疎通ができていません。 この問題は、EC2Launchでルートを追加することで解決できました。

aws.amazon.com

Import-Module c:\ProgramData\Amazon\EC2-Windows\Launch\Module\Ec2Launch.psm1 ; Add-Routes

おわりに

以上の対策により、最終的にすべてのインスタンスをSSMの管理下に置くことができました。

これにより、アップデートの管理がとても簡単になったり、踏み台サーバを使わずに接続できるようになったりと様々なメリットが得られたのですが…それはまた、別の記事でご紹介できればと思います。

*1:「ライセンスがMACアドレスに紐づくソフトウェアをスケーラブルに運用する方法」はAWS資格試験の頻出問題だったりします(あるあるなのか…?)。正解は「AWS ENIを予め複数作っておいて、オートスケール時にLambda等でアタッチする」なのですが、今回はそこまでシビアな要件ではなかったため、スタンバイ機をいくつか寝かせて手動で立ち上げています

*2:以前は AmazonEC2RoleforSSM というポリシーが使われていましたが、権限が強すぎるためいまは非推奨となっています