[AWS] CloudWatchでEC2の自動起動・停止をスケジュールする

2020-01-14環境AWS

CloudWatch Events の設定だけで、スケジュールされた日時に EC2 インスタンスを自動で起動・停止する方法。

テストで使っている EC2 インスタンスを終業時に自動で停止させたかった。ググると Lambda を使った方法が出てくるけど、 CloudWatch Events でルールを設定するだけでできた。

自動停止の設定方法

  1. CloudWatch コンソール画面から「ルール」をクリック
  2. ルール画面から「ルール作成」ボタンをクリック
  3. [イベントソース]のとこで、「スケジュール」を選択
  4. 「 Cron 式」を選択し、停止スケジュールを記入
    * スケジュールは UTC タイムゾーンで記入する
    * Cron 式の書き方は「 Cron 式の構文」の項を参照
  5. [ターゲット]のとこで、「ターゲットの追加」ボタンをクリック
  6. EC2 StopInstances API 呼び出し」を選択
  7. 「インスタンス ID* 」を入力
  8. (ロールがなければ)「この特定のリソースに対して新しいロールを作成する」を選択
    * 新しくロールが作成される
  9. 「設定の詳細」ボタンをクリック
    create rules for scheduled stop ec2 on aws cloudwatch event
  10. 「名前」、「説明」を入力し、「ルールの作成」ボタンをクリック

自動起動の設定方法

「ターゲットの追加」の際、[この特定のリソースに対して新しいロールを作成する]を選択してロールを新規作成すると、下記のエラーが出るので IAM ロールを自分で作る。

The Automation definition used by an SSM Automation target must contain an AssumeRole which evaluates to an IAM arn.

IAM ロール作成

AWS 管理ポリシーを使った簡単版と、カスタムポリシーを作るカスタム版を試した。

簡単編

デフォルトで用意されている AWS 管理ポリシー [ AmazonSSMAutomationRole ] を使う方法。

  1. IAM コンソール画面から「ロール」→「ロールの作成」をクリック
    creating role for CloudWatch event
  2. [このロールを使用するサービスを選択] から「 EC2 」を選択し、「次のステップ:…」をクリック
  3. AmazonSSMAutomationRole」を選択し、「次のステップ:…」をクリック
    chose IAM policies for cloudwatch event role
  4. タグ、ロール名、ロールの説明を入力し、ロールを作成する
  5. ロール一覧から、作成したロールを選択し、[信頼関係]タブ → 「信頼関係の編集」
    add trusted entity on IAM role
  6. ポリシードキュメントに “events.amazonaws.com" を追加し、「信頼ポリシーの更新」をクリック
    <ポリシードキュメント>
"Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "events.amazonaws.com",
          "ec2.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

カスタム編

[ AmazonSSMAutomationRole ]ポリシーには EC2 自動起動に必要のない権限も含まれているため、必要な権限だけを付与するカスタムポリシーを作成し、使う方法。

カスタムポリシーを作成する。

IAM コンソール画面 → ポリシー画面から [ AmazonSSMAutomationRole ] ポリシーを確認する。
このポリシーを雛形に。いらない部分を削除してカスタムポリシーに使う。
EC2 自動起動だけなら、 Action"ec2:StartInstances" があれば動く。
通知が不要なら "sns:Publish" もいらない。

< AmazonSSMAutomationRole ポリシー>

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:*:function:Automation*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateImage",
                "ec2:CopyImage",
                "ec2:DeregisterImage",
                "ec2:DescribeImages",
                "ec2:DeleteSnapshot",
                "ec2:StartInstances",
                "ec2:RunInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances",
                "ec2:DescribeInstanceStatus",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:DescribeTags",
                "cloudformation:CreateStack",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteStack"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": [
                "arn:aws:sns:*:*:Automation*"
            ]
        }
    ]
}
  1. ポリシー画面から、「ポリシーの作成」をクリック
  2. ポリシーを作成
    ビジュアルエディタで必要なサービスを選択していってもいいし、[ AmazonSSMAutomationRole ]ポリシーから不要なものを削除した JSON を入力でもいい。
  3. 「ポリシーの確認」 → 名前・説明を入力しポシリーを作成する

< EC2 自動起動用カスタムポリシー>

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:*:function:Automation*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

IAM ロールを作成する。

  1. IAM コンソール画面から「ロール」→「ロールの作成」をクリック
  2. [このロールを使用するサービスを選択] から「 EC2 」を選択し、「次のステップ:…」をクリック
  3. [ポリシーのフィルタ]から「ユーザーによる管理」を選択し、今作ったカスタムポリシーを選択し、「次のステップ:…」をクリック
    select custom policy on creating IAM role page
  4. タグ、ロール名、ロールの説明を入力し、ロールを作成する
  5. 作成したロールをクリック → [信頼関係]タブ → 「信頼関係の編集」で “events.amazonaws.com" を追加

CloudWatch Events の設定

CloudWatch Events の設定は、自動停止の[ステップ 1: ルールを作成する]画面の[ターゲット]のとこの設定が変わるだけなので、その他は自動停止と同じ手順。

  1. [ターゲット]のとこで、「ターゲットの追加」ボタンをクリック
  2. SSM Automation 」を選択
  3. 「ドキュメント* 」で 「 AWS-StartEC2Instance 」を選択
  4. 「定数」を選択し、「 InstanceId* 」を入力
  5. [既存のロールを使用]を選択し、作成したロールを選択
    setting targets on CloudWatch Event Creation Rules
  6. 「設定の詳細」ボタンをクリック

Cron 式の構文

Cron 式
分 時 日 月 曜日 年

に指定できる値 : 1-12 or JAN-DEC
曜日 に指定できる値 : 1-7 or SUN-SAT

曜日 の両方に値 ( * 含む) を指定することはできない。どちらかに値を指定したら、もう片方には ? を記述する。

例)
・月曜から金曜の 6:00 pm UTC に実行
0 18 ? * MON-FRI *

・毎日 9:00 am UTC に実行
0 9 * * ? *

Schedule Expressions for Rules

Posted by Agopeanuts