こんにちは。 Liquidインフラチームの上原です。
この記事では、EC2 for Windows ServerをSystems Managerで運用する際に困った話と、
その解決策についてご紹介します。
背景
LiquidではインフラにAWSを採用しております。
私が入社して数ヶ月が経ったある日、こんなタスクが舞い込んできました。
「Windows Serverインスタンスで稼働しているソフトウェアがあり、運用を引き継いでほしい」
「ソフトウェアのライセンスがMACアドレスに紐付いておりインスタンスの使い捨てができない*1」
「Dockerで動かせないため、ECSへの移行は不可」
いろいろと複雑ですが、要するに「Windows ServerのEC2インスタンスを本格運用してほしい」という内容です。EC2インスタンスをきっちり管理するには…資格試験で勉強した内容を思い出した私は、Systems Managerを導入することに決めました。
Systems Manager
Systems Manager(通称SSM)は、EC2インスタンスとオンプレミスサーバを運用するための便利機能を詰め合わせたサービスです。SSMエージェントをインスタンスにインストールしておくことで、パッチ適用・ログ収集・ssh接続などの操作がAWSの機能として使えるようになります。
非常に有用なサービスではあるのですが、早速つまずきやすいポイントが…
「マネージドノード(インスタンス)がありません」
SSMの管理下に置かれたインスタンスは、フリートマネージャーと呼ばれる機能で一覧表示されます。
ところが、稼働しているはずのインスタンスが表示されないことがあります。
この場合、SSMがインスタンスを認識するための条件を満たしていないと考えられます。
ということで、本記事ではフリートマネージャーにWindows Serverインスタンスが表示される条件と、それを満たすための対策についてまとめていきます。
なお、オンプレミスサーバは本説明の対象外となりますのでご了承ください。
SSMがインスタンスを認識する条件
SSMがインスタンスを認識する条件として、以下が挙げられます。
順に見ていきましょう。
インスタンス内でSSMエージェントが稼働していること
AWSが所有するAMIから作成した場合、SSMエージェントはデフォルトでインストールされています。
古いインスタンスでもない限りは問題にならないと思いますが、念のため、インスタンス内でPowerShellコマンドを実行して動作確認をしてみましょう。
Get-Service AmazonSSMAgent
エラーが発生した場合、公式ドキュメントに従って手動でインストールしてください。
インストール後や設定変更後は、エージェントを再起動しておくと良さそうです。
Restart-Service AmazonSSMAgent
インスタンスにIAMロールが付与されていること
インスタンスがSSMとやり取りできるように、適切なIAMロールをインスタンスプロファイルとして付与する必要があります。
ログ収集も行う場合、必要なポリシーは以下の2つです。
- AmazonSSMManagedInstanceCore*2
- CloudWatchAgentServerPolicy
状況に応じて他のポリシーが必要になる可能性がありますので、詳しくは公式ドキュメントを確認してください。
SSMエンドポイント・インスタンスメタデータサービスと疎通できること
もっとも引っかかりやすいところです。
私のケースでは、インスタンスが表示されなかったのはネットワーク周りが原因でした。
以下は私が実施した作業手順ですが、最新の手順は公式ページから確認してください。
まず、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でルートを追加することで解決できました。
Import-Module c:\ProgramData\Amazon\EC2-Windows\Launch\Module\Ec2Launch.psm1 ; Add-Routes
おわりに
以上の対策により、最終的にすべてのインスタンスをSSMの管理下に置くことができました。
これにより、アップデートの管理がとても簡単になったり、踏み台サーバを使わずに接続できるようになったりと様々なメリットが得られたのですが…それはまた、別の記事でご紹介できればと思います。