AWS EventBridge Scheduler:スケジュールに沿って EC2 を起動・停止する

AWS EventBridge Scheduler:スケジュールに沿って EC2 を起動・停止する

Lambda を介さず、EventBridge Scheduler から EC2 API を直接呼び出し、cron スケジュールに従って EC2 インスタンスを起動・停止します。

Takahiro Iwasa
3 min read

EventBridge Scheduler を使えば、Lambda 関数を介さず、cron スケジュールに従って EC2 インスタンスを起動・停止できます。

構築

テスト用に EC2 インスタンスを起動します。

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

11〜16 行目の ScheduleStartExpressionScheduleStopExpression パラメータで、スケジュールを cron 式として定義します。

template.yaml
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 スタックをデプロイします。

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

テスト

このテンプレートでは、UTC に設定されたタイムゾーンを基準として、EventBridge Scheduler が 07:00 に EC2 インスタンスを起動し、22:00 に停止します。

クリーンアップ

次のコマンドで、この例で作成したすべての AWS リソースを削除します。

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

まとめ

2 つの EventBridge Scheduler スケジュールにより、ScheduleExpressionTimezone で選択したタイムゾーンの 07:00 に EC2 インスタンスを起動し、22:00 に停止できます。

この構成で Lambda 関数が不要なのは、arn:aws:scheduler:::aws-sdk:ec2:startInstances を指定して EC2 API を直接呼び出すためです。EventBridge Scheduler は AWS SDK の API 操作をターゲットにできるため、必要なのはスケジュールと、ec2:StartInstances および ec2:StopInstances を許可する IAM ロールです。

コスト削減を目的に運用する場合は、ScheduleExpressionTimezone を確認してください。テンプレートのデフォルト値は UTC です。別のタイムゾーンの営業時間に合わせる場合、このパラメータを明示的に設定しないと、意図した時刻とずれてインスタンスが起動・停止します。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.