EventBridge Scheduler を使った EC2 インスタンススケジューリングの自動化
はじめに
多くの 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! 🚀