EventBridge Scheduler で EC2 の起動・終了をスケジューリング

EventBridge Scheduler で EC2 の起動・終了をスケジューリング

岩佐 孝浩
岩佐 孝浩
4 min read
EventBridge Scheduler

AWS を日常業務で使用している方は多いと思いますが、 EC2 インスタンスを起動すると、停止するまで費用が発生します。

EventBridge Scheduler を使用すると、アプリケーションのコードを書く必要がなく、 EC2 インスタンスの起動と停止プロセスを自動化できます。

さらに、 EventBridge Scheduler は、月間で最大 14,000,000 回の起動まで追加コストなしで利用できます。

この投稿では、例を用いて EventBridge Scheduler の利用方法を説明します。

EC2 Instance 起動

<SECURITY_GROUP_IDS><SUBNET_ID> を実際の値に置換して、以下のコマンドで、テスト用の EC2 インスタンスを起動してください。

aws ec2 run-instances \
--image-id ami-0f9fe1d9214628296 \
--count 1 \
--instance-type t2.micro \
--security-group-ids <SECURITY_GROUP_IDS> \
--subnet-id <SUBNET_ID>

AWS Resources 作成

以下の内容で CloudFormation テンプレートを作成してください。

AWSTemplateFormatVersion: '2010-09-09'
Description: EC2 scheduler

Parameters:
  Prefix:
    Type: String
    Default: ec2-scheduler
  InstanceIds:
    Type: String
    Description: '"i-1234567890abcdefg", "..."'
  ScheduleStartExpression:
    Type: String
    Default: 'cron(0 7 * * ? *)'
  ScheduleStopExpression:
    Type: String
    Default: 'cron(0 22 * * ? *)'
  ScheduleTimezone:
    Type: String
    Description: IANA timezone identifier. For the full list, refer to https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
    Default: UTC
    AllowedValues:
      - UTC
      - Japan

Resources:
  ScheduleStart:
    Type: AWS::Scheduler::Schedule
    Properties:
      Name: !Sub ${Prefix}-schedule-start
      ScheduleExpression: !Ref ScheduleStartExpression
      ScheduleExpressionTimezone: !Ref ScheduleTimezone
      FlexibleTimeWindow:
        Mode: 'OFF'
      State: ENABLED
      Target:
        Arn: arn:aws:scheduler:::aws-sdk:ec2:startInstances
        Input: !Sub |-
          {
            "InstanceIds": [${InstanceIds}]
          }
        RoleArn: !GetAtt Role.Arn

  ScheduleStop:
    Type: AWS::Scheduler::Schedule
    Properties:
      Name: !Sub ${Prefix}-schedule-stop
      ScheduleExpression: !Ref ScheduleStopExpression
      ScheduleExpressionTimezone: !Ref ScheduleTimezone
      FlexibleTimeWindow:
        Mode: 'OFF'
      State: ENABLED
      Target:
        Arn: arn:aws:scheduler:::aws-sdk:ec2:stopInstances
        Input: !Sub |-
          {
            "InstanceIds": [${InstanceIds}]
          }
        RoleArn: !GetAtt Role.Arn

  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${Prefix}-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - scheduler.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: ec2
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - ec2:StartInstances
                  - ec2:StopInstances
                Resource: !Sub arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:instance/i-*

<INSTANCE_ID> を実際の値で置換して、以下のコマンドで CloudFormation スタックをデプロイしてください。

aws cloudformation deploy \
--template-file ./template.yaml \
--stack-name ec2-scheduler \
--parameter-overrides InstanceIds='"<INSTANCE_ID1>", "<INSTANCE_ID2>"' \
--capabilities CAPABILITY_NAMED_IAM

動作確認

プロビジョニングされた EventBridge Scheduler は、 EC2 インスタンスを午前7時に起動し、午後10時に停止します。 スケジューリング時刻を変更したい場合、 CloudFormation スタックのデプロイ時に ScheduleStartExpressionScheduleStopExpression を指定してください。

EC2 インスタンスが、想定通りに起動・停止していることをご確認ください。

クリーンアップ

以下のコマンドを使用して、プロビジョニングされた AWS リソースを削除してください。

aws ec2 terminate-instances --instance-ids <INSTANCE_IDS>
aws cloudformation delete-stack --stack-name ec2-scheduler

まとめ

開発用として一時的に EC2 を利用している場合、 EventBridge Scheduler でコストの削減が可能です。

EventBridge Scheduler は、 EC2 以外のサービスのアクションも実行可能なので、定期的メンテナンスの自動化等にも活用できます。

この投稿が、お役に立てば幸いです。

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023