Systems Manager メンテナンスウィンドウのステータスが「進行中」のまま終わらない

2021.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Systems Manager メンテナンスウィンドウを深夜に設定していましたが、日中になってもステータスが「進行中」のままでした。
原因を調査し、解決したのですが、今回はこういう時に発生し得るという情報を残しておきたいと思い、記事にしました。

先に結論

マネジメントコンソールからメンテナンスウィンドウを作成した実績がない状態で、CloudFormationでメンテナンスウィンドウを作成しテンプレート上でサービスロールを指定していた場合、サービスロールAWSServiceRoleForAmazonSSMが作成されておらず、その場合ステータスが「進行中」のままで終わらないという事象が発生しました。

問題と対策内容

深夜に開始されたメンテナンスウィンドウが日中になっても処理中のままになっていました。
メンテナンスウィンドウタスクとしては10~20秒程度で通常終わるタスク内容です。

メンテナンスウィンドウが進行中のまま残っていると、後続のメンテナンスウィンドウはキャンセルされました。

Window execution skipped, a Maintenance Window cannot run more than once concurrently

以下の記事のテンプレートを新規発行したAWSアカウントで使っていました。

  SSMMaintenanceWindowTask:
    Type: "AWS::SSM::MaintenanceWindowTask"
    Properties:
      Name: !Sub ${AWS::StackName}-maintenancewindow-task
      WindowId: !Ref SSMMaintenanceWindow
      Targets: 
        - 
          Key: "WindowTargetIds"
          Values: 
            - !Ref SSMMaintenanceWindowTarget
      TaskArn: "AWS-RunPatchBaseline"
      ServiceRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM"
      TaskType: "RUN_COMMAND"
      TaskParameters: {}
      Priority: 1
      MaxConcurrency: "50"
      MaxErrors: "0"
      TaskInvocationParameters: 
        MaintenanceWindowRunCommandParameters: 
          Parameters: 
            Operation: 
              - "Scan"
            SnapshotId: 
              - "{{WINDOW_EXECUTION_ID}}"
          TimeoutSeconds: 600

同じテンプレートを使っても動くアカウントと動かないアカウントがありました。
環境を比較してみると、原因はAWSServiceRoleForAmazonSSMロールが存在しないことでした。

通常はマネジメントコンソールからメンテナンスウィンドウを作成する際に、自動で作成されます。
新規発行アカウントに対してCloudFormationテンプレートで環境作成をしていたため、ロールが存在していませんでした。

IAMからサービスロールを新規作成することにしました。
ユースケースでSystems Manager - Inventory and Maintenance Windowsを選択します。

AmazonSSMServiceRolePolicyが自動付与され、ロール名も自動で設定されます。

ロール作成後に再度メンテナンスウィンドウを確認すると...

ステータスが無事成功になりました。

まとめ

以下のトラブルシューティングにも本件については記載がありませんでした。

エラーで終了するとわかりやすいのですが、ずっと処理中のままだったので少し切り分けに時間がかかってしまいました。
同様の事象が発生した場合は、ロールが存在するかも確認してみてください。