EventBridge Scheduler を使った EC2 インスタンススケジューリングの自動化

EventBridge Scheduler を使った EC2 インスタンススケジューリングの自動化

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

はじめに

多くの AWS ユーザーは日々のタスクで EC2 インスタンスを頻繁に利用しています。しかし、一度これらのインスタンスを起動すると、明示的に停止するまでコストが発生します。

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

さらに、EventBridge Scheduler は 月間 14,000,000 回の起動までは追加費用が発生しない という利点もあります。

この投稿では、EventBridge Scheduler を使用する方法を具体例とともに解説します。

EC2 インスタンスの起動

テスト用に EC2 インスタンスを起動するには、<SECURITY_GROUP_IDS><SUBNET_ID> を実際の値に置き換え、以下のコマンドを実行します。

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 リソースの作成

スケジューリングに必要なリソースをプロビジョニングするには、以下の 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-*

CloudFormation スタックをデプロイするには、<INSTANCE_ID> を実際のインスタンス ID に置き換え、以下を実行します。

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

テスト

プロビジョニングされた EventBridge Scheduler は、午前 7 時に EC2 インスタンスを起動し、午後 10 時に停止 します。

スケジュールを変更する必要がある場合は、CloudFormation スタックをデプロイする際に ScheduleStartExpression および ScheduleStopExpression パラメータを更新してください。

インスタンスが期待通りに起動および停止されていることを、EC2 ダッシュボードや AWS CLI コマンドを使って確認してください。

クリーンアップ

不要な料金を回避するために、以下のコマンドを実行してプロビジョニングされたリソースを削除します。

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

まとめ

EventBridge Scheduler は、特に 開発およびテスト環境 において、24 時間稼働が必要ないインスタンス管理を自動化する効率的なツールです。

また、他の AWS サービスにも拡張して、バックアップ、データ処理、スケジュールされたメンテナンスなどの定期タスクを自動化できます。

このコスト削減の自動化を実装することで、AWS リソースの管理をより適切に行い、運用負担を軽減できます。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

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