Closed8

EventBridge Schedulerを使ってEC2の起動停止を行う(できればCFnまで)

not75743not75743

EventBridge Schedulerとは?

定期的または1回限りのタスクを実行することができる機能
タイムゾーンの指定が可能
いままではEventBridge Rule + Lambdaとかでやっていたものが一度で出来るようになった

参考

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/scheduler.html
https://dev.classmethod.jp/articles/amazon-eventbridge-scheduler-new-way-to-launch-tasks/
https://business.ntt-east.co.jp/content/cloudsolution/ih_column-08.html

not75743not75743

やってみる

前提

EC2はある

ポイント

  • スケジュールグループが必要であれば事前に作成する。ルールの所属を分割したい場合などに有効
  • スケジュールは
    • 一度限り
    • 繰り返し
      • レートベース(〜分おき、〜時間に1回)
      • cron(cron式を使って細かく設定可能)
        • 最小は1分
  • 毎日12:30に実行するには以下のようにする
30 10 * * ? *
  • schedulerが実行するAPIとその対象を選択する
    • EC2を停止するため、Service:EC2、API:stopinstancesを指定する
    • ターゲットの選択はjson形式で行われる。stopinstancesの場合はこのようになった
{ "InstanceIds": [ "<instanceid>" ] }
not75743not75743

続き

IAMロール

schedulerがAPIを叩くための権限を設定する。
信頼ポリシーは

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

のようにし、ポリシーはEC2の停止起動が出来るものであればよい

not75743not75743

停止したログ

cloudtrailからeventbridgeが停止したログを確認できる
Event name > Stopinstances
でフィルタすればよい

not75743not75743

実行時間

  • 11時に起動するように設定
  • フレックスタイムウインドウは使用しない

の設定で11時0分50秒にschedulerが起動した。
ピッタリは無理だが、1分ほどのラグが許容できればOKか

not75743not75743

cloudformationをつくる

今度は起動版をCFnで作ります。
こちらが大変参考にさせていただきました。(というよりまんま)
https://dev.classmethod.jp/articles/cloudformation-template-eventbridge-scheduler-ec2-start-stop/

---
AWSTemplateFormatVersion: '2010-09-09'
Description:  EventBridge Scheduler to start/stop EC2 instance
Parameters:
  InstanceId:
    Type: AWS::EC2::Instance::Id
  ScheduleStartTime:
    Type: String
    Default: "cron(50 14 * * ? *)"
  ScheduleTimezone:
    Type: String
    Default: Japan
Resources:
  SchedulerEC2StopStartRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - scheduler.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: EC2StopStart
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - ec2:StartInstances
                Resource:
                  - "*"
  ScheduleEC2Start:
    Type: AWS::Scheduler::Schedule
    Properties:
      Name: !Sub 'EC2-Start-${InstanceId}'
      Description: Start EC2 Instance
      ScheduleExpression: !Ref ScheduleStartTime 
      ScheduleExpressionTimezone: !Ref ScheduleTimezone
      FlexibleTimeWindow:
        Mode: "OFF"
      State: ENABLED
      Target:
        Arn: arn:aws:scheduler:::aws-sdk:ec2:startInstances
        Input: !Sub |-
          {
            "InstanceIds": ["${InstanceId}"]
          }
        RoleArn:
          Fn::GetAtt:
          - SchedulerEC2StopStartRole
          - Arn

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html

not75743not75743

課題

  • タグで対象を指定できないこと
    • これでlambdaをキックすればよいか...
  • ログはcloudtrailを見ることが前提であること
このスクラップは2023/06/03にクローズされました