AWS EventBridgeでのワイルドカード活用法まとめ

# はじめに
本記事では、EventBridgeでスケジュールルールを設定する際に使用するワイルドカードについて学んだ内容をまとめました。EventBridgeでスケジュールルールを作成する機会があり、どのようにすれば想定通りのスケジュールで実行されるルールを設定できるかを学んだので、その内容を整理しました。
ちなみに、作成したルールは1時間に3回実行する（毎時0分、20分、40分に実行する）ようなルールだったため、最初はrate式でやるかなと思ったんですが、最終的にはワイルドカードを使い、cron式で設定しました。

:::note warn
注意：EventBridgeで設定する時刻はUTCです。日本時間（JST）で想定した時刻に実行されるように値を設定してください。EventBrigdeでは設定したcron式が以後どのタイミングで実行されるか確認することができ、タイムゾーンもUTCとローカルタイムゾーンで切り替えることができるので、設定前にはそこで確認することをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/7b695e8b-0119-95a2-3e8b-fa4e861c50de.png)
:::

# 前提知識
EventBridgeではスケジュールされたルールを作成するとき、ルールを実行するタイミングを設定する方法には以下の2つがあります。
- cron式
- rate式

### cron式
イベントルールを実行したい時間や日時を定義します。
定義できる単位は、分 時間 日付 月 曜日 年で、この順番で指定します。
ワイルドカードを指定することで、定期実行されるルールを作成することもできます。AWSコンソールでは以下のような画面で設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/f3ad1f4d-9398-953f-6c45-a5f45ff647d7.png)

### rate式
イベントルールを実行したい間隔を定義します。
定義できる時間の単位は分、時間、日で、ルールを作成すると開始され、定義されたスケジュールに従って実行されます。AWSコンソールでは以下のような画面で設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/bf624a6f-e022-62c7-65f7-63cf722fabe2.png)

# cron式で使えるワイルドカード
## 制約事項
:::note warn
1つのcron式で日付と曜日の両方を指定することはできません。どちらかに何かしらの値を指定する場合は、もう片方は後述するワイルドカードの`？`を使う必要がある
:::

## `*`と`？`
`*`はフィールド内のすべての値が含まれます。また、`?`は任意の日付を指定するときに使用し、日付と曜日のフィールドでのみ使用できます。

例)毎時0分に実行されるルールを設定したいときのcron式
```
以下のどちらか（同じ意味）
分 時間 日付 月 曜日 年
0 * * * ? *
0 * ? * * *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/98c48012-cb49-67ac-ce4f-df18ac60a9ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/86a1199a-0b70-c4c9-b601-fe5f79fd8b3a.png)

## `,`
`,`はフィールドに複数の値を選択できます。

例）AM10時とPM3時に実行されるルールを設定したいときのcron式
```
分 時間 日付 月 曜日 年
0 10,15 * * ? *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/d26f4a23-1197-d1dc-ab78-dcc09aea5a55.png)

## `-`
`-`はフィールドで範囲を指定することができます。

例）月曜日から金曜日までのAM10時とPM3時に実行されるルールを設定したいときのcron式
```
分 時間 日付 月 曜日 年
0 10,15 ? * MON-FRI *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/8206ed36-4fbd-5578-d808-94d462535956.png)

## `/`
`/`は増分の間隔を指定できます。曜日以外のフィールドで使用でき、開始のタイミングとその後どのぐらい間隔で実行するかを指定できる。

例）毎日10:00から11:00まで10分間隔で実行されるルールを設定したい時のcron式
```
分 時間 日付 月 曜日 年
0/10 10 ? * * *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/d875df45-ff08-9282-1016-e25210ff36cb.png)

ちなみに、増分される間隔(/の後の数字)として、設定するフィールドの周期の基本となる値（分の場合60、時間の場合24）を割り切れない値にすると、割り切れなかった分は実行されません。
例えば、以下のように1月の間だけ0時から11時間間隔で毎日実行されるルールを作った場合、実行されるタイミングは以下のようになります。

```
分 時間 日付 月 曜日 年
0 0/11 ? 1 * *
```

- 1/1　0:00
- 1/1　11:00
- 1/1　22:00
- 1/2　0:00（余った2時間はカットされる）
- 1/2　11:00
以下続く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/8066c577-abf2-2571-e9b2-58b21e4953b2.png)


## `L`
`L`は日付と曜日でのみ使用でき、日付で使用すると月の最終日、曜日で使用すると土曜日を指定する(SATと同じ)ことを表すcron式になります。

例）毎月の最終日の10時に実行されるルールを設定したいときのcron式
```
分 時間 日付 月 曜日 年
0 10 L * ? *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/33025f97-c0e2-da56-c3c7-2da163be3c7e.png)


## `W`
`W`は日付でのみ使用できます。`数字W`のように指定することで、指定した数字の日にちに最も近いweekday（月曜日から金曜日の間の曜日）を指定できます。指定した日が土曜日であれば前日の金曜日、指定した日が日曜日であれば翌日の月曜日を指定するcron式になります。

例）毎月最初の営業日の10時に実行されるルールを設定したいときのcron式
```
分 時間 日付 月 曜日 年
0 10 1W * ? *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/9c184a4e-013e-61b9-2c25-7ca02751048c.png)


## `#`
`#`は曜日でのみ使用できる。`数字#数字`のように指定することで、その月の第◯曜日を指定できる

例）毎月第一月曜日の10時に実行されるルールを設定したいときのcron式
```
分 時間 日付 月 曜日 年
0 10 ? * 2#1 *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/4af2e7bf-c560-1bb9-dbfb-1c4698e410c5.png)

ちなみに◯#5を指定すると、第5週目にその曜日がある日付のみが指定され、その曜日の第5週目がない月はスキップされる。もちろん6以上は指定しても意味がないので注意。

```
0 10 ? * MON#5 *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/bd6fc8ae-9563-ac5d-8dc1-ae1e2c6e1500.png)

```
0 10 ? * MON#6 *
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/a100638d-b1a4-84e4-c16e-b230228bc390.png)

# 参考
https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html