EventBridge Scheduler で EC2 の起動・終了をスケジューリング
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 スタックのデプロイ時に ScheduleStartExpression
と ScheduleStopExpression
を指定してください。
EC2 インスタンスが、想定通りに起動・停止していることをご確認ください。
クリーンアップ
以下のコマンドを使用して、プロビジョニングされた AWS リソースを削除してください。
aws ec2 terminate-instances --instance-ids <INSTANCE_IDS>
aws cloudformation delete-stack --stack-name ec2-scheduler
まとめ
開発用として一時的に EC2 を利用している場合、 EventBridge Scheduler でコストの削減が可能です。
EventBridge Scheduler は、 EC2 以外のサービスのアクションも実行可能なので、定期的メンテナンスの自動化等にも活用できます。
この投稿が、お役に立てば幸いです。