🐥

Amazon EventBridge Scheduler を CLI から操作する

2023/03/31に公開

EventBridge Scheduler とは

これまで、EventBridge Rules (その昔は CloudWatch Events でしたね) をトリガにするのが定番だった、AWS 操作のスケジューリングですが、2022年末に、Amazon EventBridge Scheduler という新しい選択肢が増えました。

従来からの EventBridge Rules も引き続き利用可能ですが、今後は 新しい EventBridge Scheduler の利用が中心になると思われます。

この記事では、(あえて) AWS CLI から、EventBridge Scheduler の操作を試してみます。

なお、以下内容は、(当然ながら) AWS の リファレンス でも網羅されている内容です。AWS CLI からの操作、という観点に絞っているため、CLI 操作の概要に興味がない場合や、詳細については、適宜公式リファレンスを参照いただければと思います。

なお、取り上げる CLI のリファレンス (v2) はこちらになります。

これまでの CloudWatch や、EventBridge のサブコマンド内に増えたのではなく、新しく scheduler という サブコマンドを独立させていることから、EventBridge という共通の名前は冠していても、新しく別サービスとして設計し直した感が伝わってきますね。(考え過ぎでしょうか?)

やってみる : スケジュールを作成する

さて、早速スケジュールを作成します、と言いたいところですが、スケジュールの作成前に、「スケジュールグループ」を作成します。

「スケジュールグループ」については、リファレンスに、以下のように触れられています。

CloudWatchメトリクスを表示するスケジュールのセットです。まだグループを作成していない場合、 EventBridge Schedulerdefault はスケジュールをグループに関連付けます。

個々のスケジュールではなく、複数のスケジュールをまとめたメトリクスを把握したい、といった要件がある場合、もともと存在する "default" グループに所属させるのではなく、明示的に グループを作成した上で スケジュールを所属させる必要がありそうです。

  • create-schedule-group で、スケジュールグループを作成します。
$ aws scheduler create-schedule-group --name sample-group --region ap-northeast-1
{
    "ScheduleGroupArn": "arn:aws:scheduler:ap-northeast-1:999999999999:schedule-group/sample-group"
}

タグなども指定できますが、割愛しています。

作成したスケジュールグループは、マネジメントコンソールから以下のように確認できました。

  • create-schedule で、スケジュールを作成します。

※スケジュール が対象リソースを操作するためのロールや、対象リソースは、あらかじめ作成してあるものとします。

$ aws scheduler create-schedule --name sample-schedule --group-name sample-group --schedule-expression "cron(0 17 * * ? *)" --schedule-expression-timezone "Asia/Tokyo" --flexible-time-window '{ "Mode": "OFF"}' --target '{"RoleArn": "arn:aws:iam::999999999999:role/EC2StopStartRole", "Arn": "arn:aws:scheduler:::aws-sdk:ec2:stopInstances", "Input": "{\"InstanceIds\" : [\"i-1234567890abcdefg\"] }" }' --region ap-northeast-1
{
    "ScheduleArn": "arn:aws:scheduler:ap-northeast-1:999999999999:schedule/sample-group/sample-schedule"
}

指定するパラメータ中、target の値は、複数の値を含めるような json で記載する必要があり、多少面倒です。
API を指定する Arn や、実行時のロールを指定する RoleArn は、混乱しづらいですが、API の引数として 渡すことになる Input の書式は、叩く API 毎に 異なると思われるため、初回指定時には、多少試行錯誤が必要かもしれません。

作成したスケジュールは、マネジメントコンソールから以下のように確認できました。

また、適切な ロールを関連付けることで、今回の場合、EC2 停止のアクションが指定時刻に実施されることを確認できました。

やってみる : スケジュールを削除する

  • delete-schedule で、スケジュールを削除します。
aws scheduler delete-schedule --name sample-schedule --group-name sample-group --region ap-northeast-1

スケジュールの削除の場合には、戻りの 出力は特に何もありません。
なお、"name" の指定のみで良いかと思いきや、default 以外の グループに作成した場合には、明示的に グループ名を指定する必要があるようです。

グループ名を指定せずに実行した場合、以下のようなエラーになりました。

An error occurred (ResourceNotFoundException) when calling the DeleteSchedule operation: Schedule sample-schedule does not exist.

ちなみに、個々のスケジュールの ARN は、以下のようになっています。

arn:aws:scheduler:ap-northeast-1:999999999999:schedule/sample-group/sample-schedule

グループを介した階層構造になっているので、別グループであれば、名称が重複したスケジュールの作成を許容するようになっているのかもしれませんね。

  • delete-schedule-group で、スケジュールグループを削除します。
aws scheduler delete-schedule-group --name sample-group --region ap-northeast-1

スケジュールグループの削除の場合にも、戻りの 出力は特に何もありません。
ちなみに、もともと存在する "default" スケジュールグループは、削除の操作ができないようになっているようです。

その他のCLI

上記では取り上げませんでしたが、EventBridge Scheduler では、以下の CLI も用意されています。

CLI 用途
Schedule 操作
update-schedule スケジュールを更新します。
list-schedules スケジュールの一覧を取得します。
get-schedule スケジュールの内容を取得します。
Schedule Group 操作
list-schedule-groups スケジュールグループの一覧を取得します。
get-schedule-group スケジュールグループを取得します。
Tag 操作
list-tags-for-resource リソースに対するタグの一覧を取得します。
tag-resource リソースにタグ付けします。
untag-resource リソースに付いたタグを外します。

定型的な命名規則なので、他の AWS CLI に馴染んでいる方には、わかりやすい内容かと思います。

そもそも CLI が登場する場面ってあるの?

さて、ここまで説明してきましたが、そもそも、EventBridge Scheduler を CLI で 操作する場面はあるのでしょうか?(今更!)
AWS の他のリソース同様、EventBridge Scheduler も、マネジメントコンソールでの GUI 操作や、CloudFormation などでの IaC (Infrastructure as Code) による操作が可能です。

一時的な操作であれぱ、マネジメントコンソール での操作がわかりやすいでしょう。
あるいは、定期的なイベントの作成を、イベントの対象リソース(今回の場合、EC2 インスタンスなど)と一緒に管理したいなどの場合、CloudFormation の同一テンプレートに含めることで管理しやすくなる、などの使い分けもできそうです。
EventBridge Scheduler に限らず、使い易い道具を、その場に応じて使い分けられるように、どのやり方にも習熟できるとよいですね。

AWS CLI の用途としては、この間 ( マネコン と Cfn の間 ) に位置するような場合に、メリットが見いだせるかもしれません。

思い付きですが、例えば、以下のような場合です。

  • 「大晦日など特定のタイミングに EC2 インスタンスを停止する」など、定期的ではなく、1回限りのイベントを時間指定で作成したい場合
  • 「退職した ユーザーの WorkSpaces をXX営業日後の0:00に無効化する」など、1回限りのイベントだが、何度も発生するイベントを作成したい場合

ただ、上記のような場合も、「特定のタイミング」にさほどこだわらないのであれば、スケジューリングせず 手動運用することも可能でしょう。
運用上のイベントが、どれだけ厳密に「スケジュール」に縛られるか?などによって、EventBridge Scheduler が有用なケースかどうか、が変わってくるように思います。

まとめ

AWS CLI で、EventBridge Scheduler の操作を試してみました。
今後、EventBridge Rules に代わって、スケジュール実行時の第一選択肢になると思われるサービスなので、まずは、EventBridge Scheduler に慣れて、活用できるようにしたいですね。

興味をお持ちの読者の皆様は、すでにご存じかと思いますが、類似サービスの使い分けについては、クラスメソッド quiver さんの下記記事に詳しくまとめられているので、ぜひ参照してみてください。

Discussion