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

# ０．はじめに

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

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

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

# １．CloudWatch Events のルールを作成する

1. CloudWatch Events のコンソールにアクセスし、「ルールの作成」を押下します。
    * [CloudWatch Management Console](https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#rules:)
<br><br>
    * <img width="640" alt="0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/24752ab7-af9b-b35d-9614-2385fa229876.png">
<br><br>
1. 「ステップ 1: ルールの作成」画面が表示されるので、以下の項目を設定し、「設定の詳細」ボタンを押下します。
    * イベントソース : ※任意。今回は、スケージュールドリブンの設定を例として記載。
        * ● 「スケジュール」
            * Cron 式 : 「45 15 * * ? *」　※日本時間で、毎日 00:45 に実行。
            * <font color="red"><b>※ UTC なので注意!!</b></font>
    * ターゲット : 「SSM Run Command」
        * ドキュメント : 「AWS-RunPowerShellScript (Windows,Linux)」
        * ターゲットキー : 「InstanceIds」
        * ターゲット値 : ※実行先の EC2 のインスタンス ID
        * パラメータの設定 : 
            * ● 「定数」
            * Commands : ※実行する Windows バッチスクリプト (フルパス)
                * 例) 「C:\xxxx\xxxx.bat」
            * WorkingDirectory : ※Windows バッチスクリプトの実行ディレクトリ (フルパス)
                * 例) 「C:\xxxx\」
            * ExecutionTimeout : ※任意
        * ロール : ※任意。今回は、新しいロールを作成。
            * ● 「この特定のリソースに対して新しいロールを作成する」
                * 例) 「SSMRunCommand-MaintenanceEC2」
                * <font color="red"><b>※ IAM ロールと IAM ポリシーをきちんと管理しておきたいのであれば、デフォルトのままにしておかない方がいいかも。</b></font>
                * <font color="red"><b>※ あと、後述しますが、IAM のコンソールから同様のロールを作成出来なかったので、注意です。</b></font>
<br><br>
    * <img width="640" alt="0002.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/54d87543-daab-f82b-0d53-28a43ca9da77.png">
<br><br>
1. 「ステップ 2: ルールの詳細を設定する」画面が表示されるので、以下の項目を設定し、「ルールの作成」ボタンを押下します。
    * 名前 : ※任意
    * 説明 : ※任意
<br><br>
    * <img width="640" alt="0003.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/908317e6-c1a5-f8c7-7eef-38f6f87ecc9d.png">

# ２．IAM ポリシーの作り直し

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

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

1. IAM ポリシーのコンソールにアクセスし、自動で作成された IAM ポリシーを確認します。IAM ロールと同じ名前になっているはずです。
    * [IAM Management Console](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/policies)
<br><br>
1. 確認すると、以下の様になっていると思います。

    ```json
{
    "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"
            ]
        }
    ]
}
    ```
<br>
1. IAM ポリシーのコンソールから「ポリシーの作成」ボタンを押下し、以下の内容の IAM ポリシーを作成します。
    * ※ EC2のインスタンスID (i-〜) を「*」に変更しただけ。

    ```json
{
    "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"
            ]
        }
    ]
}
    ```
<br>
1. IAM ロールのコンソールにアクセスし、自動で作成された IAM ロールにおいて、古い IAM ポリシーをデタッチし、新しく作り直した IAM ポリシーをアタッチします。
    * [IAM Management Console](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles)
<br><br>
1. 古い IAM ポリシーを削除します。

# ９９．ハマりポイント

* ハマったのは、IAM ロールと IAM ポリシーのところです。CloudWatch Events のルール作成時に IAM ロールを作成するのが嫌で、IAM のコンソールから色々試したんですが、どうにもうまくいきませんでした…。
<br><br>
* どなたか、教えて頂けると非常に助かります…。
<br><br>
* あと、別の投稿に記載しましたが、ログの確認にもハマってかなりの時間を無駄にしました。
    * [CloudWatch Events から実行された SSM RunCommand や Lambda のログについて \- Qiita](https://qiita.com/kusokamayarou/items/6e1ee054ecae437dadaa)

# ＸＸ．まとめ

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

参考になれば。

* ※参考
    * [AWS CloudWatch で、Amazon EC2 Windows インスタンスのパフォーマンスとログの監視をしてみる \- Qiita](https://qiita.com/kusokamayarou/items/261efb81d91137ae8321)
    * [AWS CloudWatch で、Amazon Linux のパフォーマンスとログの監視をしてみる \- Qiita](https://qiita.com/kusokamayarou/items/b59d34b0ee0f8ff544c1)