Open5

AWS Systems Managerでオンプレミスの非サーバーマシンを管理

Makio TsukamotoMakio Tsukamoto

なにをするのか

オンプレミスの非サーバーマシンをSystems Managerの管理ノードにできるか試してみる。

具体的には

以下のオンプレミスのサーバーマシンを対象にしたSystems Managerでの管理方法情報をもとに、オンプレミスのWindows 11マシン(普通の個人端末)を管理対象にしてみる。

Makio TsukamotoMakio Tsukamoto

ロールの作成

IAM サービスロール (コンソール)を作成 - ステップ 1: ハイブリッドおよびマルチクラウド環境に IAM サービスロールを作成する - AWS Systems Manager」を行う。

  • 信頼するエンティティは AWSのサービス > Systems Manager
  • アクセス許可は AmazonSSMManagedInstanceCore ポリシーを付与。必要に応じて CloudWatchAgentServerPolicyAmazonSSMDirectoryServiceAccess なども。
  • ロール名は任意で、ここでは onpremise-ssm-instanceCore とした。

上記構成からすると、EC2インスタンスをSSM管理するためロールの構成と同じなので、すでにあればそれを使っても構わなそう。また次のステップで自動作成させることもできて、その場合のロール名は AmazonEC2RunCommandRoleForManagedInstances になる様子。

Makio TsukamotoMakio Tsukamoto

アクティベーションの作成

アクティベーションを作成する (コンソール) - ステップ 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 でインスタンスを管理できるようになりました。 詳細情報はこちらをご覧ください

Makio TsukamotoMakio Tsukamoto

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 を使用します。

Makio TsukamotoMakio Tsukamoto

共有クレデンシャルの期限切れ

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.

引き続き調査中。