AWS Systems Managerでオンプレミスの非サーバーマシンを管理
なにをするのか
オンプレミスの非サーバーマシンをSystems Managerの管理ノードにできるか試してみる。
具体的には
以下のオンプレミスのサーバーマシンを対象にしたSystems Managerでの管理方法情報をもとに、オンプレミスのWindows 11マシン(普通の個人端末)を管理対象にしてみる。
ロールの作成
「IAM サービスロール (コンソール)を作成 - ステップ 1: ハイブリッドおよびマルチクラウド環境に IAM サービスロールを作成する - AWS Systems Manager」を行う。
- 信頼するエンティティは
AWSのサービス
>Systems Manager
。 - アクセス許可は
AmazonSSMManagedInstanceCore
ポリシーを付与。必要に応じてCloudWatchAgentServerPolicy
やAmazonSSMDirectoryServiceAccess
なども。 - ロール名は任意で、ここでは
onpremise-ssm-instanceCore
とした。
上記構成からすると、EC2インスタンスをSSM管理するためロールの構成と同じなので、すでにあればそれを使っても構わなそう。また次のステップで自動作成させることもできて、その場合のロール名は AmazonEC2RunCommandRoleForManagedInstances
になる様子。
アクティベーションの作成
「アクティベーションを作成する (コンソール) - ステップ 2: ハイブリッドおよび
マルチクラウド環境用のハイブリッドアクティベーションを作成する - AWS Systems Manager」を行う。
- 「アクティベーションの説明」はオプション。ここでは
HybridActivation20231001
とした。日付を入れておくのがいつもの流儀。 - 「インスタンス制限」は
1
のままにした。ローカルPCを1台だけ登録予定。 - 「IAMロール」は前のステップで作成したものを選択。
- 「アクティベーションの有効期限」は約24時間後を指定した。具体的には
2023-10-02T21:00+09:00
。+09:00
だから日本時間の21時になっているはず。
作成直後、上部に次のような通知が表示されるので、必ず消さずにアクティベーションコードをコピーすること。
新しいアクティベーションが正常に作成されました。 アクティベーションコードを以下に記載します。このコードに再度アクセスすることはできないため、コードをコピーして安全な場所に保存してください。
Activation Code XxXxxXxxXxxx9xxXxxxxX
Activation ID 999999x9-9x99-99x9-xx99-9x9x99999999
これで、amazon-ssm-agent をインストールして、Run Command でインスタンスを管理できるようになりました。 詳細情報はこちらをご覧ください
SSM(Systems Manager)エージェントの構成
「ステップ 4: ハイブリッドおよびマルチクラウド環境に SSM Agent をインストールする (Windows) - AWS Systems Manager」を行う。Windowsマシンなので、Linux用のステップ 3はとばす。
- 「3. 昇格された (管理者) モードで Windows PowerShell を開きます。」は、PowerShellを「Run as Administrator」すること。
- 「4. Windows PowerShell に以下のコマンドブロックを貼り付けます。」では、必ずまずエディタ等に張り付けて、以下の部分を更新すること。
region
は東京の場合ap-northeast-1
。$code = "activation-code" $id = "activation-id" $region = "region"
これで完了。ドキュメントには以下のように書かれているけど、この時点ですでにマネージドノードにこのマシンが表示されていた。
Fleet Manager の [マネージドノード] ページにマネージドノードを表示するには、AWS CLI コマンド describe-instance-information、または API コマンド DescribeInstanceInformation を使用します。
共有クレデンシャルの期限切れ
Systems Manager管理ノードに登録後、マシンをシャットダウンし、翌朝起動しなおたところ、Fleet Managerに管理ノードとして出てこなかった。以下を確認した。
- Windowsのサービス一覧の確認。
AmazonSSMAgent
はスタートアップの種類が「自動」で、サービスの状態も「実行中」だった。 -
SSMエージェントログの確認。errors.logに以下が出力されていた。
2023-10-02 06:53:35 ERROR [HandleAwsError @ awserr.go.50] [ssm-agent-worker] [MessageService] [MDSInteractor] error when calling AWS APIs. error details - GetMessages Error: shared credentials are already expired, they were retrieved at 2023-10-02T01:16:33+09:00 and expired at 2023-10-01T17:16:33Z
共有クレデンシャルがなにを指しているかがまだわからない。
- 「2023-10-02T01:16:33+09:00」に取得した共有クレデンシャルが「2023-10-01T17:16:33Z」に期限切れしたと言っている。
- 認証情報の期限切れと聞いてアクティベーションかなと思ったけど、早すぎる気がする。
- プライベートキーの自動ローテーションを設定してないせいかなと思ったけど、これも日単位のローテーション設定(KeyAutoRotateDays)なので、早すぎる気がする。
- 周辺のログに、以下がある。ファイル名からすると、ヘルスチェックとなっているので、関係なさそうな気もする。
2023-10-02 06:53:37 ERROR [removeMessage @ filewatcherchannel.go.225] [amazon-ssm-agent] Error occurred while removing the IPC file: remove C:\ProgramData\Amazon\SSM\InstanceData\mi-0859f379aca79d3ff\channels\health\surveyor-20231001211632-245: The process cannot access the file because it is being used by another process.
- 周辺のログに、以下がある。気になる。
2023-10-02 06:53:52 ERROR [collectDataUsingServerManager @ dataProvider.go.282] [ssm-document-worker] [b49cc9a1-feec-4b2a-b125-0db519e47fd8.2023-10-01T21-53-35.666Z] [DataBackend] [pluginName=aws:softwareInventory] [aws:softwareInventory] Error executing command - Command failed with error: Servermanagercmd.exe : The term 'Servermanagercmd.exe' is not recognized as the name of a cmdlet, function, script file , or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
引き続き調査中。