Amazon EC2 の定期停止が Amazon EventBridge Scheduler によってより簡単になりました!

AWS

2022.11.14

Topics

新機能 EventBridge Schedulerについて

EventBridge に Scheduler という機能が追加されました。

Amazon EventBridge が新しいスケジューラを起動
本日、Amazon EventBridge Scheduler をリリースできることを嬉しく思います。開発者がスケジュールされたタスクを大規模に簡単に作成、実行、管理できるようにすることで、現在のスケジューリング機能を拡張します。
Amazon EventBridge Launches New Scheduler

この Scheduler で今まで Lambda 等を使って行っていた EC2 や RDS の定期停止が EventBridge Scheduler だけで完結するようになりました。
本記事では、その手順についてやってみたいと思います。

なお、EventBridge ルールとの比較については AWS Blog があるので以下ご覧ください。
Amazon EventBridge スケジューラーのご紹介 | AWS コンピューティング ブログ

今までの定期停止(Instance Scheduler)と違うところ

はじめに、軽く今までの定期停止について触れたいと思います。

今まで EC2 や RDS の定期停止を行う場合は、EventBridge を使用して Lambda を呼び出して処理するといったソリューションが一般的でした。
ですが、本アップデートによって EventBridge 単体で定期に API を呼び出しインスタンスを停止することが可能となりました。

定期停止するソリューションとしてAWSからは「Instance Scheduler」というものが紹介されています。
Lambda や DynamoDBを使ってEC2やRDSの起動・停止を自動的に行うソリューションとなっております。

詳細なソリューションについては以下をご覧ください。
AWS での Instance Scheduler | 実装 | AWS ソリューション

タグによって制御したり複雑な条件を指定する場合は「Instance Scheduler」みたいなアーキテクチャでないと実現できません。
しかし、単体のインスタンスを停止を停止する場合などやることがシンプルな場合はEventBridge Schedulerを選択したほうが楽です。

“クラウドアーキテクチャのベストプラクティス”

AWS運用のベストプラクティス

AWSインフラ運用にお困りの方必見!
[セミナー講演資料 公開]AWS運用の最適化をご紹介

・障害を考慮した設計
・オートスケールの仕組み・ポイント
・各レイヤーでセキュリティを確保する方法 など

やってみた

今回は EC2 をターゲットとしてインスタンス停止をしてみます。
なお、EC2 作成手順については割愛します。

IAM ロール作成

私の環境だけかもしれないですが、EventBridge Scheduler の画面から Role を新規作成できないので事前に作成します。

Role新規作成できない画面

以下、AssumeRole と「AmazonEC2FullAccess」をアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

こちらは後ほど EventBridge Scheduler を作成時に選択します。

スケジュール作成

コンソールから作成していきます。

EventBridge Schedulerコンソール画面
まずはスケジュールについて設定します。
今回は検証のため一回限りのスケジュールで設定します。

スケジュールパターンを入力する
実際に定期停止する場合は以下のように cron を選択します。
もし、該当時間を過ぎても使用したい場合は、スケジュールを無効化すれば停止しないようにできます。

定期実行する場合のCronスケジュール
次はターゲットを選択します。
EC2 を停止する API は「StopInstances」なので検索してそちらを選択します。

ターゲット選択画面
API を選択した状態でしたにスクロールすると、JSON 形式でインスタンス ID を設定可能です。
こちらは、事前に準備した EC2 のインスタンス ID を入力します。

インスタンスIDを入力する
最後にロールを先ほど作成したものを選択して設定は完了です。

ロールを選択する
あとは、時間になるまで待ちます。

停止確認

時間になったので、EC2 が停止したかを CloudTrail で確認します。
userAgent を見ると、EventBridgeScheduler から発行されているようです。
動作に問題はなく EC2 は停止していました。

    "eventTime": "2022-11-14T00:05:47Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StopInstances",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "18.211.2.198",
    "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.18.9 Linux/4.14.294-220.533.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/11.0.17+10-LTS Java/11.0.17 kotlin/1.3.72-release-468 (1.3.72) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-038b1755329a5487d"
                }
            ]
        },
        "force": false
    },

注意事項

EventBridge Scheduler を使ってみていくつか躓いたのでそちらを共有します。

ユーザドキュメントは EventBridge とは別に用意されている

EventBridge のユーザドキュメントから Scheduler を探しても見つからなかったです。
どうやら別のドキュメントとしてあるみたいです。

What is Amazon EventBridge Scheduler? – EventBridge Scheduler

Service 名も EventBridge と異なる

AssumeRole を作成する際にご注意ください。
EventBridge と EventBridge Scheduler で異なるため、「events.amazonaws.com」のロールを Scheduler で設定するとうまく動作しないです。

  • EventBridge Scheduler 用
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • EventBridge 用
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

まとめ

使ってみた感想ですが、UI 周りがとても使いやすくなっていることが素晴らしいなと思いました。
EventBridge ルールと違って API が呼び出せるので定期停止以外にもできることが多いのではないでしょうか。

また、インスタンスの定期停止はコスト削減に繋がります。
EventBridge Scheduler を使えば簡単に設定ができるので、開発環境やテスト環境で常時起動しているインスタンスに対して実施してみてはいかがでしょうか?

消費モデルを導入: 必要なコンピューティングリソースの費用のみを支払い、複雑な予測をすることなく、ビジネス要件に応じて使用量を増減できます。例えば、通常、1 週間の稼働日に開発環境とテスト環境を使用するのは、1 日あたり 8 時間程度です。未使用時にこのようなリソースを停止することで、コストを 75% 削減できる可能性があります (168 時間ではなく 40 時間になる)。
コスト最適化 – AWS Well-Architected フレームワーク

参考資料

Serverless Task Scheduler – Amazon EventBridge Scheduler – Amazon Web Services
Amazon EventBridge Launches New Scheduler
Introducing Amazon EventBridge Scheduler | AWS Compute Blog
AWS インスタンスの開始と停止を自動化する – AWS のインスタンス スケジューラ
AWS での Instance Scheduler | 実装 | AWS ソリューション

“クラウドアーキテクチャのベストプラクティス”

AWS運用のベストプラクティス

AWSインフラ運用にお困りの方必見!
[セミナー講演資料 公開]AWS運用の最適化をご紹介

・障害を考慮した設計
・オートスケールの仕組み・ポイント
・各レイヤーでセキュリティを確保する方法 など
Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら