Amazon EventBridgeでスケジュールを有効化・無効化！（おまけ付き）

# はじめに
　以下の記事でAmazon EventBridge Schedulerの有効化・無効化を行いました。この有効化・無効化をEC2の状態で変更したいです。例えば、EC2が起動したら有効化、EC2が停止したら無効化、というように。
　しかも、人の手を介さずに自動で行いたいです。

https://qiita.com/ta__k0/items/922424a6acb024147a03

# アーキテクチャ
　さて、どうしたものか。単純に考えると、こんな感じでしょうか。

![名称未設定-eventbridge.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/c8519710-da87-9d90-0626-9c01afcc5682.png)

　定期的にLambdaを実行
　　→　EC2の状態を確認
　　　　→　Amazon EventBridge Schedulerを有効化/無効化

　ということは考えられますが、Lambdaの費用は発生しますし、イベント駆動ではないですね。もっとシンプルにEC2の状態が変わった時に処理したい、そんなあなたにAmazon EventBridgeのイベントパターンを持つルールです。

![名称未設定-ページ5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/bdcd87f2-98eb-14c6-1742-9efb1fe5457e.png)

# Amazon EventBridgeとは
　AWSサービス、独自アプリケーション、Software as a Service (SaaS) アプリケーションのデータの変更を検知して、次の処理へ繋ぐサービスになります。EventBridgeにもいくつか機能がありますが、今回はルールを使用します。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-what-is.html

## Amazon EventBridge Rules
　ルールはイベントパターンと呼ばれるイベントの構造、またはスケジュールのいずれかに基づいて、イベントを次の処理（ターゲット）へ繋げます。今回でいうと、EC2の状態変化に伴うイベントが、「EC2起動」状態かというルールに合致した際に、Amazon EventBridge Schedulerを有効化する、という流れになります。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-rules.html

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns.html

:::note alert
「Amazon EventBridgeのイベントパターン」のページに記載がありますが、イベントによってAWSリソースの自動修復するような仕組みを使った場合でバグっていると無限ループになるので、気をつけてね、とありました。気をつけましょう。。利用料の閾値超過のアラーム設定は忘れずに！
:::

# やってみる
　では、実際にやってみます。実現する内容は「EC2が起動したら、スケジュールを有効化する」です。

## ルール設定
 　Amazon EventBridgeのページより、左メニューの「バス」-「ルール」を選択後、「ルールを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/569cab54-b478-8553-6f6a-e16a1b59774a.png)

### ルールの詳細
　次にルールの名前、イベントバス（今回は、default）、ルールタイプ「イベントパターンを持つルール」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/dd5e4e16-699c-1460-8eb4-c25ae69c26d8.png)

### イベントソース
　次にイベントソースで「AWSイベントまたはEventBridgeパートナーイベント」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/a85ad123-6be9-1818-e743-11c73002f946.png)

　イベントソースの下の欄には、サンプルイベント - オプションがあります。ここでAWSイベント等を確認することができます。

![スクリーンショット 2023-03-16 18.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/1139b77a-e433-e3f6-13bc-61139e6bf9de.png)
　
　例えば、EC2のイベントを選択すると以下のように確認することができます。これ便利です。どうやって設定したら良いかわからない時は、これですね。

![スクリーンショット 2023-03-16 18.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/cb959f8b-cad9-6622-bbb2-669c7ed44fca.png)

### 作成のメソッド
　今回は、「パターンフォームを使用する」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/d6b7b3f0-d01c-9f75-5231-35703a201d5d.png)

### イベントパターン
　次にイベントパターンでイベントソース、イベントタイプ、状態、対象を選択することで、右枠に表示されるようにイベントパターンを作成することができます。めっちゃ簡単です。

![スクリーンショット 2023-03-16 18.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/52426c41-0425-eddf-ca42-f901fc824b86.png)

　イベントソースとして「AWSのサービス」を選択すると、サービスの選択肢がながーくでてきます。EventBridgeパートナーを選択しても数多くのサービスが選択できます。使いたいものがあるか見てみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/7120673a-1b75-f2ed-0d6d-8100f0941e06.png)

　イベントタイプについては、EC2の状態をトリガーにしたいので、今回は「EC2 Instance State-chage Notification」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/34b74f29-edf0-e331-1da6-bafba1652cab.png)

　さらに、特定の状態を選択できまして、状態の一覧が出てきます。複数選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/f9e5485f-29d3-c0fe-eddc-7a70df8c9765.png)

　最後は、トリガーとしたいインスタンスを設定します。これだけでできるとは。

### ターゲット
　次にターゲットの設定を行います。ターゲットは複数設定もできますが、今回は1つだけ設定します。複数設定する場合は、１番下に「別のターゲットを追加」というボタンがありますので、クリックして追加してください。

　今回は、以下の記事で作成したAWS Systems Manager Automationのドキュメントをターゲットとします。

https://qiita.com/ta__k0/items/922424a6acb024147a03

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/ed22d317-3f30-dc77-fac2-b9062b328285.png)



### タグ

　必要に応じてタグを追加してください。

![スクリーンショット 2023-03-16 19.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/89ad3d90-8446-b4ee-3687-6b12b1d85a0d.png)

### レビューと作成
　最後に設定内容を確認して、「ルールの作成」をクリックして、完成です。

![スクリーンショット 2023-03-16 19.07.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/034d0087-ee9d-928e-4e72-3181c27b7cb2.png)

### できあがり
　ルールができあがりました。

![スクリーンショット 2023-03-16 19.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/86255ee2-5800-31f5-0557-198d31164687.png)


## 実行結果
　動作を確認してみます。まずは、有効化するAmazon EventBridge Schedulerのスケジュールの状態が「無効」であることを確認します。

![スクリーンショット 2023-03-16 19.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/e1e9270e-4179-a5e3-4b71-060a9f22dd06.png)

　次にトリガーとなるEC2を起動します。
![スクリーンショット 2023-03-16 19.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/4df8cfbc-a952-f832-c1f8-dd7c969e546c.png)

　停止状態から起動！
![スクリーンショット 2023-03-16 19.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/d31fbdde-335b-77bc-0d5b-c731ab44dda3.png)

　起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/a67fecd3-8161-f564-8843-7b4a4c531506.png)

　無事、有効化されました！めでたしめでたし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/d43c320a-3ce5-9f59-01a7-df6535f693cb.png)


# まとめ
　単純に考えると、LambdaとEventBridgeで実現できそうなことがEventBridgeだけ実現できました。最初は、難しそうだなーと思っていたのですが、AWSマネジメントコンソール上でやってみると結構簡単でした。AWSのサービスを活用できれば、いろいろ便利になりますし、費用も低減できるので、どんどん活用したいですね。
　
# おまけ

　Amazon EventBridgeのルールを作成すると、なんとCloudFormationテンプレートが生成できるのです。
　ルールのページで生成したいルールを選択し、「CloudFormation テンプレート」より、JSONまたはYAMLを選択します。

![スクリーンショット 2023-03-16 19.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/95c300a1-c88c-8e65-b61e-38c608df6047.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/6a4c72f6-053a-1527-9615-95109c43d88d.png)

　YAMLを選択すると、以下が表示され、コピーまたはダウンロードが可能です。これまた便利ですね。

![スクリーンショット 2023-03-16 19.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/5eaca0ae-6211-7fc8-8e59-cc27a890e6c2.png)


## CloudFormation テンプレート
　
　ダウンロードしたテンプレートを載せておきます。（※一部、マスキング）

```yaml:EventBridgeRules.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template for EventBridge rule 'enable-scheduler'
Resources:
  EventRule0:
    Type: AWS::Events::Rule
    Properties:
      EventBusName: default
      EventPattern:
        source:
          - aws.ec2
        detail-type:
          - EC2 Instance State-change Notification
        detail:
          state:
            - running
          instance-id:
            - i-XXXXXXXXXX [EC2のインスタンスIDを指定します。]
      Name: enable-scheduler
      State: ENABLED
      Targets:
        - Id: Id17fc9703-d2e2-446a-9f7b-db3f50ca2c2b
          Arn: >-
            arn:aws:ssm:ap-northeast-1:[アカウントID]:automation-definition/ChangeStateEventBridgeScheduler:$DEFAULT
          RoleArn: >-
            arn:aws:iam::[アカウントID]:role/service-role/Amazon_EventBridge_Scheduler_LAMBDA [Automation実行用Role]
          Input: '{"SchedulerName":["execute-sync"],"State":["ENABLED"]}'

```