AWS EventBridge Scheduler:スケジュールに沿って EC2 を起動・停止する
Lambda を介さず、EventBridge Scheduler から EC2 API を直接呼び出し、cron スケジュールに従って EC2 インスタンスを起動・停止します。
EventBridge Scheduler を使えば、Lambda 関数を介さず、cron スケジュールに従って EC2 インスタンスを起動・停止できます。
構築
テスト用に 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>11〜16 行目の ScheduleStartExpression と ScheduleStopExpression パラメータで、スケジュールを cron 式として定義します。
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 スタックをデプロイします。
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 リソースを削除します。
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 です。別のタイムゾーンの営業時間に合わせる場合、このパラメータを明示的に設定しないと、意図した時刻とずれてインスタンスが起動・停止します。
関連記事
Session Manager で EC2 に接続する(SSH 不要)
Systems Manager の Session Manager を使い、SSH キーも踏み台サーバーもポート 22 の開放も不要な状態で EC2 インスタンスにシェルアクセスする方法を解説します。
PhpStorm と Xdebug で AWS EC2 上の PHP をリモートデバッグする
PhpStorm と Xdebug を使って EC2 上の PHP アプリケーションをリモートデバッグする方法を、サーバー側の php.ini の設定から IDE のパスマッピングまで解説します。
SSH ポートフォワーディングで EC2 Windows インスタンスに安全にアクセスする
プライベートサブネット内の EC2 Windows インスタンスに SSH 踏み台ホスト経由でアクセスし、RDP をパブリックインターネットに公開しない方法を解説します。
EC2 上で Proxy.py を軽量 HTTP プロキシとして動かす
認証機構を持たない Proxy.py を EC2 インスタンス上で動かし、SSH トンネル経由で安全にアクセスします。
aws-vault から Granted に移行した話
aws-vault の開発終了をきっかけに Granted へ移行しました。ロールの切り替えやコンソールの開き方の違いと、認証情報や既存の設定を引き継ぐ際の注意点をまとめます。
