CloudWatch Events から Systems Manager 経由で Windows バッチを実行してみる


0.はじめに

これまで、ジョブ管理に「Zabbix」の Add-On の「Job Arranger for Zabbix」というものを使って、Windows バッチを定期実行していましたが、

出来れば AWS 内で完結出来ないかなぁ、と考えていて、

どうやら CloudWatch Events → SSM RunCommand で出来るみたいなので試してみました。

1.CloudWatch Events のルールを作成する

  1. CloudWatch Events のコンソールにアクセスし、「ルールの作成」を押下します。
  2. 「ステップ 1: ルールの作成」画面が表示されるので、以下の項目を設定し、「設定の詳細」ボタンを押下します。
    • イベントソース : ※任意。今回は、スケージュールドリブンの設定を例として記載。
      • ● 「スケジュール」
        • Cron 式 : 「45 15 * * ? *」 ※日本時間で、毎日 00:45 に実行。
        • ※ UTC なので注意!!
    • ターゲット : 「SSM Run Command」
      • ドキュメント : 「AWS-RunPowerShellScript (Windows,Linux)」
      • ターゲットキー : 「InstanceIds」
      • ターゲット値 : ※実行先の EC2 のインスタンス ID
      • パラメータの設定 :
        • ● 「定数」
        • Commands : ※実行する Windows バッチスクリプト (フルパス)
          • 例) 「C:\xxxx\xxxx.bat」
        • WorkingDirectory : ※Windows バッチスクリプトの実行ディレクトリ (フルパス)
          • 例) 「C:\xxxx\」
        • ExecutionTimeout : ※任意
      • ロール : ※任意。今回は、新しいロールを作成。
        • ● 「この特定のリソースに対して新しいロールを作成する」
          • 例) 「SSMRunCommand-MaintenanceEC2」
          • ※ IAM ロールと IAM ポリシーをきちんと管理しておきたいのであれば、デフォルトのままにしておかない方がいいかも。
          • ※ あと、後述しますが、IAM のコンソールから同様のロールを作成出来なかったので、注意です。



  3. 「ステップ 2: ルールの詳細を設定する」画面が表示されるので、以下の項目を設定し、「ルールの作成」ボタンを押下します。
    • 名前 : ※任意
    • 説明 : ※任意

2.IAM ポリシーの作り直し

自動で作成された IAM ポリシーを参考に別の IAM ポリシーを作成し、IAM ロールにアタッチし、元の IAM ポリシーをデタッチ・削除します。

※ IAM ロールと IAM ポリシーを毎回作成しても良いのであれば、当手順は不要ですので、飛ばして下さい。

  1. IAM ポリシーのコンソールにアクセスし、自動で作成された IAM ポリシーを確認します。IAM ロールと同じ名前になっているはずです。
  2. 確認すると、以下の様になっていると思います。

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ssm:SendCommand",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:********:instance/[EC2のインスタンスID]",
                "arn:aws:ssm:ap-northeast-1:*:document/AWS-RunPowerShellScript"
            ]
        }
    ]
    }
    


  3. IAM ポリシーのコンソールから「ポリシーの作成」ボタンを押下し、以下の内容の IAM ポリシーを作成します。

    • ※ EC2のインスタンスID (i-〜) を「*」に変更しただけ。
    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ssm:SendCommand",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:********:instance/*",
                "arn:aws:ssm:ap-northeast-1:*:document/AWS-RunPowerShellScript"
            ]
        }
    ]
    }
    


  4. IAM ロールのコンソールにアクセスし、自動で作成された IAM ロールにおいて、古い IAM ポリシーをデタッチし、新しく作り直した IAM ポリシーをアタッチします。

  5. 古い IAM ポリシーを削除します。

99.ハマりポイント

  • ハマったのは、IAM ロールと IAM ポリシーのところです。CloudWatch Events のルール作成時に IAM ロールを作成するのが嫌で、IAM のコンソールから色々試したんですが、どうにもうまくいきませんでした…。

  • どなたか、教えて頂けると非常に助かります…。

  • あと、別の投稿に記載しましたが、ログの確認にもハマってかなりの時間を無駄にしました。

XX.まとめ

CloudWatch に関しては、
EC2 の運用・メンテナンスに絡んで、色々と試したことが他にもあるので、また別の投稿あげようかと思います。

参考になれば。