AWS_Cron式のワイルドカード

## 概要
- AWSのCloudWatchEventsでスケジュールをcron式で設定する際に詰まったので、Qiitaに残しておく

## 基本書式

- 例: 2017/1/1 11時11分に実行する場合
  
    ```
    11 11 1 1 ? 2017 
    ```
    - 左から` [分] [時] [日] [月] [曜日] [年]` 6つの必須フィールドでできている<br>※普通のcron式だと<font color="red">年</font>はないので注意
- それぞれのフィールドが取る値は下記のようになっている
    
    |フィールド|値|ワイルドカード|
    | :---: | :---: | :---: |
    | 分 | 0 - 59 | , - * / |
    | 時間 | 0 - 23 | , - * / |
    | 日 | 1 - 31 | , - * ? / L W |
    | 月 | 1 - 12 または JAN-DEC| , - * / |
    | 曜日 | 1 - 7  または SUN - SAT| , - * ? / L |
    | 年 | 1970 - 2199 | , - * / |

 
## ワイルドカード
### 種類
- CloudWatchEvensのルールのスケジュール式で使えるワイルドカードは全部で**7つ**
    
    |ワイルドカード|用途|
    |:--:|:--:|
    |,|同じフィールド内に複数の値を追加できる|
    |-|範囲を指定できる|
    |*|フィールドの持つ値を全てを含む|
    |/|増分指定ができる|
    |?|任意を意味する<br>使えるのは<font color="red">day-of-month(日)フィールド</font>か<font color="red">day-of-week(曜日)フィールド</font>|
    |L|月、または週の最終日を指定できる<br>使えるのは<font color="red">day-of-month(日)フィールド</font>か<font color="red">day-of-week(曜日)フィールド</font>|
    |W|◯日に一番近い平日を指定できる<br>使えるのは<font color="red">day-of-month(日)フィールド</font>|

## 使い方
- ワイルドカードの使い方について、例とともに書いていきます。

### 同じフィールド内に複数の値を追加できる( <font color="red">,</font> )
#### 例 : <font color="red">2000年と2017年</font>の<font color="red">1月と2月</font>の<font color="red">1日と10日と15日</font>の<font color="red">0時と12時</font>の<font color="red">1分と30分と59分</font>に実行
    
```
1,30,59 0,12 1,10,15 1,2 ? 2000,2017
```
### 範囲を指定できる( <font color="red">-</font> )
#### 例 : <font color="red">1980年から1990年</font>の<font color="red">(毎年)8月から10月</font>の<font color="red">(毎月)15日から20日</font>の<font color="red">(毎日)10時から13時</font>の<font color="red">(毎時)1分から5分</font>に実行
```
1-5 10-13 15-20 8-10 ? 1980-1990
```
### フィールドの持つ値を全てを含む( <font color="red">*</font> )
#### 例 : <font color="red">常</font>に<font color="red">毎分</font>実行
```
* * * * ? *
```
### 増分指定ができる( <font color="red">/</font> )
#### 例 : <font color="red">2000年から10年毎</font>に<font color="red">1月から2ヶ月毎</font>に<font color="red">1日から3日毎</font>に<font color="red">0時から5時間毎</font>に<font color="red">0分から15分毎</font>に実行
```
0/15 0/5 1/3 1/2 ? 2000/10
```
### 月、または週の最終日を指定できる( <font color="red">L</font> )
#### 例１ : <font color="red">毎月末最終日</font>の<font color="red">0時0分</font>に実行 
```
0 0 L * ? *
```
#### 例２ : <font color="red">毎週末最終日</font>の<font color="red">0時0分</font>に実行
```
0 0 ? * L *
```
### ◯日に一番近い平日を指定できる( <font color="red">W</font> )
#### 例 : <font color="red">毎月15日に最も近い平日</font>の<font color="red">0時0分</font>に実行
```
0 0 15W * ? *
```
- 上記cron式は15日が平日か土日かによって実行タイミングが下記のように変わる
    1. 15日が<font color="red">平日</font>の場合
        - <font color="red">15日</font>に実行される
    1. 15日が<font color="red">土曜日</font>の場合
        - 15日に最も近い平日は14日の金曜日なので、<font color="red">14日</font>に実行される
    1. 15日が<font color="red">日曜日</font>の場合
        - 15日に最も近い平日は16日の月曜日なので、<font color="red">16日</font>に実行される
        
### 任意を意味する( <font color="red">?</font> )
- おそらく曜日のところだけに毎回出てくる`?`にみなさん疑問をお持ちだったことでしょう。ここで解説します。
- 公式のドキュメントにも書いてありますがAWSのCron式には下記のような制限があります。
    
    ```
    Cron式の日フィールド及び曜日フィールドを同時に指定することはできません。 
    一方のフィールドに値を指定すると、
    もう一方のフィールドで ? (疑問符) を使用する必要があります。
    ```

    - ということでこれはもう**<font color="red">こういう決まり</font>**と覚えてください(笑<br>なので、日付を指定する場合は曜日に`?`、曜日を指定する場合は日付に`?`を必ず付けてください
   
#### 例１ : <font color="red">毎月</font>の<font color="red">1日</font>(曜日は問わない)の<font color="red">0時0分</font>に実行   
```
0 0 1 * ? *
```
#### 例２ : <font color="red">毎週</font>の<font color="red">日曜日</font>(日付は問わない)の<font color="red">0時0分</font>に実行   
```
0 0 ? * SUN *
```
### 最後に
- AWSのCloudWatchEventsのルールのスケジュールでCron式を設定する際に、ルール作成までしなくても、正しい設定の場合は、以降10回分の実行タイミングが表示されるので、試しにやってみるとわかりやすいと思います！